|
× | 1 | ||||||
|
× | 1 | ||||||
|
× | 1 | ||||||
|
× | 1 | ||||||
|
× | 1 | ||||||
|
快速入门指南中介绍了NodeMCU上的ESP8266芯片,这是一种超低功耗芯片,只利用太阳能就可以运行。
“菲莱”着陆器登陆彗星让我们深受启发,于是我们从前段时间开始开展低功耗的研发项目,其中假设我们只能利用太阳能对电池充电,在一定时间内进入睡眠状态,从而在某个事件中唤醒。
信息更新:目前已证实的一点是,这个项目通过只利用太阳能而持续了三天/夜,这听起来也许不算什么,但是别忘了,我们在用200mA的锂聚合物电池运行一个非常耗电的wifi模组,同时利用一个小型的0.5W 太阳能板发电。比较而言,如果不利用一些诀窍的话,锂聚合物电池经过一个小时后电量就会耗尽了。 我们应用的诀窍如下:
SparkFun ESP8266是一个很好的开发板,不过首先我们想让这个芯片也能用于NodeMCU,这样就可以不需要Arduino(TM) IDE,而直接使用LUA脚本语言为芯片编码。此外,我们还使用LUA脚本语言控制芯片的休眠模式(关闭不使用的组件),将其唤醒运行任务(像不像在现实生活中)。通过这种方式,我们可以只利用太阳能,而不用电源使ESP8266和 ESP8226运行起来。顺便说一下,我们只是用一个太阳能板和锂聚合物电池,没用什么昂贵的太阳能充电器!
将开发板和锂聚合物电池连接起来
切掉载板后部DTR(数据终端就绪)的痕迹,从而实现串口调试,同时烧录新的固件。
在Raspberry Pi上安装ESP8266工具链
除了为存储ESP8266而需要安装编译器和工具之外,还需要将3.3VFTDI与ESP8266适当地连接起来。
1. ESP工具——基于python用于存储ESP8266的工具
wget --no-check-certificate https://github.com/themadinventor/esptool/archive/master.zip
unzip master.zip
cd esptool-master
sudo python setup.py install
2. LUA工具——利用LUA脚本语言编码的库和示例
wget --no-check-certificate https://github.com/4refr0nt/luatool/archive/master.zip
unzip master.zip
3. NODEmcu—— 基于EPS8266支持LUA编码的固件
wget --no-check-certificate https://github.com/nodemcu/nodemcu-firmware/archive/master.zip
unzip master.zip
将最新版NODEmcu固件烧录至ESP8266:
pi@raspberrypi ~/esp/nodemcu-firmware-master/pre_build/latest $
python /home/pi/esp/esptool-master/esptool.py --port /dev/ttyUSB0 write_flash 0x00000 nodemcu_latest.bin
Connecting...
Erasing flash...
Writing at 0x00062000... (100 %)
Leaving...
完成——存储固件后,在开始下一步之前重启一次。
现在开始下载自动运行的LUA脚本,使ESP8266连接至接入点:
pi@raspberrypi ~/esp/luatool-master/luatool $
python /home/pi/esp/luatool-master/luatool/luatool.py --port /dev/ttyUSB0 --src init.lua --dest init.lua --verbose
Set timeout None
Set interCharTimeout None
Upload starting
Stage 1. Deleting old file from flash memory
->file.open("init.lua", "w") -> ok
->file.close() -> ok
Stage 2. Creating file in flash memory and write first line->file.remove("init.lua") -> ok
Stage 3. Start writing data to flash memory...->file.open("init.lua", "w+") -> ok
->file.writeline([==[print('init.lua ver 1.2')]==]) -> ok
->file.writeline([==[wifi.setmode(wifi.STATION)]==]) -> ok
->file.writeline([==[print('set mode=STATION (mode='..wifi.getmode()..')')]==]) -> ok
->file.writeline([==[print('MAC: ',wifi.sta.getmac())]==]) -> ok
->file.writeline([==[print('chip: ',node.chipid())]==]) -> ok
->file.writeline([==[print('heap: ',node.heap())]==]) -> ok
->file.writeline([==[-- wifi config start]==]) -> ok
->file.writeline([==[wifi.sta.config("
SSID
","
passkey
")]==]) -> ok
->file.writeline([==[-- wifi config end]==]) -> ok
->file.writeline([==[wifi.sta.connect()]==]) -> ok
->file.writeline([==[tmr.alarm(1, 1000, 1, function()]==]) -> ok
->file.writeline([==[if wifi.sta.getip()== nil then]==]) -> ok
->file.writeline([==[print("IP unavaiable, Waiting...")]==]) -> ok
->file.writeline([==[else]==]) -> ok
->file.writeline([==[tmr.stop(1)]==]) -> ok
->file.writeline([==[print("ESP8266 mode is: " .. wifi.getmode())]==]) -> ok
->file.writeline([==[print("The module MAC address is: " .. wifi.ap.getmac())]==]) -> ok
->file.writeline([==[print("Config done, IP is "..wifi.sta.getip())]==]) -> ok
->file.writeline([==[-- dofile ("web.lua")]==]) -> ok
->file.writeline([==[end]==]) -> ok
Stage 4. Flush data and closing file->file.writeline([==[end)]==]) -> ok
->file.flush() -> ok
->file.close() -> ok
--->>> All done <<<---
现在开始监视NODEmcu控制台,同时可以看到LUA脚本的输出:
pi@raspberrypi ~ $
screen /dev/ttyUSB0 9600
NodeMCU 0.9.5 build 20150214 powered by Lua 5.1.4
lua: cannot open init.lua
>
由于init.lua未启动,RESET、POWER ON/OFF也未启动,所以输入dofile(“init.lua”)
不能执行脚本。
NodeMCU 0.9.5 build 20150214 powered by Lua 5.1.4
init.lua ver 1.2
set mode=STATION (mode=1)
MAC: 18-FE-34-9D-B9-2A
chip: 10336554
heap: 17184
> IP unavaiable, Waiting...
IP unavaiable, Waiting...
ESP8266 mode is: 1
The module MAC address is:
Config done, IP is 192.168.2.115
>
完成——现在将ESP8266连接至接入点,显示出DHCP的IP地址。
将你的数据传到云端!
你可以将附件中的示例传至ThingSpeak云端,不过也可以改一下传输路径,将数据传输到你喜欢的服务器上。
MCU中的ESP8266中具有有高频时钟和应用处理功能,所以在正常运行时,Wifi即便没有传输数据也会消耗将近100mA多的电量。 可以通过以下两种方法来降低功耗:一、关闭高频时钟(需要LUA 指令);二、将 ESP8266设置为睡眠模式(像着陆器登陆彗星之后一样)。关掉除定时器之外的所有组件以唤醒ESP8266:深度睡眠模式下的电耗约为88uA。这个一般芯片的电耗差别很大。
node.dsleep(microSecs);
下面是一个睡眠60秒之后等待唤醒的示例:
node.dsleep(60000000);
这就是我们采用的诀窍!在特定的时间内将ESP8266设置为深度睡眠模式,并根据这一时间唤醒芯片。你需要将XDP 连接至DTR(最好使用跨接线)。如果你想利用外部某个器件(如外触发器)将ESP8266从深度睡眠状态中唤醒,将DTR连接至GND就可以轻松搞定这一点。
Sparkfun: “XPD管脚连接至DTR时,就不能对ESP8266进行编程了。在试图上传一个示意图,要确保不要将这两个管脚连接起来。”
此外,如果你想利用串口线来监管ESP8266,要确保不要将DTR连接至FTDI。
若想获得更多信息,可点击(外部链接):
https://www.sparkfun.com/news/1842
https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide/all#example-sketch-goodnight-thing-sleep-mode
http://tim.jagenberg.info/2015/01/18/low-power-esp8266/
http://blog.hekkers.net/2015/02/26/esp8266-in-deep-sleep/
http://blog.hekkers.net
第一个原型已完成...将R4设置为10K,从而将充电电流降低为100mA...使用一个200mAh的锂聚合物电池和一个5V 100mA的太阳能板...确保这个太阳能板的电压不超过6V...下图是详细的电路修改(我们不能保证是否可以修改,你自己承担其中的风险):
如果太阳板最大程度地暴露在阳光下,黄灯就会亮;充电后红灯会亮...一切都会正常运作,但不要忘记使用深度睡眠模式...否则太阳能和电池的这么少的电量不会持续太久!
充电后会显示标记(1):平均电流为77,2 mA 。连接WiFi后基站开始运作,随后开始搜索DHCP的IP地址,向云端发送一个数据帧。调至深度睡眠模式后出现标记 (2):平均电流为7,8 mA。连接WiFi之后,最高值为383mA。
为什么电流依然很高?这主要与LED灯的状态有关。接下来我们不会给LED供电(通过停冲和断电两种方式)。
深度睡眠模式下的实际电耗为88uA!这简直太棒了,:-)
充电后又显示标记(1) :平均电流为72,5 mA,WiFi处于使能状态,调至深度睡眠模式之后,显示标记(2)为88.8 uA。连接WiFi后最高值为213 mA。
测示显示了60秒的深度睡眠和唤醒的测试周期:
最后将太阳能板连接到USB接口(电压最高为6V):
现在我们再测试一次:短暂的唤醒状态之后进入60s的深度睡眠状态(见上图的峰值)。现在你可以看到平均电流是负值:-4.5 mA。这一点非常棒,因为晴天时我们可以将平均值为4.5mA的电流充回锂聚合物电池,ESP8266在深度睡眠时,我们的电是用不完的。
完成——只利用一个小型的太阳能板,而不需要外部电源就就可以让特别耗电的ESP8266运行起来,我们已向你证明了这一点。
如果是在夜间或者阴天时,可以采用以下方法:
· 利用更大的太阳能板,以供应更多的电
· 减少唤醒次数,如:1次/小时
· 只在白天传输数据
· 利用一个更高效的太阳能充电器(100mA中最高为25mA)
· 利用可充电电池,相对于锂聚合物电池,这样就可以利用更多的电
· 利用BLE,而不用WiFi(这个选择是明智的)。
· 利用你自己的诀窍(若想分享可以评论一下本文)
经验之谈(关闭LED灯,R4 = 10kΩ,关闭FET/二极管)利用选好的太阳能板进行充电,平均电流为12 mA
· 晚间:利用平均电流为7mA的锂聚合物电池,每60s唤醒一次;
· 多云时:利用平均电流为5mA的锂聚合物电池,每60s唤醒一次;
· 晴天时:利用平均电流为-5mA的锂聚合物电池,每60s唤醒一次;
· 利用无休眠模式的平均电流为75 mA的锂聚合物电池,而不需用太阳能板,但要注意:传输越多的数据,就会利用更多的电量(>260 mA)——要避免这种情况,否则电量很快就会用尽。
我们来计算一下:
· 无阳光状态下利用200 mAh的锂聚合物电池,平均电流为5 mA,这样会持续40小时;
· 白天时为锂聚合物电池充电,平均电流70 mAh,持续时间为14小时
· 晚间锂聚合物电池耗电,持续时间为10小时
利用一些诀窍可以使电量持续应用数年。例如,一小时内只唤醒一次(与每分钟唤醒一次相比),这样你就可以减低电耗了.......晚间不传输数据(只计算数据),这样锂聚合物电池就会消耗更少的电。
为了只利用太阳能而实现为期一周的测试,我们利用5分钟的睡眠模式!阴天时可利用备用的锂聚合物电池,以提供70%的电量。
为了进一步使EPS8266项目操作起来更为简单,我们开始为ESP-12(如Adafruit开发板)开发一个印刷开发板,其中涉及本项目的最新发现成果:
利用太阳能的 ESP-12开发板,调节阀在背面
组件和电源
|
× | 1 | ||||||
|
× | 1 | ||||||
|
× | 1 | ||||||
|
× | 1 | ||||||
|
× | 1 | ||||||
|
nodemcu自动运行之后开始调用 init 脚本,脚本语言为LUA,根据你的Wifi AP改变SSID和口令, 下次重启后如果想让thing.lua自动运行, 去掉注释 dofile ("thing.lua")。
print('init.lua ver 1.2') wifi.setmode(wifi.STATION) print('set mode=STATION (mode='..wifi.getmode()..')') print('MAC: ',wifi.sta.getmac()) print('chip: ',node.chipid()) print('heap: ',node.heap()) -- wifi config start wifi.sta.config("SSID","passkey") -- wifi config end wifi.sta.connect() tmr.alarm(1, 1000, 1, function() if wifi.sta.getip()== nil then print("IP unavaiable, Waiting...") else tmr.stop(1) print("ESP8266 mode is: " .. wifi.getmode()) print("The module MAC address is: " .. wifi.ap.getmac()) print("Config done, IP is "..wifi.sta.getip()) -- dofile ("thing.lua") end end)
ort = 80 function sendData() t1=adc.read(0) print("VOC:"..t1.." C\n") -- conection to thingspeak.com print("Sending data to thingspeak.com") conn=net.createConnection(net.TCP, 0) conn:on("receive", function(conn, payload) print(payload) end) -- api.thingspeak.com 184.106.153.149 conn:connect(80,'184.106.153.149') conn:send("GET /update?key=YOURWRITEKEY&field1="..t1.." HTTP/1.1\r\n") conn:send("Host: api.thingspeak.com\r\n") conn:send("Accept: */*\r\n") conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n ") conn:send("\r\n") conn:on("sent",function(conn) print("Closing connection") conn:close() end) conn:on("disconnection", function(conn) print("Got disconnection...") end) end -- send data every X ms to thing speak tmr.alarm(0, 10000, 1, function() sendData() end )
将模拟传感器的数据传至云端,从而实现数据可视化,利用 ThingSpeak 写入密钥取代 YOURWRITEKEY。
init.lua——电量测试周期LUA
FileToExecute="pw.lua" l = file.list(); for k,v in pairs(l) do if k == FileToExecute then print("*** You've got 5 sec to stop timer 0 ***") tmr.alarm(0, 5000, 0, function() print("Executing ".. FileToExecute) dofile(FileToExecute) end) end end
pw.lua——电量测试周期LUA
每60s进行一次深度睡眠...在唤醒状态下可在此执行ESP8266 代码...现在我们将睡眠时间从60s改为300s(即5分钟)。
interval = 60000000 node.dsleep(interval-tmr.now())
原文来源:https://www.hackster.io/
原文标题:Tame the beast: Ultra-Low Power #ESP8266 Thing (Uses LUA and solar panels)
原文地址:https://www.hackster.io/fablabeu/esp8266-thing-by-sparkfun