『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 3088|回复: 26

[经验分享] 小制作:用电池供电的esp8266+aht20温度计

[复制链接]

43

主题

202

帖子

925

积分

高级会员

Rank: 4

积分
925
金钱
723
HASS币
0
发表于 2024-5-14 11:17:41 | 显示全部楼层 |阅读模式
本帖最后由 inevitab 于 2024-5-14 16:03 编辑

先上实物图:

屏幕截图 2024-05-14 100545.png

至于外壳,随便找个纸盒装起来吧。
--------------------------------------------------------

目标:冰箱里放了一瓶82年的雪碧,要时刻监测冰箱温度

选材:家里没什么智能设备,只有几个wifi插座,不想为了一个温度计而去增加zigbee或者蓝牙网关,所以做了一个wifi温度计

供电:使用两节5号电池,或者1节18650电池。直接供电,不用降压不用稳压。

难题:对电池用说,esp8266和esp32都很耗电,非常耗电,极其耗电,所以要采用深度睡眠的模式以便省电

元件:
物联网模块选择esp32还是esp8266的问题,因为esp8266可以不增加任何硬件直接测量供电电压,而esp32不行,所以选择了esp8266。这个问题的讨论: https://community.home-assistant ... ing-on-esp32/723904
注意有些esp8266存在深度睡眠后无法唤醒的问题,上图中的就是,这个问题的讨论和解决办法: https://community.home-assistant.io/t/esp8266-how-to-wake-up-from-deep-sleep/724978

API:
这里使用mqtt而不是esphome原生api,因为网上有人说“esphome原生api不是为电池供电的设备而设计的,它建立连接速度慢”,我实测也是这样,mqtt比esphome快。这里说的是启动后首次连接api速度,不是连接wifi速度。


电路图不画了,说下接线方法:
aht20模块电源正负极接电池,SDA和SCL分别接到esp8266的SDA和SCL脚;
esp8266模块电源正负极接电池,不用降压和稳压。gpio16和rst脚直连。如果你的esp8266模块有不能唤醒的bug,可以在GPIO7(即SDD0)和电源正极之间接一个10K电阻。LED灯是模块自带的,内部接GPIO2脚。

程序设计:
为了省电,设计上设备每隔N分钟唤醒一次,唤醒后暂时不开启wifi功能,检测温度,如果温度相比于上次变化大于M度,则启动wifi,将温度上报给home assistant。
实测睡眠时耗电20uA,此阶段时长可自行设置,一般几分钟到几十分钟;唤醒不开启wifi时耗电20mA,此阶段约持续1s;连接wifi后耗电80mA,此阶段约持续3-5s。

esphome代码:

substitutions:
  name: "mqtt-temperature-esp12f-01" 
  friendly_name: "MQTT_Temperature_esp12f_01"
  i2c_sda_pin: "SDA" #温度传感器引脚
  i2c_scl_pin: "SCL" #温度传感器引脚
  led_pin: "2" #LED灯引脚
  sleep_duration: "300s" #温度检测间隔时间
  temperature_change: "0.2" #温度变化多少度才联网上报温度

  #下面的设置可以不管
  project_name: "shan."
  force_connect_api_after_boot_count: "20" #唤醒多少次后强制上报数据,即使温度没有变化
  api_keep_run_duration: "1s"


esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  on_boot:
    priority: 249
    then:
      - light.turn_on: status_led1

      - globals.set:
          id: my_global_boot_count
          value: !lambda return id(my_global_boot_count)+1;
      
      # 每启动N次,强制连接一次api
      - if:
          condition:
            lambda: return id(my_global_boot_count) > atoi("${force_connect_api_after_boot_count}");
          then:
            - globals.set:
                id: my_global_boot_count
                value: !lambda return 0;
            - globals.set:
                id: my_global_prevent_goto_sleep_when_update_ath20
                value: !lambda return true;
            - wifi.enable:

esp8266:
  board: esp12e
  restore_from_flash: true

