回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

告别盲喝!树莓派RP2350让杯垫会“思考” 简单

头像 潜川创客 2025.06.02 47 0

        在高速运转的现代生活中,饮水这一基础生理需求正面临新的健康危机。据《国际环境研究与公共卫生杂志》研究显示,超过50℃的热饮可能灼伤口腔与食道黏膜,长期诱发病变;而低于35℃的冷水则易刺激肠胃引发痉挛。尽管世卫组织明确推荐40-45℃为最佳饮用温度,都市人群在忙碌中往往无暇测温——办公室的咖啡凉透方入口,滚烫的茶水匆忙下咽。这种对饮水温度的集体无意识,实则是快节奏生活对健康细节的妥协。

        传统解决方案存在明显局限:电子测温笔需要主动操作,智能恒温杯价格昂贵且依赖充电,而普通杯垫仅具隔热功能。我们能否以轻量化、低干预的方式,让温度感知融入饮水场景?树莓派RP2350微控制器的出现提供了破题思路。这颗仅硬币大小的芯片,用Raspberry Pi RP2350高性能微控制器,支持Arm Cortex-M33或Hazard3 RISC-V内核选择。主频高达150MHz,配备520KB RAM和2MB Flash,可高效处理大量数据,满足高性能计算需求。拥有驱动实时温控系统的强悍性能。

        本项目由此诞生:以RP2350为核心,开发可无缝融入桌面的智慧温控杯垫。通过高灵敏度温度传感器,杯垫持续监测容器底部温度分布,当检测到水温<35℃时亮黄色提示灯,OLED屏提示“低温”;在35-45℃理想区间显示绿灯,代表“安心饮用”;超过45℃则切换红色警报,防止烫伤风险。这种无接触的被动提醒,如同为水杯装上智能守护人,让用户举杯瞬间便能获取温度情报。我们期待通过这项设计,将实验室级的温度监测技术压缩至杯垫尺度,用科技重新定义健康饮水的底线——当每一口水都经得起科学考量,便是智能硬件对日常生活最温柔的守护。

784c7af10e12474278ebb961ecb6c52.png

步骤1 硬件选型

材料清单

步骤2 硬件连接

【硬件连接】

WS2812灯环:VCC → 5V, GND → GND, DIN → GPIO0

DHT11传感器:VCC → 3.3V, GND → GND, DATA → GPIO1

OLED显示屏:VCC → 3.3V, GND → GND, SCL → GPIO5, SDA → GPIO4

d5396df0edcb4e45059cebe92bbf393.jpg

步骤3 编程控制

代码
#include <U8g2lib.h>
#include <Adafruit_NeoPixel.h>
#include <DHT.h>

// OLED 配置 (I2C)
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

// 灯环配置
#define LED_PIN     0     // 灯环数据引脚
#define LED_COUNT   8    // 灯珠数量
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// DHT11配置
#define DHTPIN     1      // DHT11数据引脚
#define DHTTYPE    DHT11  // 传感器类型
DHT dht(DHTPIN, DHTTYPE);

// 颜色定义
#define GREEN      strip.Color(0, 150, 0)      // 绿灯
#define YELLOW     strip.Color(180, 100, 0)    // 黄灯
#define RED        strip.Color(150, 0, 0)      // 红灯
#define BLUE       strip.Color(0, 0, 150)      // 蓝色
#define OFF        strip.Color(0, 0, 0)        // 关闭

// 温度阈值
#define LOW_TEMP   35.0
#define HIGH_TEMP  45.0

void setup() {
  Serial.begin(115200);    // 启动串口通信
  
  // 初始化OLED
  u8g2.begin();
  u8g2.setFontDirection(0);
  u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 使用中文字体
  
  // 显示启动画面
  displaySplashScreen();
  
  // 初始化灯环
  strip.begin();           
  strip.setBrightness(50); 
  strip.show();            // 关闭所有LED
  
  // 初始化DHT传感器
  dht.begin();             
  
  // 启动指示:蓝色呼吸灯
  for(int i=0; i<2; i++) {
    breathEffect(BLUE, 2);
  }
  setAllColor(OFF);  // 关闭所有LED
}

