【Arduino】坐姿检测器
文章目录
- 前言
- 一、所需材料
- 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返回主界面
报警界面:
怎么返回
测距大于安全距离则返回
小于安全距离且原本为安全时
警告界面
小于安全距离且原本时警告界面时
不作反应
大于安全距离且原本为安全时
不做反应
大于安全距离且原本为警告界面时
返回主页
页面设计
功能介绍:
LCD共有三个界面
主界面(Home_Page)
警报界面(Alarm_Page)
设置界面(Setting_Page)主界面
在主界面之下,时刻显示着当前超声波传感器的读值
Distance:
xx.xx cm“设置界面”
在设置界面时刻显示着当前的警报设置距离
The setting page
alarm:xx cm“警报界面”
The distance is
Too short
按键使用:
S1 :可进入设置状态
S2 :可增加设置距离
S3 :可减少设置距离
S4 :可减少设置距离
S5 :可自由切换两个页面
【Arduino】坐姿检测器相关推荐
- 【MQ-3 酒精检测器与 Arduino检测酒精】
MQ-3 酒精检测器与 Arduino检测酒精 前言 MQ-3 酒精传感器引脚 MQ-3 酒精传感器模块组成 MQ-3 酒精传感器模块如何工作? 如何使用 MQ-3 传感器检测酒精? 如何使用 MQ- ...
- arduino液位传感器_Arduino 水位检测器/传感器
水位传感器砖设计用于水位检测,可广泛应用于检测降雨,水位,甚至液体泄漏. 将水位传感器连接到Arduino是检测泄漏,溢出,洪水,雨水等的好方法.它可用于检测水的存在,水位,体积以及是否缺水.当这个用 ...
- 使用Arduino制作震动检测器
传感器 这里展示的设备是迄今为止世界上最小的地震传感器. 它的最重要特征之一是,它通过INT1引脚发出信号,指示可能对电子设备造成破坏性影响的地震事件. 例如,这种功能允许在振动可能实际上造成这种损坏 ...
- 和12岁小同志搞创客开发:手撕代码,做一款温湿度检测器
机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...
- arduino 上传项目出错_Arduino多核编程:简单例子
不管你是Arduino领域的新手还是经验丰富的开发人员,很可能你还只使用过单核在进行编程. 这没有什么好笑的---- 事实上,直到几天前我才使用Arduino IDE进行了第一次多核编程. 我和所有其 ...
- arduino绘图_如何使用Arduino构建绘图仪
arduino绘图 回到学校后,在科学系的一个壁橱里藏着一台HP绘图仪. 我玩了一段时间,一直想拥有自己的一个. 快进很多年. 步进电机很容易买到,我又开始使用电子设备和微控制器做事,最近我看到有人用 ...
- arduino液位传感器_如何使用Arduino + VL53L0X来制作液位感应设备
在本篇文章中,您将学习到如何使用Arduino开发板.OLED显示屏和VL53L0X传感器模块制作非接触式液位感应设备.该感应器设备能够检测任何种类的容器中的液位! 液位测量的不同方法 大多数时候,工 ...
- Arduino + GP2D12红外测距传感器+LCD1602
一: GP2Y0A21YKIR Sensor是日本夏普公司推出的一款性价比高.最常用的红外测距传感器.其与GP2D12测量射程相同,但探测面积略有增加,可用来对物体的距离进行测量,实现轮式机器人的避障 ...
- 毕业设计 单片机心率检测器设计与实现 - stm32
文章目录 1 简介 2 主要器件 3 实现效果 4 设计原理 4.1 MAX30102 模块 4.2 心率检测的基本原理 4.2.1 PPG光电容积法 4.2.2 心电信号测量法 5 部分实现代码 6 ...
最新文章
- 详细分析本机号码一键登录原理
- Gitlab+Gerrit+Jenkins完整对接
- iphone彻底删除照片如何恢复_如何把删除的照片恢复?轻松解决恢复问题!
- python大神的成长之路_我的Python成长之路
- IaaS、PaaS和SaaS的区别
- SuperMap iServer安装过程详解
- 【重构笔记04】重新组织数据(2)
- openssl--生成RSA公钥和私钥
- HTML5 播放视频代码
- 知乎爬虫与数据分析(一)数据爬取篇
- cf为什么一直连接服务器失败,为什么cf连接服务器失败的解决方法
- 无声交流的读心术,正在剥夺我们的沟通能力
- GIS学习教程资料整理
- QQ游戏图标熄灭大全
- 如何学习数据分析(总结自网易及B站up主)
- wlacm 骑马修栅栏 (图的遍历)题解
- java实习生面试题总结
- 聚合支付源码怎么选择
- Jetson Nano目标检测手把手实战教程(pytorch训练、tensorrt推理,含完整代码和数据)
- 【实验报告】实验五 继承的应用
热门文章
- Visio中图形关于轴线对称
- 华为荣耀4X反复重启且无法进入recovery模式
- 不同 frame 之间调用 js 函数
- python爬虫requests源码链家_python爬虫爬取链家二手房信息
- C语言中判断一个三位数是否是水仙花数,判断三位数是否为水仙花数
- iPad上支持手柄的游戏推荐 - PUSDN
- 兴趣爱好选择程序java+Swing界面
- android 图案解锁忘记了,安卓手机忘记图形解锁、锁屏密码的解决方法
- Python-matplotlib用法
- JAVA网易云热评接口_网易云音乐热评爬虫(一): 反编译加密参数