HA改造鱼缸第三弹:用ESP8266给它升个级

MAKER: 店长大人

之前家里鱼缸灯坏掉了,于是我用Ardunio做了驱动,使用Zigbee跟搭载Home asssistant的树莓派通讯,实现了远程控制。因为当时还剩下个原装的温度传感器没有接入,趁着年货节,我淘了个ESP8266,准备把Arduino替换下来,一个10+RMB块钱的ESP8266就可以解决的事情,没必要把80多块钱的Arduino放在那么潮湿的环境中。

材料清单

– 树莓派,挂载了Home assistant系统,配置好远程访问。
具体看我之前的总结:https://shumeipai.nxez.com/2020/01/07/raspberry-pi-homeassistant-wechat-mini-programs-connect-smart-home.html
– NTC 温度传感器,因为我鱼缸自带的就是这种热敏电阻式传感器,50K的,觉得还可以,其实就是个电阻。
– ESP8266模块,自带GPIO管脚。我用的是NodeMCU V2版的。超级好用啊,有木有!如下图

– 分压电阻,NTC这种传感器在ESPhome中配置需要加个分压电阻,我用的是51K的,主要跟我的NTC在25度温度下阻值相差不大。其实分压电阻不宜太小,也不要太大,1/3左右是个不错的选择。
– 12V RGB灯及部分驱动电路。这个是之前的,我没有更改,3个TIP41三极管做开关元件,驱动12VRGB灯。

一、在树莓派上配置ESPHome

ESPhome是个开源固件+配置平台,适用于ESP家族的开发板。
先在树莓派上安装ESPhome,这样我们可以用它来给8266开发板刷固件。
1、树莓派命令行使用以下代码安装esphome:

sudo pip install tornado
sudo pip3 install esphome

安装好以后,使用以下命令开打esphome:

sudo esphome config/ dashboard

如下图

然后命令行会开始显示对应启动日志,我们打开浏览器,输入树莓派ip的加esphome端口6052即可访问:
xxx.xxx.xxx.xxx:6052

如下图:因为我已经配置过一个8266了,所以主页面会有个设备。若第一使用,主页是空的,点击右侧红色添加按钮即可进行添加设备生成一个标准yaml配置文件。此时8266可以暂时先不连接到树莓派。

点击红色添加按钮后,我们按照顺序进行填写配置就好。

1、填写设备名称,此处你可以自定义一个名字。如下图

2、接下来,进入设备硬件选择,请核对你手中的ESP设备对应选择,如我手中的是nodemcu,我直接选nodemcu即可:

3、填写WiFi信息,并设置外部访问密码,该密码等会连接HA时需要。请填写家里的2.4Gwifi网络信息。我手中的8266反正不支持5G wifi频段。

4、最后一步,配置成功。哈哈哈。此时,你就可以点击当前设备上的edit按钮来检查下生成的配置文件信息。如下图:



到这里,基本信息已经配置好了。接下来我们要手动编辑设备操作代码了:

1、灯光控制的配置,配置中gpio端口号可以直接写8266板子上标识的号码。根据我提前绘制的电路图,我选择D1~D3分别为RGB三色的驱动管脚,此处引入ESPHome官方platform: RGB。

配置如下:

这样就可以点击右下角保存了。
2、执行编译并上传。
请将你的ESP8266通过mini-usb口接入树莓派的USB口,此时,主页右上角应该会提示新接入外部设备端口。如下图。


选择这个ttyUSB设备,先确认设备条上绿灯亮起,代表8266模块已经正常连接,然后点击VALIDATE按钮,进行配置验证,验证通过会提示VALIDATED,并出现👍图标。确认一切没有问题,就可以点击UPLOAD进行固件上载了。

第一次固件上载,ESPhome会自动下载并加载编译环境,可能耗时比较长,请耐心等待,我第一上载时,由于网络问题,编译环境依赖一直下载不到,只好等到第二天,网络好了才搞定。一般来讲,只要是出现绿色,就说明一切OK,进程中会有各种成功的提示,请耐心等待。如下图:

到这里,配置工作基本完成了。你只需要把模块从树莓派上取下来,然后放到它应该存在的电路中,供电即可,它会自动进行网络连接。后期如果需要修改配置并重新上传,只要你的ESP8266模块可以连接网络。我们可以就使用OTA模式,没必要用线再连接。OTA连接就在主页右上角的选择中,后期操作都可以使用OTA的方式。
配置好了接下来,我们开始把它接入HA。

