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
发表评论