preferences:
  flash_write_interval: 0s

# Enable logging
logger:

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: True
  enable_on_boot: False
  ap:
    ssid: "MQTT_Temperature_esp12f_01"
    password: ""

mqtt:
  broker: !secret mqtt_ip
  username: !secret mqtt_username
  password: !secret mqtt_password
  on_connect: 
    then:
      - light.turn_on: status_led1
      - globals.set:
          id: my_global_update_count
          value: !lambda return id(my_global_update_count)+1;
  
      - globals.set:
          id: my_global_prevent_goto_sleep_when_update_ath20
          value: !lambda return true;

      - delay: ${api_keep_run_duration}
      - script.execute: try_goto_sleep
  on_disconnect: 
    then:
      - light.turn_off: status_led1

  birth_message:
  will_message:

  on_message:
    - topic: "${name}/ota_mode"
      payload: 'ON'
      then:
        - deep_sleep.prevent: deep_sleep_1
        - globals.set:
            id: my_global_btn_status
            value: !lambda return true;
        - mqtt.publish:
            topic: "${name}/ota_mode"
            payload: ""
            retain: True

output:
  - platform: gpio
    id: led1
    pin:
      number: GPIO2
      inverted: True

light:
  - platform: status_led
    name: "Switch state"
    id: status_led1
    output: led1
    internal: True

i2c:
  sda: ${i2c_sda_pin}
  scl: ${i2c_scl_pin}
  scan: true
  id: bus_a

globals:
  - id: my_global_update_count
    type: int
    restore_value: true
    initial_value: '0'
  - id: my_global_boot_count
    type: int
    restore_value: true
    initial_value: '0'
  - id: my_global_sensor_temperature
    type: float
    restore_value: true
    initial_value: '0'
  - id: my_global_btn_status
    type: bool
    restore_value: false
    initial_value: "false"
  - id: my_global_prevent_goto_sleep_when_update_ath20
    type: bool
    restore_value: false
    initial_value: "false"

sensor:
  - platform: wifi_signal
    name: "WiFi Signal dB"
    id: sensor_wifi_signal_db
    update_interval: 1s

  - platform: adc
    pin: VCC
    name: "VCC Voltage"
    id: sensor_vcc
    # force_update: True
    update_interval: 1s

  - platform: aht10
    variant: AHT20
    id: sensor_aht20
    temperature:
      name: "AHT20 Temperature"
      on_value:
        then:
          - if:
              condition:
                lambda: return fabs(x - id(my_global_sensor_temperature)) > atof("${temperature_change}");
              then:
                # 避免在下次on_value时进入睡眠
                - globals.set:
                    id: my_global_prevent_goto_sleep_when_update_ath20
                    value: !lambda return true;
                - globals.set:
                    id: my_global_sensor_temperature
                    value: !lambda return x;
                - if:
                    condition:
                      wifi.connected:
                    then:
                    else:
                      - wifi.enable:
              else:
                - if:
                    condition:
                      lambda: return id(my_global_prevent_goto_sleep_when_update_ath20);
                    then:
                    else:
                      - script.execute: try_goto_sleep

    humidity:
      name: "AHT20 Humidity"

    update_interval: 1s

script:
  - id: try_goto_sleep
    then:
      if:
        condition:
          lambda: return id(my_global_btn_status);
        then:
          # 不睡眠
        else:
          - deep_sleep.enter: deep_sleep_1

deep_sleep:
  id: deep_sleep_1
  #允许内核运行时间
  run_duration: 60s
  #深睡眠时长 
  sleep_duration: ${sleep_duration}


home assistant截图:

屏幕截图 2024-05-14 105935.png

OTA更新代码方法:
home assistant配置 - 设备与服务 - MQTT - 选项,如下图设置发送一个mqtt消息,注意将mqtt-temperature-esp12f-01改成你自己的设备name

屏幕截图 2024-05-14 110321.png

