日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Arduino】坐姿检测器

發(fā)布時(shí)間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Arduino】坐姿检测器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 一、所需材料
    • 1、硬件
    • 2、軟件
    • 3、接線
  • 二、Arduino部分
    • 1、庫(kù)函數(shù)引入
    • 2、選擇開發(fā)板
    • 3、代碼
    • 4、演示視頻
  • 三、使用說(shuō)明
    • 1、項(xiàng)目方案
    • 2、頁(yè)面切換
    • 頁(yè)面設(shè)計(jì)


前言

這也是幫人做的畢設(shè)之一,功能完善,資料也完備,相對(duì)以往代碼寫的規(guī)范,代碼相對(duì)以往變得更加簡(jiǎn)潔好看,視頻也有錄制。
項(xiàng)目下載鏈接

一、所需材料

1、硬件

HC-SR04超聲波測(cè)距模塊
帶IIC轉(zhuǎn)換板LCD1602
JQ8400FL10P語(yǔ)音模塊
UNO R3開發(fā)板
三色LED燈
LCD1602 IIC
積木按鍵
小面包板
木板若干
杜邦若干

2、軟件

Arduino IDE
微信語(yǔ)音合成小程序

3、接線

RGB三色彩燈接線

燈UNO
R4
G5
B6

超聲波傳感器接線

超聲波傳感器UNO
Tr2
Ech3

JQ8400語(yǔ)音模塊

JQ8400UNO
7ONE LINE

按鍵接線

按鍵UNO
OUTA0

LCD1602接線

LCD1602UNO
SDASDA
SCLSCL

二、Arduino部分

1、庫(kù)函數(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è)置初始警報(bào)值為15cm #define BUF_LEN 10 char Dis_Buf[BUF_LEN];//LED燈 #define rled 4 //紅燈io #define yled 5 //黃燈io #define gled 6 //綠燈io //語(yǔ)音模塊 #define SDAPin 7 //語(yǔ)音模塊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; //用于定時(shí)讀取void setup() { // 初始化串口通信及連接SR04的引腳Serial.begin(9600);lcd.init();lcd.backlight();pinMode(TrigPin, OUTPUT);// 要檢測(cè)引腳上輸入的脈沖寬度,需要先設(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(); //測(cè)距if (distance < alarmvalue) { //小于安全距離if (Dis_Sta == Safe) { //上一次為安全距離,這次為過近距離Dis_Sta = Alarm;//警告界面,語(yǔ)音播報(bào)lcd.clear();Alarm_Page();//語(yǔ)音播報(bào)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); //等待反彈時(shí)間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); //等待反彈時(shí)間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)生一個(gè)10us的高脈沖去觸發(fā)TrigPindigitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(10);digitalWrite(TrigPin, LOW);// 檢測(cè)脈沖寬度,并計(jì)算出距離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ā)送語(yǔ)音模塊串口指令函數(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); }//語(yǔ)音指令 void say_control() {sendData(0x11);//發(fā)送語(yǔ)音指令delay(2200);//語(yǔ)音時(shí)長(zhǎng) }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鏈接

三、使用說(shuō)明

1、項(xiàng)目方案

功能1:(坐姿提醒)
使用超聲波模塊檢測(cè)距離,當(dāng)坐姿不端時(shí),測(cè)距小于標(biāo)準(zhǔn)距離,語(yǔ)音提示,有燈光提示,屏幕文字顯示提醒
功能2:(調(diào)節(jié)報(bào)警距離)
屏幕實(shí)時(shí)顯示當(dāng)前的測(cè)距,按鍵可以調(diào)節(jié)報(bào)警距離

功能3:
自定義語(yǔ)音提示

2、頁(yè)面切換

各頁(yè)面切換實(shí)現(xiàn)方法:
主界面:
顯示距離
距離過小進(jìn)入報(bào)警界面
S5進(jìn)入設(shè)置界面

設(shè)置界面:
按鍵控制±,
S5返回主界面

報(bào)警界面:
怎么返回
測(cè)距大于安全距離則返回

小于安全距離且原本為安全時(shí)
警告界面
小于安全距離且原本時(shí)警告界面時(shí)
不作反應(yīng)
大于安全距離且原本為安全時(shí)
不做反應(yīng)
大于安全距離且原本為警告界面時(shí)
返回主頁(yè)

頁(yè)面設(shè)計(jì)

功能介紹:

  • LCD共有三個(gè)界面
    ? 主界面(Home_Page)
    ? 警報(bào)界面(Alarm_Page)
    ? 設(shè)置界面(Setting_Page)

  • 主界面
    ? 在主界面之下,時(shí)刻顯示著當(dāng)前超聲波傳感器的讀值
    ? Distance:
    ? xx.xx cm

  • “設(shè)置界面”
    ? 在設(shè)置界面時(shí)刻顯示著當(dāng)前的警報(bào)設(shè)置距離
    ? The setting page
    ? alarm:xx cm

  • “警報(bào)界面”
    ? The distance is
    ? Too short

  • 按鍵使用:
    ? S1 :可進(jìn)入設(shè)置狀態(tài)
    ? S2 :可增加設(shè)置距離
    ? S3 :可減少設(shè)置距離
    ? S4 :可減少設(shè)置距離
    ? S5 :可自由切換兩個(gè)頁(yè)面

    總結(jié)

    以上是生活随笔為你收集整理的【Arduino】坐姿检测器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。