void loop() {
  delay(2000);  // 等待2秒(传感器读取间隔)
  
  // 读取温度
  float temperature = dht.readTemperature();
  
  // 检查读取是否成功
  if (isnan(temperature)) {
    Serial.println("读取DHT11失败!");
    displayError("传感器错误!");
    errorEffect();
    return;
  }
  
  // 在串口显示信息
  Serial.print("温度: ");
  Serial.print(temperature);
  Serial.println("°C");
  
  // 在OLED上显示信息
  displayMainScreen(temperature);
  
  // 设置LED颜色
  if (temperature < LOW_TEMP) {
    setAllColor(YELLOW);
  } 
  else if (temperature >= LOW_TEMP && temperature < HIGH_TEMP) {
    setAllColor(GREEN);
  } 
  else {
    setAllColor(RED);
  }
}

// 显示主界面
void displayMainScreen(float temperature) {
  u8g2.clearBuffer();
  
  // 顶部标题
  u8g2.setFont(u8g2_font_wqy14_t_gb2312);
  u8g2.drawUTF8(15, 15, "智慧温控杯垫");
  
  // 分隔线
  u8g2.drawHLine(0, 18, 128);
  
  // 温度显示
  u8g2.setFont(u8g2_font_wqy14_t_gb2312);
  char tempStr[20];
  sprintf(tempStr, "温度: %.1f°C", temperature);
  u8g2.drawUTF8(10, 40, tempStr);
  
  // 状态显示
  const char* statusMsg = "";
  if (temperature < LOW_TEMP) {
    statusMsg = "状态: 低温(黄灯)";
  } 
  else if (temperature >= LOW_TEMP && temperature < HIGH_TEMP) {
    statusMsg = "状态: 中温(绿灯)";
  } 
  else {
    statusMsg = "状态: 高温(红灯)";
  }
  u8g2.drawUTF8(10, 60, statusMsg);
  
  u8g2.sendBuffer();
  Serial.println(statusMsg);
}

// 显示启动画面
void displaySplashScreen() {
  u8g2.clearBuffer();
  
  // 标题
  u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  u8g2.drawUTF8(10, 30, "智慧温控杯垫");
  
  // 副标题
  u8g2.setFont(u8g2_font_wqy12_t_gb2312);
  u8g2.drawUTF8(25, 50, "正在初始化...");
  
  u8g2.sendBuffer();
  delay(1500); // 显示1.5秒
}

// 设置所有灯珠为相同颜色
void setAllColor(uint32_t color) {
  for(int i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, color);
  }
  strip.show();
}

// 错误指示效果(红蓝闪烁)
void errorEffect() {
  for(int i=0; i<5; i++) {
    setAllColor(RED);
    delay(200);
    setAllColor(BLUE);
    delay(200);
  }
  setAllColor(OFF);  // 关闭LED
}

// 呼吸灯效果
void breathEffect(uint32_t color, int cycles) {
  for(int j=0; j<cycles; j++) {
    for(int b=5; b<=100; b+=5) {
      strip.setBrightness(b);
      setAllColor(color);
      delay(30);
    }
    for(int b=100; b>=5; b-=5) {
      strip.setBrightness(b);
      setAllColor(color);
      delay(30);
    }
  }
  strip.setBrightness(50);  // 恢复默认亮度
}

// 在OLED上显示错误信息
void displayError(const char *msg) {
  u8g2.clearBuffer();
  
  // 错误标题
  u8g2.setFont(u8g2_font_wqy14_t_gb2312);
  u8g2.drawUTF8(40, 20, "错误!");
  
  // 错误信息
  u8g2.setFont(u8g2_font_wqy12_t_gb2312);
  u8g2.drawUTF8(10, 40, msg);
  u8g2.drawUTF8(10, 60, "请检查传感器连接");
  
  u8g2.sendBuffer();
}

步骤4 项目演示

步骤5 项目展望

演示文稿1_01.jpg

        Beetle RP2350开发板试用测试阶段,接下来设计PCB扩展板和智慧温控杯垫的3D打印实物模型,后续进展,持续更新,敬请关注!!!

评论

user-avatar