57648浏览
查看: 57648|回复: 0

智能喝水提醒器

[复制链接]
本帖最后由 云天 于 2024-4-4 11:39 编辑

【项目背景】
长时间在电脑前工作,不太容易想起来喝水,今天这个项目是用来定时提醒喝水。
【项目设计】
主控使用Beetle ESP32-c3,使用它的原因,一是因为体积小,有集成充电管理,支持Wi-Fi 。通过从网络时间服务器获取时间,并使用ESP32自带的RTC时钟保持时间更新,每半小时提醒一次。使用UART通讯控制电机及灯光驱动模块的PWM输出,调节LED柔性灯丝。
【硬件准备】
1.3V 260mm 柔性软灯丝
直径2mm,长度260mm的3V柔性软灯丝,可用于DIY灯光装饰,DIY灯泡球,360°全角度发光灯具等。


2.灯光&电机驱动板
可以用Python代码控制、WINDOWS上位机控制、UART通讯编程控制、电位器手动控制共四种方式调节的PWM驱动器。用于直流电机调速、灯光调节等应用场景。
本产品支持5V~24V宽电压输入,并具有10A的承载能力,能驱动50W左右的直流电机(由于电机端口极性固定,并不能控制电机方向)或者整卷5米左右的灯带。
适用于水泵水量控制、散热风扇速度控制、灯光亮度调节、电动工具改造、电机灯带产品测试、电机速度自动化控制、灯光效果自动化控制等场景。

智能喝水提醒器图5

3.Beetle ESP32-C3
基于ESP32-C3的小体积主控,集成充电管理,适用于物联网项目
智能喝水提醒器图6


【硬件连接】
灯光&电机驱动板使用9V电池供电,柔性软灯丝接PWM OUT,通过UART与Beetle ESP32-c3的TX、RX引脚连接。Beetle ESP32-c3使用3.7V锂电池通过BAT引脚供电。
智能喝水提醒器图4

【编写程序】
    柔性软灯丝发热较大,setPwmDuty(80);设置为80,如设置高了,时间长会烧毁灯丝。
  1. #define  PWM_ENABLE           0x01
  2. #define  PWM_DISENABLE        0x00
  3. #define  DEV_ADDR             0x32
  4. #define  DUTY_REG_ADDR        0x0006
  5. #define  FREQ_REG_ADDR        0x0007
  6. #define  PWM_EN_REG_ADDR      0x0008
  7. static uint16_t CheckCRC(uint8_t *data, uint8_t len){
  8.   uint16_t crc = 0xFFFF;
  9.   for(uint8_t pos = 0; pos < len; pos++){
  10.     crc ^= (uint16_t)data[pos];
  11.     for(uint8_t i = 8; i != 0; i-- ){
  12.       if((crc & 0x0001) != 0){
  13.         crc >>= 1;
  14.         crc ^= 0xA001;
  15.       }else{
  16.         crc >>= 1;
  17.       }
  18.     }
  19.   }
  20.   crc = ((crc & 0x00FF) << 8) | ((crc & 0xFF00) >> 8);
  21.   return crc;
  22. }
  23. static void WriteRegValue(uint16_t regAddr, uint16_t value){
  24.   uint8_t tempData[8];
  25.   uint16_t crc;
  26.   tempData[0] = DEV_ADDR;
  27.   tempData[1] = 0x06;
  28.   tempData[2] = (regAddr >> 8) & 0xFF;
  29.   tempData[3] = regAddr & 0xFF;
  30.   tempData[4] = (value >> 8) & 0xFF;
  31.   tempData[5] =  value & 0xFF;
  32.   crc = CheckCRC(tempData, 6);
  33.   tempData[6] = (crc >> 8) & 0xFF;
  34.   tempData[7] = crc & 0xFF;
  35.   for(uint8_t i = 0 ;i < 8; i++){
  36.     Serial.print((char)tempData[i]);
  37.   }
  38.   Serial.flush();
  39. }
  40. static void setPwmDuty(uint8_t duty){
  41.   WriteRegValue(DUTY_REG_ADDR, (uint16_t)duty);
  42. }
  43. static void setPwmFreq(uint8_t freq){
  44.   WriteRegValue(FREQ_REG_ADDR, (uint16_t)freq);
  45. }
  46. static void setPwmEnable(uint8_t pwmStatus){
  47.   WriteRegValue(PWM_EN_REG_ADDR, (uint16_t)pwmStatus);
  48. }
  49. void setup() {
  50.   // put your setup code here, to run once:
  51.   Serial.begin(9600);
  52.   delay(1000);
  53.   setPwmFreq(10);
  54.   delay(50);
  55.   setPwmDuty(0);
  56.   delay(50);
  57.   setPwmEnable(PWM_ENABLE);
  58.   delay(50);
  59. }
  60. void loop() {
  61.     setPwmDuty(80);
  62.     delay(2000);
  63.     setPwmDuty(0);
  64.     delay(2000);
  65. }