二、HA连接ESP模块

浏览器访问HA主页,基于HA和ESPhome的无缝衔接,基本上配置好ESP8266模块后,HA会自动识别它,你只需要输入访问密码即可一键绑定。进入HA主页-配置-集成页面,点击添加按钮,列表中选择ESPhome,找到设备,输入访问密码即可:

添加完毕后,返回HA主页,添加实例,此时就会把ESP8266上你写入的灯的实例显示在HA上。如下图,嗯很炫酷的样子:

三、关于那根NTC传感器的接入

接入这根传感器其实很痛苦,主要坑太多,好在最后成功。我在这里稍微说下应该避免的坑:
1、NTC传感器在使用时,最好接入分压电阻。如下图:

R1这个分压电阻阻值可以自定义。具体大小可以根据手中的NTC电阻来计算。

2、NTC传感器,要明确B值,即25度下的电阻值,这个在ESPhome的函数中是需要填入的,如果你不确定,那可以根据官方文档,使用三个参考量,让ESPhome后台帮你计算。具体填写格式如下:
已知B值:

# Example configuration entry
sensor:
  - platform: ntc
    # ...
    calibration:
      b_constant: 3950
      reference_temperature: 25°C
      reference_resistance: 10kOhm

未知B值:

# Example configuration entry
sensor:
  - platform: ntc
    # ...
    calibration:
      - 10.0kOhm -> 25°C
      - 27.219kOhm -> 0°C
      - 14.674kOhm -> 15°C

这些在ESPhome官方文档中都有,可以去查看。链接如下:
https://esphome.io/components/sensor/ntc.html
3、最重要的也是最坑的一个。ESP8266这个模块,它获取参考电压的管脚是A1,但是A1会把它获取到的电压自动等比转化为0-1V的对应值。也就是说,你的Vout实际电压是1.5V(VCC=3.3V),而A1反馈给MCU的值却是0.454V,但是,但是,MCU根据NTC的线性函数计算时,它使用的默认VCC参考电压却是3.3V。所以计算出来的结果完全不对,坑啊。所以此处要在配置中添加参数项,对参考电压进行修改或者也可以按照比例放大A1输入到MCU的值。两种方法只修改一个就好,若同时都修改了,又是错。具体方法如下:

a.修改A1的比例:

sensor:
  - platform: adc
    # ...
    filters:
      - multiply: 3.3

b.修改VCC参考电压

# Example configuration entry
sensor:
  - platform: resistance
    sensor: source_sensor
    configuration: DOWNSTREAM
resistor: 5.6kOhm
reference_voltage: 1.1V
    name: Resistance Sensor

四、成品图


五、贴我的yaml完整代码出来,仅供参考

esphome:
  name: my_esp8266
  platform: ESP8266
  board: nodemcuv2

wifi:
  ssid: "xxxxxxxxxxxxxxx"
  password: "xxxxxxxxxxxxx"
  
  manual_ip:
    static_ip: 192.168.31.41
    gateway: 192.168.31.1
    subnet: 255.255.255.0
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "My Esp8266 Fallback Hotspot"
    password: "L9BOEwztGylf"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "xxxxxx"

ota:
  password: "xxxxxx"
  
output:
  - platform: esp8266_pwm
    pin: D3
    frequency: 1000 Hz
    id: pwm_b
  - platform: esp8266_pwm
    pin: D2
    frequency: 1000 Hz
    id: pwm_g
  - platform: esp8266_pwm
    pin: D1
    frequency: 1000 Hz
    id: pwm_r
 
light:
  - platform: rgb
    name: "12Vrgb"
    red: pwm_r
    green: pwm_g
    blue: pwm_b
    
sensor:
  - platform: ntc
    sensor: resistance_sensor
    calibration:
      b_constant: 3950
      reference_temperature: 25°C
      reference_resistance: 50kOhm
    name: NTC Temperature

  # Example source sensors:
  - platform: resistance
    id: resistance_sensor
    sensor: source_sensor
    configuration: DOWNSTREAM
    resistor: 51kOhm
    name: Resistance Sensor
  - platform: adc
    id: source_sensor
    pin: A0
    filters:
      - multiply: 3.3
    update_interval: never
switch:
  - platform: gpio
    pin: D0
    id: ntc_vcc

interval:
  - interval: 60s
    then:
      - switch.turn_on: ntc_vcc
      - component.update: source_sensor
      - switch.turn_off: ntc_vcc

坐沙发

发表评论

你的邮件地址不会公开


*