Beetle 树莓派RP2350 久坐提醒器
本帖最后由 云天 于 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. 引入必要的库#include <FastLED.h>该语句用于引入 FastLED.h 库,以便后续能够方便地控制 WS2812 LED 灯带的各种灯光效果。
2. 定义硬件连接参数和全局变量#define LED_PIN 16
#define COLOR_ORDER GRB
#define CHIPSET WS2812
#define NUM_LEDS 120 // 灯珠数量 120 个
#define BRIGHTNESS50// 亮度
#define FRAMES_PER_SECOND 60
bool gReverseDirection = false;
CRGB leds;
unsigned char order = {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 = {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 = {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;
// Step 1.Cool down every cell a little
for( int i = 0; i < NUM_LEDS; i++) {
heat = qsub8( heat,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 = (heat + heat + heat ) / 3;
}
// Step 3.Randomly ignite new 'sparks' of heat near the bottom
if( random8() < SPARKING ) {
int y = random8(7);
heat = qadd8( heat, random8(160,255) );
}
// Step 4.Map from heat cells to LED colors
for( int j = 0; j < NUM_LEDS; j++) {
CRGB color = HeatColor( heat);
int pixelnumber;
if( gReverseDirection ) {
pixelnumber = (NUM_LEDS-1) - j;
} else {
pixelnumber = j;
}
leds = color;
}
}Fire2012 函数实现了模拟火焰效果的灯光控制算法。通过定义一个 heat 数组来模拟每个灯珠的 “温度” 值,并按照一定的规则对这些温度值进行更新和扩散,从而生成类似火焰的动态灯光效果。具体来说,首先对每个灯珠的温度值进行一定程度的冷却处理;然后,让每个灯珠的温度值向上漂移并扩散到相邻的灯珠;接着,在底部随机点燃一些新的 “火花”,增加温度值;最后,将模拟的温度值映射到对应的 LED 颜色,并更新灯带的显示效果。
8. 灯光颜色设置函数(red、black)void red()
{
for(int i=0;i<NUM_LEDS;i++){
leds = CRGB::Red;
}
FastLED.show();
}
void black()
{
for(int i=0;i<NUM_LEDS;i++){
leds = CRGB::Black;
}
FastLED.show();
}red 函数将所有的 LED 灯珠设置为红色显示,用于在用户坐下时进行简单的视觉提示;black 函数则将所有灯珠设置为黑色,即关闭灯光显示,用于在提醒结束后恢复初始状态。
【项目实现与测试】
[*]将编写好的程序通过 Arduino IDE 上传到 Beetle 树莓派 RP2350 开发板中。
[*]将压力传感器安装在沙发靠垫合适的位置,确保当有人依靠时能够准确检测到压力变化。
[*]连接好 LED 灯带、串口 MP3 语音模块以及其他硬件设备,确保整个电路连接正确无误。
[*]使用 TTSMaker 在线 AI 配音工具生成所需的提醒语音,如 “欢迎使用久坐提醒器”、“久坐有害健康,请及时起身活动”,并将其下载为 MP3 文件格式。
[*]将生成的 MP3 文件通过 micro usb 线连接到电脑,按照语音模块的要求存储到指定的文件夹(如 ZH 文件夹)中,并确保文件命名符合要求(如数字命名)。
[*]通电测试整个久坐提醒器系统。当人坐在沙发上,压力传感器检测到压力后,LED 灯带显示红色,语音模块播放欢迎语音。经过 10 秒(演示时间,实际可设置为 30 分钟)后,LED 灯带开始显示火焰效果,并且语音模块播放提醒语音,提示用户起身活动。
【演示视频】
https://www.bilibili.com/video/BV1CaJ6zHE7m/?share_source=copy_web
【项目总结与拓展】
本项目成功设计并实现了一款基于 Beetle 树莓派 RP2350 开发板的智能久坐提醒器,通过压力传感器检测久坐状态,利用 LED 灯带和语音模块进行及时提醒,有效地帮助人们养成良好的坐姿习惯,减少久坐对健康的危害。整个项目硬件连接简单、软件编程易于实现,并且具有一定的趣味性和实用性。
难得的好作品,点赞
发觉DF社区流失了大量优质作者,快被转载的帖子淹没了
页:
[1]