本帖最后由 云天 于 2025-5-21 23:09 编辑  
 
【项目背景】 
 
在如今快节奏的生活中,久坐已成为许多人的日常状态,无论是办公族长时间伏案工作,还是学生族持续久坐学习,都对健康带来了诸多隐患。长时间久坐会导致血液循环不畅、肌肉疲劳、脊椎压力增大等问题,甚至可能引发更严重的健康疾病。因此,设计一款能够及时提醒人们起身活动的久坐提醒器显得尤为重要。本项目旨在利用 Beetle 树莓派 RP2350 开发板、压力传感器、LED 灯带以及串口 MP3 语音模块等硬件,结合 Arduino IDE 进行编程,制作一款智能久坐提醒器,以帮助人们养成良好的坐姿习惯,减少久坐对健康带来的危害。 
 
   
【硬件准备】- Beetle 树莓派 RP2350 开发板 :作为整个提醒器的核心控制单元,负责数据采集、处理以及控制其他硬件设备。它具有高性能、低功耗的特点,并且支持多种编程语言和丰富的硬件接口,能够满足本项目的需求。
 - 压力传感器 :用于检测沙发靠垫或座椅上是否有压力,从而判断是否有人处于久坐状态。将压力传感器放置在沙发靠垫中,当有人依靠时,传感器会输出相应的电信号。
 - LED 灯带(WS2812) :作为视觉提醒装置,在需要提醒用户起身活动时,通过闪烁或显示特定颜色的灯光来吸引用户的注意力。灯带具有色彩丰富、可控性强的特点,可以利用 FastLED.h 库进行灵活的控制。
 - 串口 MP3 语音模块 :用于播放提醒语音,如 “欢迎使用久坐提醒器”、“久坐有害健康,请及时起身活动” 等。该模块支持 MP3 和 WAV 音频格式,能够通过串口通信接收控制指令并播放指定的语音文件。
 
 
  
【软件准备】- 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. 引入必要的库
			
			
			复制代码 该语句用于引入 FastLED.h 库,以便后续能够方便地控制 WS2812 LED 灯带的各种灯光效果。 
2. 定义硬件连接参数和全局变量- #define LED_PIN 16
 - #define COLOR_ORDER GRB
 - #define CHIPSET     WS2812
 - #define NUM_LEDS    120 // 灯珠数量 120 个
 - 
 - #define BRIGHTNESS  50  // 亮度
 - #define FRAMES_PER_SECOND 60
 - 
 - bool gReverseDirection = false;
 - 
 - CRGB leds[NUM_LEDS];
 - unsigned char order[4] = {0xAA,0x06,0x00,0xB0};
 - const int analogInPin = A1;  
 - int sensorValue = 0;      
 - 
 - int bs=0;
 - int bs2=0;
 - long unsigned int mytime=0;
 
  复制代码 其中,定义了 LED 灯带的连接引脚、颜色顺序、芯片类型、灯珠数量等参数,以及灯光的亮度和帧率等设置。还定义了用于存储灯光颜色数据的 leds 数组、串口 MP3 语音模块的通信指令数组 order,以及压力传感器的连接引脚和相关状态变量 bs、bs2 和计时变量 mytime 等。 
3. 初始化函数(setup)- void setup() {
 -     //Serial.begin(115200);
 -      Serial2.begin(9600);
 -      volume(0x1E);// 音量设置 0x00-0x1E
 -     delay(3000); // sanity delay
 -     FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
 -     FastLED.setBrightness( BRIGHTNESS ); 
 - }
 
  复制代码 在 setup 函数中,首先初始化了串口通信(Serial2),用于与串口 MP3 语音模块进行通信,并设置了语音模块的音量。然后,调用了 FastLED 库的相关函数对 LED 灯带进行初始化,包括设置灯带的类型、引脚、颜色顺序以及亮度等参数。 
4. 主循环函数(loop)- void loop()
 - {
 -   
 -   sensorValue = analogRead(analogInPin);
 -   if(sensorValue>500 && bs2==0)
 -   {
 -     if(bs==0){
 -       red();
 -       play(0x02);// 指定播放:0x01- 文件 0001
 -       delay(2000);
 -       black();
 -       mytime=millis();
 -       bs=1;
 -     }
 -     else{
 -      if( millis()-mytime>10000){
 -        mytime=millis();
 -        play(0x01);// 指定播放:0x01- 文件 0001
 -        bs2=1;
 -      }
 -     }
 -   }
 -   else{
 -     if(sensorValue<500 && bs2==0){
 -       mytime=millis();
 -     }
 -   }
 -   if(bs2==1){
 -      Fire2012(); // run simulation frame  
 -      FastLED.show(); // display this frame
 -      FastLED.delay(1000 / FRAMES_PER_SECOND);
 -      if(sensorValue>500){
 -        mytime=millis();
 -      }
 -      if(sensorValue<500 && millis()-mytime>10000){
 -       black();
 -       bs2=0;
 -       bs=0;
 -      }
 -   }
 - }
 
  复制代码 在 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)- void play(unsigned char Track)
 - {
 -      unsigned char play[6] = {0xAA,0x07,0x02,0x00,Track,Track+0xB3};//0xB3=0xAA+0x07+0x02+0x00, 即最后一位为校验和
 -        Serial2.write(play,6);
 - }
 
  复制代码 该函数用于向串口 MP3 语音模块发送播放指定曲目的指令。根据语音模块的通信协议,构造了一个包含指令头、播放命令、曲目编号以及校验和的字节数组 play,并通过 Serial2.write 函数将该指令发送给语音模块,从而实现播放对应编号的语音文件。 
