|
|
esp32c2(也即esp8684)大夏龙雀DX-WF25的吃灰板子做“久坐提醒器”用了一段时间,需要增加一个站立工作模式。
还是运营在micropython下,很方便通过webrepl改代码,比烧录方便很多。
boot.py
- import network
- import webrepl
- import ntptime
- import time
- import machine
- # WiFi
- WIFI_SSID = "xxxxx"
- WIFI_PASSWORD = "12345678"
- def connect_wifi():
- wlan = network.WLAN(network.STA_IF)
- wlan.active(True)
- # 已连接
- if wlan.isconnected():
- print("本机IP", wlan.ifconfig()[0])
- return wlan
- print("连接WiFi", WIFI_SSID)
- wlan.connect(WIFI_SSID, WIFI_PASSWORD)
- timeout = 10
- while not wlan.isconnected() and timeout > 0:
- timeout -= 1
- time.sleep(1)
- print(".", end="")
-
- if wlan.isconnected():
- print("\nWiFi成功")
- print("本机IP", wlan.ifconfig()[0])
- # --------开启mDNS,主机名esp32,域名 esp32.local --------
- # try:
- # import mdns
- # mdns.start("esp32", "MicroPython-ESP32")
- # print("mDNS已开启,访问地址:http://esp32.local")
- # except Exception as e:
- # print("mDNS启动失败,固件不支持mdns模块:", e)
- try:
- ntptime.settime()
- print('时间同步成功')
- except Exception as e:
- print('时间同步失败:', e)
- else:
- print("\nWiFi失败,请检查账号密码")
- return wlan
- try:
- connect_wifi()
- # 开WebRepl
- webrepl.start()
- time.sleep(1)
- print("WebRepl working...")
- except Exception as err:
- print("运行异常", err)
复制代码 main.py
- # 创建时间:2026.08.13
- # 功能:DXWF-25+DL2402模块,实现定时久坐休息提醒
- # 版本:v1.1
- # 增加网页,方便查看统计情况
- # 增加站立工作模式开关(建议干簧管或霍尔开关,配合磁吸固定非常优雅)
- # 磁吸到指定位置,可以保障雷达对准指定区域。从磁吸拿下来,就判定为站立模式。
- from machine import Pin, PWM, freq
- import time
- # 导入封装好的web_log模块
- import web_log
- # ===================== 低功耗设置=====================
- # 关闭ADC
- # pin0 = Pin(0, Pin.IN, value=0) # ESP8266仅支持PULL_UP
- # ===================== 初始化配置 =====================
- person_pin = Pin(3, Pin.IN, Pin.PULL_UP) # DL2402人体检测引脚(GPIO3,输入模式,默认高电平)
- standing_pin = Pin(4, Pin.IN, Pin.PULL_UP) # GPIO4用于判断是否进入站立工作模式,默认上拉高电平
- led_pwm_pin = PWM(Pin(8), freq=1000, duty=0) # LED PWM初始化(GPIO8,频率1000Hz)
- # 状态变量初始化
- sum_sit_time= 0 # 总坐时长
- sum_rest_time = 0 # 总休息时长
- standing_work_time= 0 # 总站立工作时间
- sit_time = 0 # 有人计时(秒)
- no_person_time = 0 # 无人计时(秒)
- led_state = "no_person" # led状态:初始无人
- # 时间阈值配置(秒)
- PERSON_ALARM_THRESHOLD = 45*60 # 持续有人45分钟触发报警
- NO_PERSON_RESET_THRESHOLD = 9*60 # 持续无人9分钟重置有人计时;持续有人5分钟重置无人计时;
- # ===================== 功能函数部分 =====================
- def update_person_state():
- """更新人体检测状态及累计时间"""
- global sit_time, no_person_time, led_state, sum_rest_time, sum_sit_time, standing_work_time
- # 检测人体传感器状态(高电平=有人)
- if standing_pin.value() == 1:
- led_state = "stand_working"
- standing_work_time += 1
- no_person_time -= 1 #相当于半休息模式
- else:
- if person_pin.value() == 1:
- led_state = "sit"
- sum_sit_time += 1
- sit_time += 1
- else:
- led_state = "no_person"
- sum_rest_time += 1
- no_person_time += 1
- def check_alarm_condition():
- """检查报警/重置条件"""
- global sit_time, no_person_time, led_state
- # 条件1:有人超过xx分钟 → 触发报警
- if sit_time > PERSON_ALARM_THRESHOLD:
- led_state = "alarm"
- # 条件2:无人时间超过(久坐时间每5分钟需要1分钟休息时间) → 重置所有计时
- if no_person_time > (NO_PERSON_RESET_THRESHOLD+round((sit_time - PERSON_ALARM_THRESHOLD) / 300)*60):
- sit_time = 0
- no_person_time = 0
- # 有人每过5分钟 → 无人时间清0
- if sit_time % 300 == 0:
- no_person_time = 0
- def control_led_by_state():
- """根据状态控制LED,注意取反值"""
- if led_state == "alarm":
- # 报警:高亮闪烁(亮0.5秒,灭0.5秒)
- led_pwm_pin.duty(0) # 最大亮度(10位PWM:0-1023)
- time.sleep(0.5)
- led_pwm_pin.duty(1023)
- time.sleep(0.5)
- if led_state == "sit":
- # 有人:低亮度常亮(50%亮度)
- led_pwm_pin.duty(512)
- time.sleep(1)
- if led_state == "stand_working":
- # 有人:低亮度常亮(10%亮度)
- led_pwm_pin.duty(920)
- time.sleep(1)
- if led_state == "no_person":
- # 无人:熄灭
- led_pwm_pin.duty(1023)
- time.sleep(1)
-
- # 启动Web服务
- web_log.start()
- # ===================== 主循环 =====================
- if __name__ == "__main__":
- # print("定时休息提示器启动...")
- try:
- while True:
- update_person_state() # 更新人体状态
- check_alarm_condition() # 检查报警/重置条件
- control_led_by_state() # 控制LED
- # 打印调试信息
- tm = time.localtime()
- time_str = f"{tm[3]+8:02d}:{tm[4]:02d}:{tm[5]:02d}"
- web_log.log_print(f"{time_str}\nsum_sit:{sum_sit_time//60}m,sum_rest:{sum_rest_time//60}m,sum_stand:{standing_work_time//60}m\n{led_state},sit:{sit_time//60}m,no_person:{no_person_time//60}m\n")
- web_log.process_request()
- except KeyboardInterrupt:
- # 终止程序时关闭PWM
- led_pwm_pin.deinit()
- led = Pin(8, Pin.OUT) # 重新初始化 GPIO8 为数字输出
- led.value(0) # LED常亮以方便看设备是否开启
- print("程序终止!")
复制代码 web_log.py
webrepl_cfg.py
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|