2025-5-21 23:06:12 只看该作者
1271浏览
查看: 1271|回复: 0
打印 上一主题 下一主题

[项目] Beetle 树莓派RP2350 久坐提醒器

[复制链接]
本帖最后由 云天 于 2025-5-21 23:09 编辑

【项目背景】

在如今快节奏的生活中,久坐已成为许多人的日常状态,无论是办公族长时间伏案工作,还是学生族持续久坐学习,都对健康带来了诸多隐患。长时间久坐会导致血液循环不畅、肌肉疲劳、脊椎压力增大等问题,甚至可能引发更严重的健康疾病。因此,设计一款能够及时提醒人们起身活动的久坐提醒器显得尤为重要。本项目旨在利用 Beetle 树莓派 RP2350 开发板、压力传感器、LED 灯带以及串口 MP3 语音模块等硬件,结合 Arduino IDE 进行编程,制作一款智能久坐提醒器,以帮助人们养成良好的坐姿习惯,减少久坐对健康带来的危害。

Beetle 树莓派RP2350 久坐提醒器图2

【硬件准备】
  • Beetle 树莓派 RP2350 开发板 :作为整个提醒器的核心控制单元,负责数据采集、处理以及控制其他硬件设备。它具有高性能、低功耗的特点,并且支持多种编程语言和丰富的硬件接口,能够满足本项目的需求。
  • 压力传感器 :用于检测沙发靠垫或座椅上是否有压力,从而判断是否有人处于久坐状态。将压力传感器放置在沙发靠垫中,当有人依靠时,传感器会输出相应的电信号。
  • LED 灯带(WS2812) :作为视觉提醒装置,在需要提醒用户起身活动时,通过闪烁或显示特定颜色的灯光来吸引用户的注意力。灯带具有色彩丰富、可控性强的特点,可以利用 FastLED.h 库进行灵活的控制。
  • 串口 MP3 语音模块 :用于播放提醒语音,如 “欢迎使用久坐提醒器”、“久坐有害健康,请及时起身活动” 等。该模块支持 MP3 和 WAV 音频格式,能够通过串口通信接收控制指令并播放指定的语音文件。
Beetle 树莓派RP2350 久坐提醒器图1

【软件准备】
  • Arduino IDE :作为本项目的编程环境,用于编写、上传和调试提醒器的控制程序。它具有简单易用的界面和丰富的库支持,方便开发者快速实现各种功能。
  • FastLED.h 库 :专门用于控制 WS2812 等数字灯带的库,提供了丰富的灯光效果函数和便捷的控制方式,可以轻松实现灯光闪烁、颜色渐变等效果。
  • 在线 AI 配音工具(TTSMaker) :用于生成所需的提醒语音,并将其转换为 MP3 文件格式,以便存储在串口 MP3 语音模块中进行播放。TTSMaker 提供了多种语言和语音风格选择,可以满足不同的语音提示需求,并且支持免费下载和商用。
【硬件连接】
  • 将压力传感器的模拟信号输出引脚(A1)连接到 Beetle 树莓派 RP2350 开发板的 A1 引脚(引脚号 27)。
  • 把 LED 灯带的数据输入引脚连接到开发板的 16 引脚(D16)。
  • 分别将串口 MP3 语音模块的发送引脚(TX)和接收引脚(RX)连接到开发板的 8 引脚(TX1)和 9 引脚(RX1)。
  • 确保所有硬件设备的电源引脚(VCC 和 GND)正确连接,并且与开发板的电源电压匹配,以保证整个电路的正常供电和通信。
【程序设计】1. 引入必要的库
  1. #include <FastLED.h>
复制代码
该语句用于引入 FastLED.h 库,以便后续能够方便地控制 WS2812 LED 灯带的各种灯光效果。

2. 定义硬件连接参数和全局变量
  1. #define LED_PIN 16
  2. #define COLOR_ORDER GRB
  3. #define CHIPSET     WS2812
  4. #define NUM_LEDS    120 // 灯珠数量 120 个
  5. #define BRIGHTNESS  50  // 亮度
  6. #define FRAMES_PER_SECOND 60
  7. bool gReverseDirection = false;
  8. CRGB leds[NUM_LEDS];
  9. unsigned char order[4] = {0xAA,0x06,0x00,0xB0};
  10. const int analogInPin = A1;  
  11. int sensorValue = 0;      
  12. int bs=0;
  13. int bs2=0;
  14. long unsigned int mytime=0;
