超低功耗晶片ESP8266
快速入門指南中介紹了NodeMCU上的ESP8266晶片,這是一種超低功耗晶片,只利用太陽能就可以執行。
專案介紹
“菲萊”著陸器登陸彗星讓我們深受啟發,於是我們從前段時間開始開展低功耗的研發專案,其中假設我們只能利用太陽能對電池充電,在一定時間內進入睡眠狀態,從而在某個事件中喚醒。
資訊更新:目前已證實的一點是,這個專案通過只利用太陽能而持續了三天/夜,這聽起來也許不算什麼,但是別忘了,我們在用200mA的鋰聚合物電池執行一個非常耗電的wifi模組,同時利用一個小型的0.5W 太陽能板發電。比較而言,如果不利用一些訣竅的話,鋰聚合物電池經過一個小時後電量就會耗盡了。 我們應用的訣竅如下:
SparkFun ESP8266是一個很好的開發板,不過首先我們想讓這個晶片也能用於NodeMCU,這樣就可以不需要Arduino(TM) IDE,而直接使用LUA指令碼語言為晶片編碼。此外,我們還使用LUA指令碼語言控制晶片的休眠模式(關閉不使用的元件),將其喚醒執行任務(像不像在現實生活中)。通過這種方式,我們可以只利用太陽能,而不用電源使ESP8266和 ESP8226執行起來。順便說一下,我們只是用一個太陽能板和鋰聚合物電池,沒用什麼昂貴的太陽能充電器!
將開發板和鋰聚合物電池連線起來
步驟1
切掉載板後部DTR(資料終端就緒)的痕跡,從而實現串列埠除錯,同時燒錄新的韌體。
步驟2
在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:
[email protected] ~/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連線至接入點:
[email protected] ~/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指令碼的輸出:
[email protected] ~ $
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地址。
步驟3
將你的資料傳到雲端!
你可以將附件中的示例傳至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。
若想獲得更多資訊,可點選(外部連結):
太陽能
第一個原型已完成...將R4設定為10K,從而將充電電流降低為100mA...使用一個200mAh的鋰聚合物電池和一個5V 100mA的太陽能板...確保這個太陽能板的電壓不超過6V...下圖是詳細的電路修改(我們不能保證是否可以修改,你自己承擔其中的風險):
如果太陽板最大程度地暴露在陽光下,黃燈就會亮;充電後紅燈會亮...一切都會正常運作,但不要忘記使用深度睡眠模式...否則太陽能和電池的這麼少的電量不會持續太久!
功耗除錯
為了將功耗降低至 uA單位,我們需要深入瞭解ESP8266的功能...從下面的截圖中可以看到利用Keysight N6781A記錄的當前資料。
充電後會顯示標記(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 | |||||
|
電路圖
改進的鋰聚合物電池——從太陽能板輸入
編碼
init.lua
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)
thing.lua
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,