6. 设置音量函数(volume)- void volume( unsigned char vol)
 - {
 -       unsigned char volume[5] = {0xAA,0x13,0x01,vol,vol+0xBE};//0xBE=0xAA+0x13+0x01, 即最后一位为校验和
 -          Serial2.write(volume,5);
 - }
 
  复制代码 volume 函数的作用是设置串口 MP3 语音模块的音量大小。同样根据语音模块的通信协议,构造了一个包含指令头、音量设置命令、音量值以及校验和的字节数组 volume,并通过串口发送给语音模块,以调整语音播放的音量。 
7. 火焰灯光效果函数(Fire2012)- #define COOLING 55
 - #define SPARKING 120
 - void Fire2012()
 - {
 - // Array of temperature readings at each simulation cell
 -   static uint8_t heat[NUM_LEDS];
 - 
 -   // Step 1.  Cool down every cell a little
 -     for( int i = 0; i < NUM_LEDS; i++) {
 -       heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
 -     }
 -   
 -     // Step 2.  Heat from each cell drifts 'up' and diffuses a little
 -     for( int k= NUM_LEDS - 1; k >= 2; k--) {
 -       heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
 -     }
 -     
 -     // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
 -     if( random8() < SPARKING ) {
 -       int y = random8(7);
 -       heat[y] = qadd8( heat[y], random8(160,255) );
 -     }
 - 
 -     // Step 4.  Map from heat cells to LED colors
 -     for( int j = 0; j < NUM_LEDS; j++) {
 -       CRGB color = HeatColor( heat[j]);
 -       int pixelnumber;
 -       if( gReverseDirection ) {
 -         pixelnumber = (NUM_LEDS-1) - j;
 -       } else {
 -         pixelnumber = j;
 -       }
 -       leds[pixelnumber] = color;
 -     }
 - }
 
  复制代码 Fire2012 函数实现了模拟火焰效果的灯光控制算法。通过定义一个 heat 数组来模拟每个灯珠的 “温度” 值,并按照一定的规则对这些温度值进行更新和扩散,从而生成类似火焰的动态灯光效果。具体来说,首先对每个灯珠的温度值进行一定程度的冷却处理;然后,让每个灯珠的温度值向上漂移并扩散到相邻的灯珠;接着,在底部随机点燃一些新的 “火花”,增加温度值;最后,将模拟的温度值映射到对应的 LED 颜色,并更新灯带的显示效果。 
8. 灯光颜色设置函数(red、black)- void red()
 - {
 -   for(int i=0;i<NUM_LEDS;i++){
 -     leds[i] = CRGB::Red;
 -     
 -   }
 -   FastLED.show();
 - }
 - void black()
 - {
 -   for(int i=0;i<NUM_LEDS;i++){
 -     leds[i] = CRGB::Black;
 -     
 -   }
 -   FastLED.show();
 - }
 
  复制代码 red 函数将所有的 LED 灯珠设置为红色显示,用于在用户坐下时进行简单的视觉提示;black 函数则将所有灯珠设置为黑色,即关闭灯光显示,用于在提醒结束后恢复初始状态。 
【项目实现与测试】- 将编写好的程序通过 Arduino IDE 上传到 Beetle 树莓派 RP2350 开发板中。
 - 将压力传感器安装在沙发靠垫合适的位置,确保当有人依靠时能够准确检测到压力变化。
 - 连接好 LED 灯带、串口 MP3 语音模块以及其他硬件设备,确保整个电路连接正确无误。
 - 使用 TTSMaker 在线 AI 配音工具生成所需的提醒语音,如 “欢迎使用久坐提醒器”、“久坐有害健康,请及时起身活动”,并将其下载为 MP3 文件格式。
 - 将生成的 MP3 文件通过 micro usb 线连接到电脑,按照语音模块的要求存储到指定的文件夹(如 ZH 文件夹)中,并确保文件命名符合要求(如数字命名)。
 - 通电测试整个久坐提醒器系统。当人坐在沙发上,压力传感器检测到压力后,LED 灯带显示红色,语音模块播放欢迎语音。经过 10 秒(演示时间,实际可设置为 30 分钟)后,LED 灯带开始显示火焰效果,并且语音模块播放提醒语音,提示用户起身活动。
 
 
  
【演示视频】 
 
【项目总结与拓展】 
 
本项目成功设计并实现了一款基于 Beetle 树莓派 RP2350 开发板的智能久坐提醒器,通过压力传感器检测久坐状态,利用 LED 灯带和语音模块进行及时提醒,有效地帮助人们养成良好的坐姿习惯,减少久坐对健康的危害。整个项目硬件连接简单、软件编程易于实现,并且具有一定的趣味性和实用性。 
 
 
 
 
 |