复制代码
其中,定义了 LED 灯带的连接引脚、颜色顺序、芯片类型、灯珠数量等参数,以及灯光的亮度和帧率等设置。还定义了用于存储灯光颜色数据的 leds 数组、串口 MP3 语音模块的通信指令数组 order,以及压力传感器的连接引脚和相关状态变量 bs、bs2 和计时变量 mytime 等。
3. 初始化函数(setup)
  1. void setup() {
  2.     //Serial.begin(115200);
  3.      Serial2.begin(9600);
  4.      volume(0x1E);// 音量设置 0x00-0x1E
  5.     delay(3000); // sanity delay
  6.     FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  7.     FastLED.setBrightness( BRIGHTNESS );
  8. }
复制代码
在 setup 函数中,首先初始化了串口通信(Serial2),用于与串口 MP3 语音模块进行通信,并设置了语音模块的音量。然后,调用了 FastLED 库的相关函数对 LED 灯带进行初始化,包括设置灯带的类型、引脚、颜色顺序以及亮度等参数。
4. 主循环函数(loop)
  1. void loop()
  2. {
  3.   
  4.   sensorValue = analogRead(analogInPin);
  5.   if(sensorValue>500 && bs2==0)
  6.   {
  7.     if(bs==0){
  8.       red();
  9.       play(0x02);// 指定播放:0x01- 文件 0001
  10.       delay(2000);
  11.       black();
  12.       mytime=millis();
  13.       bs=1;
  14.     }
  15.     else{
  16.      if( millis()-mytime>10000){
  17.        mytime=millis();
  18.        play(0x01);// 指定播放:0x01- 文件 0001
  19.        bs2=1;
  20.      }
  21.     }
  22.   }
  23.   else{
  24.     if(sensorValue<500 && bs2==0){
  25.       mytime=millis();
  26.     }
  27.   }
  28.   if(bs2==1){
  29.      Fire2012(); // run simulation frame  
  30.      FastLED.show(); // display this frame
  31.      FastLED.delay(1000 / FRAMES_PER_SECOND);
  32.      if(sensorValue>500){
  33.        mytime=millis();
  34.      }
  35.      if(sensorValue<500 && millis()-mytime>10000){
  36.       black();
  37.       bs2=0;
  38.       bs=0;
  39.      }
  40.   }
  41. }
复制代码
在 loop 函数中,首先读取压力传感器的值。当检测到压力值大于 500(表示有人依靠在沙发靠垫上)且状态变量 bs2 为 0 时,进入相应的处理逻辑。如果状态变量 bs 为 0,则调用 red 函数将 LED 灯带显示为红色,并通过 play 函数播放欢迎语音(文件编号为 0x02),然后等待 2 秒钟,关闭灯光(调用 black 函数),记录当前时间到 mytime 变量,并将 bs 设置为 1,表示进入计时状态。如果 bs 不为 0,则判断当前时间与上次记录时间的差值是否大于 10 秒(演示程序中以 10 秒代替实际的 30 分钟),如果是,则再次播放提醒语音(文件编号为 0x01),并将 bs2 设置为 1,表示进入灯光闪烁提醒状态。
当压力传感器检测到的压力值小于 500(表示没有人依靠)且 bs2 为 0 时,重新记录当前时间到 mytime 变量。如果处于灯光闪烁提醒状态(bs2 为 1),则调用 Fire2012 函数生成火焰灯光效果,并通过 FastLED.show 函数显示灯光效果,同时利用 FastLED.delay 函数控制灯光效果的刷新频率。在灯光闪烁提醒过程中,如果检测到压力值仍然大于 500,则更新 mytime 变量;如果压力值小于 500 且当前时间与 mytime 的差值大于 10 秒,则关闭灯光,将 bs2 和 bs 都重置为 0,回到初始状态。
5. 播放语音函数(play)
  1. void play(unsigned char Track)
  2. {
  3.      unsigned char play[6] = {0xAA,0x07,0x02,0x00,Track,Track+0xB3};//0xB3=0xAA+0x07+0x02+0x00, 即最后一位为校验和
  4.        Serial2.write(play,6);
  5. }
复制代码
该函数用于向串口 MP3 语音模块发送播放指定曲目的指令。根据语音模块的通信协议,构造了一个包含指令头、播放命令、曲目编号以及校验和的字节数组 play,并通过 Serial2.write 函数将该指令发送给语音模块,从而实现播放对应编号的语音文件。
6. 设置音量函数(volume)
  1. void volume( unsigned char vol)
  2. {
  3.       unsigned char volume[5] = {0xAA,0x13,0x01,vol,vol+0xBE};//0xBE=0xAA+0x13+0x01, 即最后一位为校验和
  4.          Serial2.write(volume,5);
  5. }
