数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 390|回复: 3

[Arduino] esp32c2(也即esp8684)大夏龙雀DX-WF25的吃灰板子做“久坐提醒器”

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hackhack 于 2026-6-29 12:32 编辑

趁着有时间,把之前做的另一个项目也发了吧。

思路很简单:
DX-WF25通过接入人体检测器模块(接入GPIO3,LD2402有人返回高电压,无人返回低电压)统计人在座位上的时间,再通过GPIO8的led(PWM模式)亮灭和闪烁提示状态,构成一个提示定时休息的机器。


为了方便改代码,这个项目是用的python写的。
  1. # 创建时间:2025-12-25
  2. # 功能:DXWF-25+DL2402模块,实现定时久坐休息提醒
  3. # 版本:v1.0
  4. from machine import Pin, PWM, freq
  5. import time
  6. import network
  7. import webrepl
  8. import esp

  9. # ===================== 低功耗设置=====================
  10. # 关闭ADC
  11. # pin0 = Pin(0, Pin.IN, value=0)  # ESP8266仅支持PULL_UP




  12. # ===================== 初始化配置 =====================
  13. person_pin = Pin(3, Pin.IN, Pin.PULL_UP)  # DL2402人体检测引脚(GPIO3,输入模式,默认高电平)
  14. wifi_pin = Pin(4, Pin.IN, Pin.PULL_UP)  # GPIO4用于判断是否开启WIFI与webrepl,默认上拉高电平
  15. led_pwm = PWM(Pin(8), freq=1000, duty=0)  # LED PWM初始化(GPIO8,频率1000Hz)
  16. # 状态变量初始化
  17. person_time = 0       # 有人计时(秒)
  18. no_person_time = 0    # 无人计时(秒)
  19. led_state = "no_person"  # led状态:初始无人
  20. # 时间阈值配置(秒)
  21. PERSON_ALARM_THRESHOLD = 45*60  # 持续有人45分钟触发报警
  22. NO_PERSON_RESET_THRESHOLD = 9*60  # 持续无人9分钟重置有人计时;持续有人9分钟重置无人计时;
  23. # wifi信息
  24. WIFI_SSID = "wifidd" # WiFi名称
  25. WIFI_PWD = "12345678900"# WiFi密码
  26. # flag标记
  27. webrepl_running = False
  28. # ===================== 功能函数部分 =====================
  29. def disable_wifi_webrepl():
  30.     global webrepl_running
  31.     """
  32.     功能1:关闭WEBREPL、关闭WIFI
  33.     """
  34.     # 关闭WEBREPL
  35.     try:
  36.         webrepl.stop()
  37.         # print("WEBREPL已关闭")
  38.         webrepl_running = False
  39.     except Exception as e:
  40.         # print(f"关闭WEBREPL失败: {e}")
  41.         pass
  42.    
  43.     # 关闭WIFI(STA和AP模式都关闭)
  44.     wlan_sta = network.WLAN(network.STA_IF)
  45.     wlan_ap = network.WLAN(network.AP_IF)
  46.    
  47.     if wlan_sta.active():
  48.         wlan_sta.active(False)
  49.         # print("STA模式WiFi已关闭")
  50.     if wlan_ap.active():
  51.         wlan_ap.active(False)
  52.         # print("AP模式WiFi已关闭")

  53. def enable_wifi_webrepl():
  54.     global webrepl_running
  55.     """
  56.     功能2:打开WIFI(STA模式)、打开WEBREPL
  57.     """
  58.     # 启动WIFI(STA模式连接路由器)
  59.     wlan_sta = network.WLAN(network.STA_IF)
  60.     if not wlan_sta.active():
  61.         wlan_sta.active(True)
  62.    
  63.     # 连接WiFi(如果未连接)
  64.     if not wlan_sta.isconnected():
  65.         # print(f"正在连接WiFi: {WIFI_SSID}")
  66.         wlan_sta.connect(WIFI_SSID, WIFI_PWD)
  67.         
  68.         # 等待连接(超时10秒)
  69.         timeout = 10
  70.         while not wlan_sta.isconnected() and timeout > 0:
  71.             time.sleep(1)
  72.             timeout -= 1
  73.         
  74.         if wlan_sta.isconnected():
  75.             ip_info = wlan_sta.ifconfig()
  76.             # print(f"WiFi连接成功!IP: {ip_info[0]}")
  77.         # else:
  78.             # print("WiFi连接超时!")
  79.     else:
  80.         ip_info = wlan_sta.ifconfig()
  81.         # print(f"WiFi已连接,IP: {ip_info[0]}")
  82.         # 启动WEBREPL(默认密码:1234,建议修改)
  83.         if not webrepl_running:
  84.             try:
  85.                 webrepl.start(password="1234")  # 可修改密码
  86.                 # print("WEBREPL已启动,端口:8266")
  87.                 webrepl_running = True
  88.             except Exception as e:
  89.                 # print(f"启动WEBREPL失败: {e}")
  90.                 pass

  91. def update_person_state():
  92.     """更新人体检测状态及累计时间"""
  93.     global person_time, no_person_time, led_state
  94.     # 检测人体传感器状态(高电平=有人)
  95.     if person_pin.value() == 1:
  96.         led_state = "person"
  97.         person_time += 1
  98.     else:
  99.         led_state = "no_person"
  100.         no_person_time += 1

  101. def check_alarm_condition():
  102.     """检查报警/重置条件"""
  103.     global person_time, no_person_time, led_state
  104.     # 条件1:有人超过xx分钟 → 触发报警
  105.     if person_time > PERSON_ALARM_THRESHOLD:
  106.         led_state = "alarm"
  107.     # 条件2:无人时间超过(久坐时间每5分钟需要1分钟休息时间) → 重置所有计时
  108.     if no_person_time > (NO_PERSON_RESET_THRESHOLD+round((person_time - PERSON_ALARM_THRESHOLD) / 300)*60):
  109.         person_time = 0
  110.         no_person_time = 0
  111.     # 有人每过5分钟 → 无人时间清0
  112.     if person_time % 300 == 0:
  113.         no_person_time = 0

  114. def control_led_by_state():
  115.     """根据状态控制LED,注意取反值"""
  116.     if led_state == "alarm":
  117.         # 报警:高亮闪烁(亮0.5秒,灭0.5秒)
  118.         led_pwm.duty(0)  # 最大亮度(10位PWM:0-1023)
  119.         time.sleep(0.5)
  120.         led_pwm.duty(1023)
  121.         time.sleep(0.5)
  122.     if led_state == "person":
  123.         # 有人:低亮度常亮(30%亮度)
  124.         led_pwm.duty(720)
  125.         time.sleep(1)
  126.     if led_state == "no_person":
  127.         # 无人:熄灭
  128.         led_pwm.duty(1023)
  129.         time.sleep(1)

  130. # ===================== 主循环 =====================
  131. if __name__ == "__main__":
  132.     # print("定时休息提示器启动...")
  133.     try:
  134.         while True:
  135.             if wifi_pin.value() == 1:
  136.                 enable_wifi_webrepl()
  137.             else:
  138.                 disable_wifi_webrepl()
  139.             update_person_state()    # 更新人体状态
  140.             check_alarm_condition()  # 检查报警/重置条件
  141.             control_led_by_state()   # 控制LED
  142.             # 打印调试信息
  143.             # print(f"{led_state},{person_time}s,{no_person_time}s;",end='')
  144.     except KeyboardInterrupt:
  145.         # 终止程序时关闭PWM
  146.         led_pwm.deinit()
  147.         led = Pin(8, Pin.OUT)  # 重新初始化 GPIO8 为数字输出
  148.         led.value(0)  # LED常亮以方便看设备是否开启
  149.         print("程序终止!")
复制代码


 楼主| 发表于 7 天前 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|数码之家-技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2026-7-6 20:35 , Processed in 0.140400 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz!

© MyDigit.Net Since 2006

快速回复 返回顶部 返回列表