本次制作中将要用到的是ESP-01S WIFI模块。选择它的原因主要是小巧,内置MCU并自带WIFI功能,同时价格也是非常便宜,因此也被广泛用于物联网项目中,不过在这些应用中ESP-01S大都是以从机方式工作,主机通过AT指令与之通讯。不难看出,这种方式虽然降低了开发难度,却也造成了一定的资源浪费,同时在性能上也带来一些损失。
以下是ESP8266常见的几种开发模式:
AT指令方式。这是最常见的开发模式,也是最简单的一种方式,只要通过串口发送AT指令就可以控制,适合大多数具有串口的单片机系统。
直接使用SDK开发。这个难度比较大,需要对芯片和SDK提供的API比较熟悉。
NodeMCU方式。借助NodeMCU物联网开发平台,使用Lua脚本开发。需要额外烧写固件。
Arduino方式。无需额外烧写固件,有丰富的第三方库资源。
MicroPython方式。与Arduino方式类似,但是需要额外烧写固件。
相比较而言,以上的5种开发方式中,个人比较推荐使用Arduino方式,主要在于Arduino使用的是大家都熟悉的C/C++语言,另外还有丰富的第三方库文件可以用来实现开发。MicroPython作为后来者虽显劣势,却也是来势汹汹,大有锐不可挡之势,未来谁主天下也未尝可知。
因为本文将要介绍的氛围灯制作就要用到Arduino IDE,所以这里简单讲一下如何构建适合ESP8266开发的Arduino IDE环境。
- 打开Arduino IDE,依次点击菜单项“文件”->“首选项”,然后会看到“附加开发版管理器网址”,填入http://arduino.esp8266.com/stable/package_esp8266com_index.json ,确认后重启IDE。
- 打开Arduino IDE,依次点击菜单项 “工具”->“开发板”->“开发板管理器”,搜索“ESP”,即可看到ESP8266社区提供的ESP8266插件,选择最新的版本并安装。
- 接下来在Arduino IDE菜单“工具”->“开发板”中选择你正在使用的ESP8266开发板即可。
至此,Arduino IDE中ESP8266的开发环境就搭建完毕了。
下面进入正题,介绍如何在Arduino IDE开发环境中,制作这款ESP-01S的氛围灯。这款氛围灯主体为一个玻璃的矿泉水瓶,电路部分藏身于瓶盖中,主控采用ESP-01S WiFi模块,通过控制WS2812B全彩环形灯实现不同灯光模式的呈现。你能想象下图中这个看似平淡无奇的水瓶,在改制成氛围灯后,到底会呈现出怎样奇幻的效果呢?让我们拭目以待吧!
材料清单
实物接线图
相比于ESP-01模块,ESP-01S模块的GPIO0、RST、EN均已配置上拉,使用时会方便些,这里将GPIO0作为微动按键的输入端,模块上电时长按微动按键使GPIO0为低电平即可进入程序烧写模式。
实物装配
图中需要用到的元器件实物,分别是Micro USB接口板、ESP-01S模块、5V转3.3V模块、WS2812BRGB全彩环形灯。
按照前面的实物接线图,用导线将各模块连接起来,这样硬件连接部分差不多就好了。
接下来把瓶盖处理一下,需要使用钻头和刻刀在其侧面开出微动按键及Micro USB的孔位。要想把孔的位置和大小做得比较精确的话,手头没有合适的量具,只能反复的比对。
将前面焊接好的模块放置到瓶盖中。由于导线用的有点粗了,装配时遇到不小的麻烦,好在最后还是把所有的东西都塞下了。
这是将所有模块都安装到位后的样子,看起来是不是整齐多了。
先上个电试下灯。OK!没有问题,彩灯全亮了!怎么样?看起来效果还是十分酷炫吧!
把瓶盖装回去是这个样子的。经过精心测量,按键的孔位以及按键的高度都恰到好处,手按过去不觉得突兀,按起来也不费力。
软件编写
首先打开Arduino IDE,在菜单“工具”->“开发板”中选择你正在使用的ESP8266开发板即可。这里我们选“Generic ESP8266 Module”。
在Arduino IDE中,对WS2812B全彩LED的控制,可以通过引用Adafruit NeoPixel库来实现。不需要自己花时间钻研WS2818B的手册后再来编写驱动代码。这就是Arduino开源平台最值得称道之处,有非常丰富的第三方库函数可用,真是省时又省力,可以说是瞬间拉低了程序员的门槛。如果你的Arduino IDE中没有NeoPixel库,可以通过菜单“工具”->“管理库...”或“项目”->“加载库”->“管理库...”,搜索“NeoPixel”即可看到Adafruit NeoPixel库,选择最新版本安装即可。
要使用NeoPixel库函数,在源文件中把相关的头文件包含进来就可以了。推荐使用傻瓜式操作,通过菜单“项目”->“加载库”从右侧弹出的库列表中选择“NeoPixelBus”即可。
编辑器自动将以下三个头文件NeoPixelAnimator.h、NeoPixelBrightnessBus.h、NeoPixelBus.h添加至源代码中。另外,为了实现单按键操作,引入Ticker库用来对按键计时,以实现对短按、长按操作进行识别。
通过模版类NeoPixelBus创建strip对象,实现对WS2812B全彩的操控。这里选择NeoGrbFeature、NeoEsp8266AsyncUart1Ws2812Method类定义的方法实现WS2812B要求的控制协议。PixelCount的数值按所用灯环中LED灯珠的数目设置。PixelPin是用来指定控制WS2812B模块的引脚,对于ESP8266的板子来说可以忽略,默认就是使用GPIO2。
接下来就是氛围灯功能实现部分的代码,主要实现这样功能:按键短按时,可在纯色模式和旋转流水灯模式下,指定灯光颜色,有红、橙、黄、绿、青、蓝、紫、白八色可选;按键长按约1秒时,可顺序切换四种灯光模式,纯色模式、旋转流水灯模式、彩色渐变模式、幻彩模式;按键长按约5秒时,关闭灯光。具体的实现方法可以参考附件中的代码,限于篇幅这里就不一一介绍了。
代码烧写
烧写代码时,按下图将USB串口工具与ESP-01S连接好即可。需要注意的是,在上电时,将ESP-01S模块的GPIO0脚接地即可进入代码烧写模式。
给ESP-01S模块烧写代码与通常情况下对Arduino UNO烧写几乎没有差别。只是因为ESP-01S模块是通过串口工具供电,所以每次烧写前需要将USB串口工具从电脑的USB口拔除,然后将ESP-01S模块得GPIO0拉低,重新将USB串口工具插到电脑的USB口,这样重新上电后ESP-01S即可进入烧写状态。注意!因为串口工具有拔插过,所以烧写时要在到菜单 “工具”-〉“端口”中选择对应的串行口。
****成品效果****
终于到了最后展示成果的时间了,灯光亮起的瞬间感觉有些惊艳到了,从LED发出的各色光线经过水瓶的折射,光影交织竟然呈现出五彩斑斓、五光十色、万紫千红、鲜艳夺目、斑驳陆离、五彩纷呈、花团锦簇、云蒸霞蔚、花色斑斓、姹紫嫣红、云兴霞蔚、五颜六色、异彩纷呈的奇幻景象,折腾多日也算是值了。
下面是动图的效果。转化为GIF颜色有些损失,成色块了,感觉也不错哦,又是另外一番效果。
你还等什么,赶快也动手做一个吧!