1. 程式人生 > >超低功耗晶片ESP8266

超低功耗晶片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未啟動,RESETPOWER 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連線至接入點,顯示出DHCPIP地址。

步驟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後基站開始運作,隨後開始搜尋DHCPIP地址,向雲端傳送一個數據幀。調至深度睡眠模式後出現標記 (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開發板,調節閥在背面

元件和電源

圓柱型鋰離子電池- 3.7v 2200mAh

大功率——以下針對太陽能開發板

× 1

200mAh or 400mAh的鋰聚合物電池

小功率——太陽能開發板只需一塊小的電池

× 1

0.5W太陽能板

小功率——太陽能開發板需要最高點壓5.5V、電流110mA的太陽能板


電路圖

改進的鋰聚合物電池——從太陽能板輸入


編碼
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,