复制代码
智能喝水提醒器图1


【定时设置】
连接WIFI,并从 "pool.ntp.org"网络时间服务器获取时间,当时间每到半小时(timeinfo.tm_min==30)亮灯提醒喝水。
  1. #include <WiFi.h>
  2. const char *ssid = "*******";    //WIFI名称
  3. const char *password = "********"; //WIFI密码
  4. const char *ntpServer = "pool.ntp.org";
  5. const long gmtOffset_sec = 8 * 3600;
  6. const int daylightOffset_sec = 0;
  7. #define  PWM_ENABLE           0x01
  8. #define  PWM_DISENABLE        0x00
  9. #define  DEV_ADDR             0x32
  10. #define  DUTY_REG_ADDR        0x0006
  11. #define  FREQ_REG_ADDR        0x0007
  12. #define  PWM_EN_REG_ADDR      0x0008
  13. static uint16_t CheckCRC(uint8_t *data, uint8_t len){
  14.   uint16_t crc = 0xFFFF;
  15.   for(uint8_t pos = 0; pos < len; pos++){
  16.     crc ^= (uint16_t)data[pos];
  17.     for(uint8_t i = 8; i != 0; i-- ){
  18.       if((crc & 0x0001) != 0){
  19.         crc >>= 1;
  20.         crc ^= 0xA001;
  21.       }else{
  22.         crc >>= 1;
  23.       }
  24.     }
  25.   }
  26.   crc = ((crc & 0x00FF) << 8) | ((crc & 0xFF00) >> 8);
  27.   return crc;
  28. }
  29. static void WriteRegValue(uint16_t regAddr, uint16_t value){
  30.   uint8_t tempData[8];
  31.   uint16_t crc;
  32.   tempData[0] = DEV_ADDR;
  33.   tempData[1] = 0x06;
  34.   tempData[2] = (regAddr >> 8) & 0xFF;
  35.   tempData[3] = regAddr & 0xFF;
  36.   tempData[4] = (value >> 8) & 0xFF;
  37.   tempData[5] =  value & 0xFF;
  38.   crc = CheckCRC(tempData, 6);
  39.   tempData[6] = (crc >> 8) & 0xFF;
  40.   tempData[7] = crc & 0xFF;
  41.   for(uint8_t i = 0 ;i < 8; i++){
  42.     Serial.print((char)tempData[i]);
  43.   }
  44.   Serial.flush();
  45. }
  46. static void setPwmDuty(uint8_t duty){
  47.   WriteRegValue(DUTY_REG_ADDR, (uint16_t)duty);
  48. }
  49. static void setPwmFreq(uint8_t freq){
  50.   WriteRegValue(FREQ_REG_ADDR, (uint16_t)freq);
  51. }
  52. static void setPwmEnable(uint8_t pwmStatus){
  53.   WriteRegValue(PWM_EN_REG_ADDR, (uint16_t)pwmStatus);
  54. }
  55. void printLocalTime()
  56. {
  57.     struct tm timeinfo;
  58.     if (!getLocalTime(&timeinfo))
  59.     {
  60.         Serial.println("Failed to obtain time");
  61.         return;
  62.     }
  63.     //Serial.println(&timeinfo, "%F %T %A"); // 格式化输出
  64.     //Serial.println(timeinfo.tm_sec);
  65.     if(timeinfo.tm_min==30 )
  66.     {
  67.       setPwmDuty(80);
  68.     }
  69.     else{
  70.       setPwmDuty(0);
  71.     }
  72. }
  73. void setup()
  74. {
  75.   Serial.begin(9600);
  76.   delay(1000);
  77.   setPwmFreq(10);
  78.   delay(50);
  79.   setPwmDuty(0);
  80.   delay(50);
  81.   setPwmEnable(PWM_ENABLE);
  82.   delay(50);
  83.     WiFi.begin(ssid, password);
  84.     while (WiFi.status() != WL_CONNECTED)
  85.     {
  86.         delay(500);
  87.         Serial.print(".");
  88.     }
  89.     Serial.println("WiFi connected!");
  90.     // 从网络时间服务器上获取并设置时间
  91.     // 获取成功后芯片会使用RTC时钟保持时间的更新
  92.     configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  93.     printLocalTime();
  94.     WiFi.disconnect(true);
  95.     WiFi.mode(WIFI_OFF);
  96.     Serial.println("WiFi disconnected!");
  97. }
  98. void loop()
  99. {
  100.     //setPwmDuty(5);
  101.     printLocalTime();
  102.     //delay(2000);
  103.     //setPwmDuty(0);
  104.     delay(200);
  105. }
复制代码

智能喝水提醒器图2


智能喝水提醒器图3


【演示视频】

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

本版积分规则

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

硬件清单

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

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

mail