【Arduino】坐姿检测器
文章目錄
- 前言
- 一、所需材料
- 1、硬件
- 2、軟件
- 3、接線
- 二、Arduino部分
- 1、庫函數(shù)引入
- 2、選擇開發(fā)板
- 3、代碼
- 4、演示視頻
- 三、使用說明
- 1、項目方案
- 2、頁面切換
- 頁面設(shè)計
前言
這也是幫人做的畢設(shè)之一,功能完善,資料也完備,相對以往代碼寫的規(guī)范,代碼相對以往變得更加簡潔好看,視頻也有錄制。
項目下載鏈接
一、所需材料
1、硬件
| 帶IIC轉(zhuǎn)換板LCD1602 |
| JQ8400FL10P語音模塊 |
| UNO R3開發(fā)板 |
| 三色LED燈 |
| LCD1602 IIC |
| 積木按鍵 |
| 小面包板 |
| 木板若干 |
| 杜邦若干 |
2、軟件
| 微信語音合成小程序 |
3、接線
RGB三色彩燈接線
| R | 4 |
| G | 5 |
| B | 6 |
超聲波傳感器接線
| Tr | 2 |
| Ech | 3 |
JQ8400語音模塊
| 7 | ONE LINE |
按鍵接線
| OUT | A0 |
LCD1602接線
| SDA | SDA |
| SCL | SCL |
二、Arduino部分
1、庫函數(shù)引入
2、選擇開發(fā)板
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; //設(shè)置初始警報值為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);// 要檢測引腳上輸入的脈沖寬度,需要先設(shè)置為輸入狀態(tài)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(); //反轉(zhuǎn)LED狀態(tài),達(dá)到閃爍的效果}} 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數(shù)值key = get_key(adc_key_in); // 轉(zhuǎn)化成按鍵if (key != oldkey) {delay(50); //等待反彈時間adc_key_in = analogRead(0); // 讀取模擬口A0數(shù)值key = get_key(adc_key_in); // 轉(zhuǎn)換成按鍵if (key != oldkey) {oldkey = key;if (key > 0) {if (key = S5) { //5#按鍵進(jìn)入設(shè)置界面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數(shù)值key = get_key(adc_key_in); //轉(zhuǎn)化成按鍵if (key != oldkey) {delay(50); //等待反彈時間adc_key_in = analogRead(0); //讀取模擬口A0數(shù)值key = get_key(adc_key_in); //轉(zhuǎn)換成按鍵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() {// 產(chǎn)生一個10us的高脈沖去觸發(fā)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值轉(zhuǎn)換為鍵數(shù) 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; }//發(fā)送語音模塊串口指令函數(shù) 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);//發(fā)送語音指令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:(坐姿提醒)
使用超聲波模塊檢測距離,當(dāng)坐姿不端時,測距小于標(biāo)準(zhǔn)距離,語音提示,有燈光提示,屏幕文字顯示提醒
功能2:(調(diào)節(jié)報警距離)
屏幕實時顯示當(dāng)前的測距,按鍵可以調(diào)節(jié)報警距離
功能3:
自定義語音提示
2、頁面切換
各頁面切換實現(xiàn)方法:
主界面:
顯示距離
距離過小進(jìn)入報警界面
S5進(jìn)入設(shè)置界面
設(shè)置界面:
按鍵控制±,
S5返回主界面
報警界面:
怎么返回
測距大于安全距離則返回
小于安全距離且原本為安全時
警告界面
小于安全距離且原本時警告界面時
不作反應(yīng)
大于安全距離且原本為安全時
不做反應(yīng)
大于安全距離且原本為警告界面時
返回主頁
頁面設(shè)計
功能介紹:
LCD共有三個界面
? 主界面(Home_Page)
? 警報界面(Alarm_Page)
? 設(shè)置界面(Setting_Page)
主界面
? 在主界面之下,時刻顯示著當(dāng)前超聲波傳感器的讀值
? Distance:
? xx.xx cm
“設(shè)置界面”
? 在設(shè)置界面時刻顯示著當(dāng)前的警報設(shè)置距離
? The setting page
? alarm:xx cm
“警報界面”
? The distance is
? Too short
按鍵使用:
? S1 :可進(jìn)入設(shè)置狀態(tài)
? S2 :可增加設(shè)置距離
? S3 :可減少設(shè)置距離
? S4 :可減少設(shè)置距離
? S5 :可自由切換兩個頁面
總結(jié)
以上是生活随笔為你收集整理的【Arduino】坐姿检测器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Remix使用教程,新版 remix 使
- 下一篇: 魔兽会封python_Python爬取大