背景
家里养了几盆花,有时长时间出门,总是担忧家里的花浇水的问题。
一开始想利用家里的树莓派直接做一个就好,看了一圈之后决定还是找个别的单片机/开发板来做,看ESP8266平台基础的NodeMCU很便宜,那么就是它了。
也许有人会说,为啥不买现成的成品,买成品还有diy的乐趣么?
ESP8266/NodeMCU简介
ESP8266是一块由乐鑫espressif设计的wifi芯片,虽然是个无线网络解决方案,但是它更像一个物联网解决方案,体积很小,造价低廉。
ESP8266的核心是一块Diamond Standard 106Micro
控制器,该控制器是一个低功耗的32位RISC控制器,拥有GPIO、I2C、ADC等多个模块。
NodeMCU的项目发起人黄锐想在自己的项目中使用WiFi芯片,选型时选择了ESP8266,在了解了ESP8266的内核之后,发现芯片性能颇为强大,于是与开源社区爱好者zeroday商量之后,发起了NodeMCU项目。
现在的ESP8266已经支持多种开发方式,如AT指令
、C
、Python
、Lua
、Ardunio
等。
开始折腾
X宝上随便找了一家,将所有的配件全部买齐,清单如下:
- NodeMCU开发板 * 1
- 5v光耦隔离继电器驱动模块(支持高低电平出发) * 1
- 5v小水泵 * 1
- 杜邦线若干
- 水管若干
拿到之后就坑了,使用putty通过COM口连接,可以联通但收不到任何信息,仔细观察了一下,发现Wifi模块的屏蔽壳跟引脚搭锡短接,万幸的是没有造成损坏,只好自己用壁纸刀稍微割几下。
再次上电,终于可以正常操作了。
刷入MicroPython固件
大D不了解Lua,所以还是使用最熟悉的Python
,MicroPython
是微控制器的精简版本。
配置环境
有多种方式可以给ESP8266刷固件,这里就直接用官方提供的esptool,早期的esptool只提供Python 2.x的版本,现在已经支持Python 3了,直接通过pip安装即可。
1 |
pip install esptool |
安装工具的过程需要根据自己的Python环境来看,例如在多Python版本共存的Windows上,可以选择:
1 |
py -3 -m pip install esptool |
清空flash
有的时候,写入固件后会有各种问题,所以为了保险起见,先将固件清空。
1 |
py -3 -m esptool -p COM7 erase_flash |
其中,COM7为端口号,可以在设备管理器内查看。如果是Linux系统,则可以通过查看/dev
来知道连接位置。
写入固件
1 |
py -3 -m esptool -p COM7 write_flash 0x0 固件.bin |
同样,其中的COM7为端口号,0x0为写固件的地址,后面跟固件名。
固件下载地址:http://micropython.org/download#esp8266
建议使用稳定版本。
写完固件后,按板子上的RST键重启开发板,即可使用putty连接上去。
开启Wifi
使用putty连接之后,如果需要开启wifi,那么可以输入以下代码:
1 2 3 4 |
import network wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("ssid名称", "wifi密码") |
使用webrepl上传main.py
开发板写入了MicroPython的固件之后,每次启动会找寻是否存在main.py文件,如果有则执行该文件的内容。那么我们需要使用webrepl来进行上传。
1 2 3 4 5 |
# 加载webrepl_setup库 import webrepl_setup # 执行后会询问你是否每次启动时都运行,建议输入E来选择是。 # 然后要你设置一个webrepl的访问密码。 |
设置完成开发板重启之后,可以访问:
http://micropython.org/webrepl/
会看到如下界面:
这里就有两种选择:
- 一是打开该页面后断开当前网络,通过无线网连接到NodeMCU的AP上,然后直接点击Connect连接。
- 二是让NodeMCU连接到wifi上,通过路由分配的IP地址来连接。
这两种方式根据个人的情况来选择就好了。
将写好的main.py
文件通过webrepl的send a file功能发送到开发版上即可。
大D是使用第二种方法,然后将连接wifi的代码写进main.py
,每次启动开发板都可以自动wifi连接,十分方便。
控制GPIO
要自动浇花,其实说白了就是通过开发板来通过高低电平控制继电器的闭合与断开,再由继电器来控制小水泵抽水,所以最关键的部分就是控制GPIO来说输出高低电平。
MicroPython内建了machine
库来支持开发板的硬件控制部分。
这里提供一个针脚定义的图片。
那么这里以控制GPIO13为例,Python代码如下:
1 2 3 4 5 6 7 8 |
import machine # 定义GPIO13为输出接口 p13 = machine.Pin(13, machine.Pin.OUT) # 输出高电平 p13.on() # 输出低电平 p13.off() |
能够控制继电器就等于是大功告成了,至于定时,最简单的方式是使用time.sleep
来睡眠等待,大D也是这样做的,具体的实现代码相当的简单,也就不放出来了。
接入继电器
大D使用的就是下图这种1路光耦隔离继电器驱动模块,之所以没有直接采购继电器,是因为由于ESP8266输出的电流较小,如果直接采购继电器,需要搭建一个扩流驱动电路来驱动继电器。
有这种便宜模块用,直接就上这种模块就是了。
DC+/DC-接入NodeMCU的3.3V/GND脚,根据定义,GPIO13在板上的编号为7,那么将IN接入7脚。
另一侧的端口有三个,分别为NC常闭口,NO常开口,COM公共口。
NC口为继电器未闭合时与COM口短接导通,闭合时悬空断开。
NO口为继电器未闭合时悬空断开,闭合时与COM口导通。
根据实际代码编写的情况将水泵的一根电源线剪开,接入继电器的COM口和NC口(或者NO口)即可。
测试时,当p13.on()
执行时,就可以听到继电器闭合的哒哒声。
实验视频
还是上个小视频好了,泵选的有点小,有条件的可以找个大点的泵,从一个桶里抽水上来。