文章目录

  • 前言
  • 一、所需材料
    • 1、硬件
    • 2、软件
    • 3、接线
  • 二、Arduino部分
    • 1、库函数引入
    • 2、选择开发板
    • 3、代码
    • 4、演示视频
  • 三、使用说明
    • 1、项目方案
    • 2、页面切换
    • 页面设计

前言

这也是帮人做的毕设之一,功能完善,资料也完备,相对以往代码写的规范,代码相对以往变得更加简洁好看,视频也有录制。
项目下载链接

一、所需材料

1、硬件

HC-SR04超声波测距模块
带IIC转换板LCD1602
JQ8400FL10P语音模块
UNO R3开发板
三色LED灯
LCD1602 IIC
积木按键
小面包板
木板若干
杜邦若干

2、软件

Arduino IDE
微信语音合成小程序

3、接线

RGB三色彩灯接线

UNO
R 4
G 5
B 6

超声波传感器接线

超声波传感器 UNO
Tr 2
Ech 3

JQ8400语音模块

JQ8400 UNO
7 ONE LINE

按键接线

按键 UNO
OUT A0

LCD1602接线

LCD1602 UNO
SDA SDA
SCL SCL

二、Arduino部分

1、库函数引入

2、选择开发板

3、代码

#include <Wire.h>
#include <LiquidCrystal_I2C.h>LiquidCrystal_I2C lcd(0x27, 16, 2); //0x27#define TrigPin 2
#define EchoPin 3
float distance;
int alarmvalue = 6; //设置初始警报值为15cm
#define BUF_LEN 10
char Dis_Buf[BUF_LEN];//LED灯
#define rled  4 //红灯io
#define yled  5 //黄灯io
#define gled  6 //绿灯io
//语音模块
#define SDAPin 7 //语音模块onewrite io#define RLED_Read digitalRead(rled)
#define YLED_Read digitalRead(yled)
#define GLED_Read digitalRead(gled)//按键变量
int adc_key_val[5] = {30, 80, 165,  350, 500 };
int NUM_KEYS = 5;
int adc_key_in;
int key = -1;
int oldkey = -1;boolean Page;
#define Home    true
#define Setting false
boolean Dis_Sta;
#define Safe    true
#define Alarm   false#define S1 0
#define S2 1
#define S3 2
#define S4 3
#define S5 4unsigned long Timing = 0; //用于定时读取void setup()
{ // 初始化串口通信及连接SR04的引脚Serial.begin(9600);lcd.init();lcd.backlight();pinMode(TrigPin, OUTPUT);// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态pinMode(EchoPin, INPUT);pinMode(SDAPin, OUTPUT);pinMode(rled, OUTPUT);pinMode(yled, OUTPUT);pinMode(gled, OUTPUT);digitalWrite(rled, LOW);digitalWrite(yled, LOW);digitalWrite(gled, LOW);Dis_Sta = Safe;Page = Home;Home_Page();
}void loop()
{switch (Page) {case Home:if (millis() - Timing >= 300) {Timing = millis();Get_Distance();     //测距if (distance < alarmvalue) {  //小于安全距离if (Dis_Sta == Safe) {      //上一次为安全距离,这次为过近距离Dis_Sta = Alarm;//警告界面,语音播报lcd.clear();Alarm_Page();//语音播报say_control();LED_ON();} else {                    //上一次依然是过近距离LED_REVERSE();            //反转LED状态,达到闪烁的效果}} else {                      //安全距离if (Dis_Sta == Alarm) {LED_OFF();Dis_Sta = Safe;lcd.clear();Home_Page();}uint8_t integer = distance * 100 / 100;uint8_t decimal = int(distance * 100) % 100;snprintf(Dis_Buf, BUF_LEN, "%02d.%02d", integer, decimal);lcd.setCursor(4, 1);lcd.print(Dis_Buf);Serial.print("Dis_Buf: ");Serial.println(Dis_Buf);}}Home_Ctrl();    //Home_Page下的按键控制break;case Setting:Setting_Ctrl(); //Setting_Page下的按键控制break;}
}/*0123456789012345"    Distance:   ""    xx.xx cm    "
*/
void Home_Page() {lcd.setCursor(4, 0);lcd.print("Distance:");lcd.setCursor(10, 1);lcd.print("cm");
}void Home_Ctrl() {adc_key_in = analogRead(0);   // 读取模拟A0数值key = get_key(adc_key_in);    // 转化成按键if (key != oldkey) {delay(50);                  //等待反弹时间adc_key_in = analogRead(0); // 读取模拟口A0数值key = get_key(adc_key_in);  // 转换成按键if (key != oldkey) {oldkey = key;if (key > 0) {if (key = S5) {         //5#按键进入设置界面Serial.println("S5 OK");Page = Setting;lcd.clear();Setting_Page();}}}}
}/*0123456789012345"The setting page""  alarm: xx cm  "
*/
void Setting_Page() {lcd.setCursor(0, 0);lcd.print("The setting page");//lcd.setCursor(2, 1);lcd.print("alarm:");LCD_Setting_Num();lcd.setCursor(12, 1);lcd.print("cm");
}void Setting_Ctrl() {adc_key_in = analogRead(0);   //读取模拟A0数值key = get_key(adc_key_in);    //转化成按键if (key != oldkey) {delay(50);                  //等待反弹时间adc_key_in = analogRead(0); //读取模拟口A0数值key = get_key(adc_key_in);  //转换成按键if (key != oldkey) {oldkey = key;if (key > 0) {switch (key) {case S1:alarmvalue += 1;LCD_Setting_Num();break;case S2:alarmvalue += 1;LCD_Setting_Num();break;case S3:alarmvalue -= 1;LCD_Setting_Num();break;case S4:alarmvalue -= 1;LCD_Setting_Num();break;case S5:Page = Home;lcd.clear();Home_Page();break;}}}}
}void LCD_Setting_Num() {snprintf(Dis_Buf, BUF_LEN, "%02d", alarmvalue);lcd.setCursor(9, 1);lcd.print(Dis_Buf);
}/*0123456789012345"The distance is ""   too short    "
*/
void Alarm_Page() {lcd.setCursor(0, 0);lcd.print("The distance is");lcd.setCursor(3, 1);lcd.print("too short");
}void Get_Distance() {// 产生一个10us的高脉冲去触发TrigPindigitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(10);digitalWrite(TrigPin, LOW);// 检测脉冲宽度,并计算出距离distance = pulseIn(EchoPin, HIGH) / 58.00;Serial.print(distance);Serial.println("cm");
}// 将ADC值转换为键数
int get_key(unsigned int input) {int k;for (k = 0; k < NUM_KEYS; k++) {if (input < adc_key_val[k]) {return k;}}if (k >= NUM_KEYS)k = -1;  // 没有按下有效的键return k;
}//发送语音模块串口指令函数
void S(bool s) {digitalWrite(SDAPin, s);
}void sendData(unsigned char addr) {S(1);delayMicroseconds(1000);S(0);delayMicroseconds(3200);for (int i = 0; i < 8; i++) {S(1);if (addr & 0x01) {delayMicroseconds(600);S(0);delayMicroseconds(200);} else {delayMicroseconds(200);S(0);delayMicroseconds(600);}addr >>= 1;}S(1);
}//语音指令
void say_control() {sendData(0x11);//发送语音指令delay(2200);//语音时长
}void LED_ON() {digitalWrite(rled, HIGH);digitalWrite(yled, HIGH);digitalWrite(gled, HIGH);
}void LED_OFF() {digitalWrite(rled, LOW);digitalWrite(yled, LOW);digitalWrite(gled, LOW);
}void LED_REVERSE() {digitalWrite(rled, !RLED_Read);digitalWrite(yled, !YLED_Read);digitalWrite(gled, !GLED_Read);
}

4、演示视频

bilibili链接

三、使用说明

1、项目方案

功能1:(坐姿提醒)
使用超声波模块检测距离,当坐姿不端时,测距小于标准距离,语音提示,有灯光提示,屏幕文字显示提醒
功能2:(调节报警距离)
屏幕实时显示当前的测距,按键可以调节报警距离

功能3:
自定义语音提示

2、页面切换

各页面切换实现方法:
主界面:
显示距离
距离过小进入报警界面
S5进入设置界面

设置界面:
按键控制±,
S5返回主界面

报警界面:
怎么返回
测距大于安全距离则返回

小于安全距离且原本为安全时
警告界面
小于安全距离且原本时警告界面时
不作反应
大于安全距离且原本为安全时
不做反应
大于安全距离且原本为警告界面时
返回主页

页面设计

功能介绍:

  1. LCD共有三个界面
     主界面(Home_Page)
     警报界面(Alarm_Page)
     设置界面(Setting_Page)

  2. 主界面
     在主界面之下,时刻显示着当前超声波传感器的读值
     Distance:
     xx.xx cm

  3. “设置界面”
     在设置界面时刻显示着当前的警报设置距离
     The setting page
     alarm:xx cm

  4. “警报界面”
     The distance is
     Too short

按键使用:
 S1 :可进入设置状态
 S2 :可增加设置距离
 S3 :可减少设置距离
 S4 :可减少设置距离
 S5 :可自由切换两个页面

【Arduino】坐姿检测器相关推荐

  1. 【MQ-3 酒精检测器与 Arduino检测酒精】

    MQ-3 酒精检测器与 Arduino检测酒精 前言 MQ-3 酒精传感器引脚 MQ-3 酒精传感器模块组成 MQ-3 酒精传感器模块如何工作? 如何使用 MQ-3 传感器检测酒精? 如何使用 MQ- ...

  2. arduino液位传感器_Arduino 水位检测器/传感器

    水位传感器砖设计用于水位检测,可广泛应用于检测降雨,水位,甚至液体泄漏. 将水位传感器连接到Arduino是检测泄漏,溢出,洪水,雨水等的好方法.它可用于检测水的存在,水位,体积以及是否缺水.当这个用 ...

  3. 使用Arduino制作震动检测器

    传感器 这里展示的设备是迄今为止世界上最小的地震传感器. 它的最重要特征之一是,它通过INT1引脚发出信号,指示可能对电子设备造成破坏性影响的地震事件. 例如,这种功能允许在振动可能实际上造成这种损坏 ...

  4. 和12岁小同志搞创客开发:手撕代码,做一款温湿度检测器

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  5. arduino 上传项目出错_Arduino多核编程:简单例子

    不管你是Arduino领域的新手还是经验丰富的开发人员,很可能你还只使用过单核在进行编程. 这没有什么好笑的---- 事实上,直到几天前我才使用Arduino IDE进行了第一次多核编程. 我和所有其 ...

  6. arduino绘图_如何使用Arduino构建绘图仪

    arduino绘图 回到学校后,在科学系的一个壁橱里藏着一台HP绘图仪. 我玩了一段时间,一直想拥有自己的一个. 快进很多年. 步进电机很容易买到,我又开始使用电子设备和微控制器做事,最近我看到有人用 ...

  7. arduino液位传感器_如何使用Arduino + VL53L0X来制作液位感应设备

    在本篇文章中,您将学习到如何使用Arduino开发板.OLED显示屏和VL53L0X传感器模块制作非接触式液位感应设备.该感应器设备能够检测任何种类的容器中的液位! 液位测量的不同方法 大多数时候,工 ...

  8. Arduino + GP2D12红外测距传感器+LCD1602

    一: GP2Y0A21YKIR Sensor是日本夏普公司推出的一款性价比高.最常用的红外测距传感器.其与GP2D12测量射程相同,但探测面积略有增加,可用来对物体的距离进行测量,实现轮式机器人的避障 ...

  9. 毕业设计 单片机心率检测器设计与实现 - stm32

    文章目录 1 简介 2 主要器件 3 实现效果 4 设计原理 4.1 MAX30102 模块 4.2 心率检测的基本原理 4.2.1 PPG光电容积法 4.2.2 心电信号测量法 5 部分实现代码 6 ...

最新文章

  1. 详细分析本机号码一键登录原理
  2. Gitlab+Gerrit+Jenkins完整对接
  3. iphone彻底删除照片如何恢复_如何把删除的照片恢复?轻松解决恢复问题!
  4. python大神的成长之路_我的Python成长之路
  5. IaaS、PaaS和SaaS的区别
  6. SuperMap iServer安装过程详解
  7. 【重构笔记04】重新组织数据(2)
  8. openssl--生成RSA公钥和私钥
  9. HTML5 播放视频代码
  10. 知乎爬虫与数据分析(一)数据爬取篇
  11. cf为什么一直连接服务器失败,为什么cf连接服务器失败的解决方法
  12. 无声交流的读心术,正在剥夺我们的沟通能力
  13. GIS学习教程资料整理
  14. QQ游戏图标熄灭大全
  15. 如何学习数据分析(总结自网易及B站up主)
  16. wlacm 骑马修栅栏 (图的遍历)题解
  17. java实习生面试题总结
  18. 聚合支付源码怎么选择
  19. Jetson Nano目标检测手把手实战教程(pytorch训练、tensorrt推理,含完整代码和数据)
  20. 【实验报告】实验五 继承的应用

热门文章

  1. Visio中图形关于轴线对称
  2. 华为荣耀4X反复重启且无法进入recovery模式
  3. 不同 frame 之间调用 js 函数
  4. python爬虫requests源码链家_python爬虫爬取链家二手房信息
  5. C语言中判断一个三位数是否是水仙花数,判断三位数是否为水仙花数
  6. iPad上支持手柄的游戏推荐 - PUSDN
  7. 兴趣爱好选择程序java+Swing界面
  8. android 图案解锁忘记了,安卓手机忘记图形解锁、锁屏密码的解决方法
  9. Python-matplotlib用法
  10. JAVA网易云热评接口_网易云音乐热评爬虫(一): 反编译加密参数