然后等待设备上线,上线后,设备会保持唤醒状态不再睡眠,就可以用常规方法通过wifi更新代码了,更新完后设备会自动重启,自动重新进入睡眠和唤醒的循环。

耗电情况:
这是5-3开始使用到今天5-14的电池电压变化情况。
为了方便测试,我设置的唤醒时间间隔是2分钟,实际使用中可以设置为10分钟、30分钟甚至1小时,这样续航会大大提升。
另外,我的是定频冰箱,冰箱内温度变化比较频繁,如果你的是变频冰箱,温度比较稳定,少开冰箱门,续航也会大大提升。


屏幕截图 2024-05-14 121111.png


来源: https://blog.01on.com/archives/345









评分

参与人数 4金钱 +46 收起 理由
litchiate + 8 感谢楼主分享!
kaka0992 + 10 感谢楼主分享!
sorrypqa + 16 高手,这是高手!
jjcs + 12 高手,这是高手!

查看全部评分

回复

使用道具 举报

47

主题

1655

帖子

6684

积分

论坛元老

Rank: 8Rank: 8

积分
6684
金钱
5019
HASS币
40
发表于 2024-5-14 11:25:34 | 显示全部楼层
支持,但是wifi做低功耗太困难了
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

146

主题

2267

帖子

7004

积分

元老级技术达人

积分
7004
金钱
4732
HASS币
30
发表于 2024-5-14 11:53:13 | 显示全部楼层
有没有计算过,大概能用多久
回复

使用道具 举报

34

主题

709

帖子

4693

积分

论坛元老

Rank: 8Rank: 8

积分
4693
金钱
3974
HASS币
50
发表于 2024-5-14 11:53:50 | 显示全部楼层
两节5号电池是3V电压,带得动吗?
一节18650电池满电可以到4.2V,不会烧吗?
回复

使用道具 举报

5

主题

97

帖子

1945

积分

论坛DIY达人

积分
1945
金钱
1848
HASS币
0
发表于 2024-5-14 11:58:58 | 显示全部楼层
收藏一下,也是对WiFi低功耗感兴趣,
回复

使用道具 举报

43

主题

202

帖子

925

积分

高级会员

Rank: 4

积分
925
金钱
723
HASS币
0
 楼主| 发表于 2024-5-14 12:06:11 | 显示全部楼层
huang7dede 发表于 2024-5-14 11:53
两节5号电池是3V电压,带得动吗?
一节18650电池满电可以到4.2V,不会烧吗? ...

没问题,我都是亲自测试过才发上来的。

5号电池我用的是充电的,充满后两节一共3.6v左右。
4.2V不会烧。
回复

使用道具 举报

43

主题

202

帖子

925

积分

高级会员

Rank: 4

积分
925
金钱
723
HASS币
0
 楼主| 发表于 2024-5-14 12:14:10 | 显示全部楼层
bugensui 发表于 2024-5-14 11:53
有没有计算过,大概能用多久

更新了耗电情况,请看帖子
回复

使用道具 举报

51

主题

1340

帖子

5600

积分

论坛DIY达人

积分
5600
金钱
4260
HASS币
20
发表于 2024-5-14 12:54:18 | 显示全部楼层
大佬们都开始玩电池了,学习一下,谢谢分享!
回复

使用道具 举报

17

主题

188

帖子

1789

积分

金牌会员

Rank: 6Rank: 6

积分
1789
金钱
1601
HASS币
0
发表于 2024-5-14 12:56:35 | 显示全部楼层
感谢楼主分享,然后后续电池使用情况再持续更新一下,方便我们参考
回复

使用道具 举报

34

主题

709

帖子

4693

积分

论坛元老

Rank: 8Rank: 8

积分
4693
金钱
3974
HASS币
50
发表于 2024-5-14 14:51:42 | 显示全部楼层
这个项目可以,如果能稳一个月还是有搞头,收藏了
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 00:27 , Processed in 0.146090 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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