复制代码
volume 函数的作用是设置串口 MP3 语音模块的音量大小。同样根据语音模块的通信协议,构造了一个包含指令头、音量设置命令、音量值以及校验和的字节数组 volume,并通过串口发送给语音模块,以调整语音播放的音量。
7. 火焰灯光效果函数(Fire2012)
  1. #define COOLING 55
  2. #define SPARKING 120
  3. void Fire2012()
  4. {
  5. // Array of temperature readings at each simulation cell
  6.   static uint8_t heat[NUM_LEDS];
  7.   // Step 1.  Cool down every cell a little
  8.     for( int i = 0; i < NUM_LEDS; i++) {
  9.       heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
  10.     }
  11.   
  12.     // Step 2.  Heat from each cell drifts 'up' and diffuses a little
  13.     for( int k= NUM_LEDS - 1; k >= 2; k--) {
  14.       heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
  15.     }
  16.    
  17.     // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
  18.     if( random8() < SPARKING ) {
  19.       int y = random8(7);
  20.       heat[y] = qadd8( heat[y], random8(160,255) );
  21.     }
  22.     // Step 4.  Map from heat cells to LED colors
  23.     for( int j = 0; j < NUM_LEDS; j++) {
  24.       CRGB color = HeatColor( heat[j]);
  25.       int pixelnumber;
  26.       if( gReverseDirection ) {
  27.         pixelnumber = (NUM_LEDS-1) - j;
  28.       } else {
  29.         pixelnumber = j;
  30.       }
  31.       leds[pixelnumber] = color;
  32.     }
  33. }
复制代码
Fire2012 函数实现了模拟火焰效果的灯光控制算法。通过定义一个 heat 数组来模拟每个灯珠的 “温度” 值,并按照一定的规则对这些温度值进行更新和扩散,从而生成类似火焰的动态灯光效果。具体来说,首先对每个灯珠的温度值进行一定程度的冷却处理;然后,让每个灯珠的温度值向上漂移并扩散到相邻的灯珠;接着,在底部随机点燃一些新的 “火花”,增加温度值;最后,将模拟的温度值映射到对应的 LED 颜色,并更新灯带的显示效果。
8. 灯光颜色设置函数(red、black)
  1. void red()
  2. {
  3.   for(int i=0;i<NUM_LEDS;i++){
  4.     leds[i] = CRGB::Red;
  5.    
  6.   }
  7.   FastLED.show();
  8. }
  9. void black()
  10. {
  11.   for(int i=0;i<NUM_LEDS;i++){
  12.     leds[i] = CRGB::Black;
  13.    
  14.   }
  15.   FastLED.show();
  16. }
复制代码
red 函数将所有的 LED 灯珠设置为红色显示,用于在用户坐下时进行简单的视觉提示;black 函数则将所有灯珠设置为黑色,即关闭灯光显示,用于在提醒结束后恢复初始状态。
【项目实现与测试】
  • 将编写好的程序通过 Arduino IDE 上传到 Beetle 树莓派 RP2350 开发板中。
  • 将压力传感器安装在沙发靠垫合适的位置,确保当有人依靠时能够准确检测到压力变化。
  • 连接好 LED 灯带、串口 MP3 语音模块以及其他硬件设备,确保整个电路连接正确无误。
  • 使用 TTSMaker 在线 AI 配音工具生成所需的提醒语音,如 “欢迎使用久坐提醒器”、“久坐有害健康,请及时起身活动”,并将其下载为 MP3 文件格式。
  • 将生成的 MP3 文件通过 micro usb 线连接到电脑,按照语音模块的要求存储到指定的文件夹(如 ZH 文件夹)中,并确保文件命名符合要求(如数字命名)。
  • 通电测试整个久坐提醒器系统。当人坐在沙发上,压力传感器检测到压力后,LED 灯带显示红色,语音模块播放欢迎语音。经过 10 秒(演示时间,实际可设置为 30 分钟)后,LED 灯带开始显示火焰效果,并且语音模块播放提醒语音,提示用户起身活动。
Beetle 树莓派RP2350 久坐提醒器图3

【演示视频】

【项目总结与拓展】

本项目成功设计并实现了一款基于 Beetle 树莓派 RP2350 开发板的智能久坐提醒器,通过压力传感器检测久坐状态,利用 LED 灯带和语音模块进行及时提醒,有效地帮助人们养成良好的坐姿习惯,减少久坐对健康的危害。整个项目硬件连接简单、软件编程易于实现,并且具有一定的趣味性和实用性。




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail