使用ESP8266、NodeMCU、机智云改造传统插座为智能插座
我买了某品牌的LED灯 ,可以通过手机App控制开关状态和亮度,晚上睡觉前躺着就能关灯,大大方便了我等懒人。拆开一看,发现其核心部分是一片Wi-Fi模块 ,电路也不算复杂,我觉得可以自己DIY一个,就去网上淘了几个ESP8266模块和基于该模块的NodeMCU开发板,打发空闲时间。
本人有一点51单片机和Keil基础,但对于Wi-Fi模块来说还是个 “小白”,仅简单地了解过NodeMCU固件,后来发现了机智云平台能够根据需求在云端生成代码,下载后简单地改一下就能用了,平台还提供手机端App 。用了七八天的空闲时间,我终于完成了Wi-Fi插座的制作。
ESP8266芯片是乐鑫生产的,而我们买到的ESP-XX模块是安信可用乐鑫的模块再加上必要电路形成的一个单片机最小系统。机智云提供了云平台并可在云端生成代码,生成的代码是建立在安信可SDK的基础上,然后又添加了自己的一些控制协议。下面我们就以控制一个LED的亮灭为例,看看具体怎么操作吧!
在线生成机智云代码
在机智云官网注册一个账号,然后登录 ,进入开发者中心创建新产品。产品名称就叫LEDtest吧 ,选 择 “Wi-Fi/移动网络方案”,通信方式和数据传输方式保持默认即。
接着新建数据点。
本次制作只是控制一个LED的开关, 所以我只定义了一个最简单的可写布尔型数据点,也就是说只有开和关这两种状态。
在MCU开发页面中选择SOC方案和自己的硬件平台 ,注意这里的单位是 Mbit ( 4 MB= 32Mbit) 。在基本信息中复制 Product Secret后粘贴,然后生成代码包。
搭建开发环境
开发环境我选择了AiThinker_IDE, 因为它不需要安装 Linux,也不需要虚拟机,在Windows下直接解压就能使用。下载解压后先运行ConfigTool.exe,单击“Default” 后 ,再选择 “Save” 。
打开AiThinker_IDE. exe,这里会用到DotNetFx40 Framework,以前没安装的话可能会提示安装。打 开 “File”, 单 击 “Import”,选择下图所示的文件。
然后单击 “Next”, 选择下载到的机智云代码主目录 。
修改程序
打开主目录下的 Makefile,把下图所示的红框内容按照实际情况进行修改。
修改参数如下:
BOOT?=none: 不使用 boot
BOOT?=old: 用老版本的 boot_*v l . l +
BOOT?=new: 使用新版本的 boot_ v l.2+
APP?=0: 不使用远程升级 F0TA
APP?=1: 使用FOTA, 生成 user1.<flash_map>.<BOOT>.bin
APP?=2: 使用 FOTA, 生成 user2.<fiash_map>.<BOOT>.bin
SPI 工速度和模式,一般不用改动,保持默认即可。
SPI SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP: Flash映射方式
注意:有人说用的是多少MB的Flash就写多少,本人试过2MB和4MB都没问题,但用1MB的Flash写SPI_SIZE_MAP?=1时,编译失败。
这里还要修改几个选中的文件,我们一个一个来吧。
要实现控制LED的亮灭或继电器的吸合,需要用到一个变量,我们先在 gizwits_ ptoduct.h 中声明一下。因为只有开和关2个状态,用bool型就可以,这有点像KeilC51中的bit类型。
别忘了在gizwits_ product.c中进行初始化设置,这里设置LED是低电平点亮,上电初始化为高电平,默认不点亮。
往下拉,找到 gizwitsEventProcess 函数。这个函数的作用是用云端数据点的值 CurrentDataPoint.valueLED 来控制LED等需要控制的实际电路,当云端为1时(ON),我们自己定义的变量STA=0,LED点亮;云端为0时(OFF),则STA=1,LED熄灭。
继续向下 ,修改userHandle用户定 时器的回调函数,默认为1000ms调用一次 ,也可以在 gizwits_ protocol.c文件中修改 USER_TIME_MS,此处调用时间修改为100ms。把 STA赋值给实际操作的 GPIO来完成 LED的亮灭 ,并把本地状态与云端完成同步。
文件最下面,初始化云端数据点的值。
接下来 ,打开 user_main.c文件, 找到下图所示的位置。
云端生的代码默认定义了2个按键,而我们只需要1个就够了。NodeMCU开板的Flash按键接在 GPIO0 引脚。在定义按键时要注意 GPIO 的命名规则,比如GPIO1在程序里要写为U0TXD,这对初学者来说是要重点注意的地方。Inst Name、 GPIO 和 NodeMCU 的对照关系,如图所示。
在user_main.c 文件中把与Key2有关的函数都删掉。在Key1ShortPress函数里添加 “STA= ! STA; ”, 即每次短按把STA取反,也就是说短按点亮 LED,再按一下LED灯灭 。
Key1LongPress里还有—句 “gizwitsSetMode(WIFI_ AIRLINK_ MODE)”, 其作用是在长按按键时让 ESP8266 模块进入配对模式,此时开发板右上角LED点亮 ,然后通过手机 App把模块接入Wi-Fi。
再往下就是GPIO 的初始化。ESP8266 模块右上角有一个 LED接到了 GPIO2 , 在程序中配置一下用作配对指示 。开发板靠近Micro USB的LED接在了 GPIO16 ,这就是我们最终要控制的指示灯了。值得注意的是,GPIO16的控制与其他端口的控制是不同的。
下图所示是按键与LED的电路图。
到这里程序就修改完了,仔细检查确认无误后保存。在最左侧C/C + + Projects窗口主目录上单击鼠标右键,选择 “Build Project”。如果没有错误,就会看到生成了 user1.4096.new.4.bin 等文件,如下图所示。没看到的话说明程序有错误,请仔细确认。
打开ESP8266烧写工具ESPFIashDownloadTool_ v3 .6.4,选择ESP8266 DownloadTool,按照图所示进行配置 。
设置好后单击 “START”,下载完成后按一下模块的 Reset,模块端配置完成。
手机端配置
在机智云官方网站完成下载安装机智云App,并打开App。
账号 、密码页面直接选跳过,点击右上角的 “ + ”号 ,选一键配置后输入当前手机所连接的 SSID和 Wi-Fi密码。
进行下一步 ,模组类型选择乐鑫,在出现 “通电后按以下提示操作”后(如图所示) ,长按 NodeMCU开 发 板 Flash按键 ,右上角 LED点亮后,点 击 “我已完成上述操作”, 稍等一会儿会提示完成设备添加。
试着划动 “开启/关闭”按钮,看NodeMCU开发板上的LED是否可以正常亮灭。
按动NodeMCU开发板上的Flash按键,LED亮灭的同时,手机 App上的开关状态也应同步开关。
到这里,我们已完成了DIY—个Wi- Fi插座的所有知识介绍。接下来找出洞洞板,抄起电烙铁,开工制作。
实际制作
我找出以前买来的3位插排。拆掉开关和接线端子,用腾出来的空间安装220V转 5V 开关电源、ESP8266控制板和继电器,把开关盖用热溶胶固定在原来的位置。在确定可以放下2个继电器后,我决定做2路的智能插座,剩下的1路用来做常通插座。
找一个手机5V适配器,去掉外壳和USB 接口以减小体积。
电路用洞洞板简单搭一下,ESP07 小板加上 LDO、阻容、继电器,一会就焊好 了 。
修改上面调试好的程序,把数据点改成 2个 , 编译完成后烧写到模块,然后用热熔胶固定。高压 、低压之间记得用塑料片隔离,安全第一。
因为没有按键作AIRLINK,所以我将程序改为上电后30s未连接到Wi-Fi自动切换为AIRLINK配网模式,同时板载的蓝色LED点亮, 因为很少会用到此功能,且从侧面也能看到灯光,就没有额外开LED孔位。
在手机端输入Wi-R的SSID和密码就能把插排接入互联网,测试正常后,把插座装好,就可以投入使用了。
智能插排的用途可以自由发挥,只要是能用开关控制的电器都可以接入,比如USB小灯、 普通风扇、电动车充电(可以将程序改为开启后定时关闭)等 。