买了几个ESP-01s, 和一个继电器模块来接入Home Assistant做WiFi开关,长这样:
这个小板子用的是GPIO 0 来控制继电器,但是发现ESP8266 有个bug,上电的时候他的GPIO 0会抖动一下,导致接到这个口的继电器会跳一下。翻了一下网上的解决方案,大概有几种:
1. 额外增加启动电路,前500ms禁止光耦输出。Esp8266上电时IO抖动解决方案_sxyandapp的博客-CSDN博客_esp01s上电抖动,这种方法要重新自己做PCB,懒,放弃。
2. 在GPIO口接电解电容来消除上电抖动,这种方法可能需要比较大的电容才能奏效。比方说这篇文章他推荐了220uf消除esp8266上电时继电器抖动的几种方法-Arduino爱好者 - Powered by Discuz!。这么干会弄一个巨大的电容塞进这个板子上,难看而且占地方。
3. 使用安全IO,github上也有讨论 GPIO Pins goes "HIGH" a short pulse on boot · Issue #421 · nodemcu/nodemcu-firmware · GitHub,他们称之为safe io, 大概意思可能就是有一些io上电的时候不会跳,比方说串口RX口,硬件学习_ESP8266_IOT_ESP-01(S)继电器模块_简单解决ESP8266上电IO抖动_YelloooBlue的博客-CSDN博客_esp01s继电器引脚,这篇文章就把继电器板子上原来的GPIO 0割断了,把RX飞线过去了。但我想保留这个串口后面可能飞线接其他传感器,就算了。
4. 在2那个链接里面,有一个评论说可以把消抖电容接到光耦输出上,因为光耦输出电流比较小,电容也可以不大,于是这个方法是我的首选。
如下图,R2电阻两端并联电容就行了,由于R2被PC817光耦挡住,不太好焊接,我就直接焊到三极管的那两个引脚上了,他们是等效的。
我就直接上100uf了,最后效果图如下:
测试了一下,上电抖动现象消失。开启继电器的延迟几乎感觉不到,关闭继电器的延迟大概有0.5秒的样子。