Aaa kotki dwa - czyli jak skutecznie uśpić ESP-12
Dziś spróbujemy wprowadzić nasz moduł w stan uśpienia. Do wyboru jest kilka modów ograniczenia prądu pobieranego przez procesor. tu>>>>>>>>>
Mode
|
Min
|
Typical
|
Max
|
Units
|
802.11b,
CCK 1Mbps, POUT=+19.5dBm
|
215
|
mA
|
||
802.11b,
CCK 11Mbps, POUT=+18.5dBm
|
197
|
mA
|
||
802.11g,
OFDM 54Mbps, POUT=+16dBm
|
145
|
mA
|
||
802.11n,
MCS7, POUT =+14dBm
|
135
|
mA
|
||
802.11b,
packet size of 1024 bytes, -80dBm
|
60
|
mA
|
||
802.11b,
packet size of 1024 bytes, -70dBm
|
60
|
mA
|
||
802.11b, packet
size of 1024 bytes, -65dBm
|
62
|
mA
|
||
Standby
|
0.9
|
uA
|
||
Deep sleep
|
10
|
mA
|
||
Saving
mode DTIM 1
|
1.2
|
mA
|
||
Saving
mode DTIM 3
|
0.86
|
mA
|
||
Shutdown
|
0.5
|
uA
|
Najlepiej opisany i najprostszy do wdrożenia jest "deep sleep".
W tym celu należy:
- Zewrzeć piny RST i GPIO 16
- Wywołać procedurę >>> ESP.deepSleep(10* 1000 * 1000); <<< w nawiasie przykładowe wprowadzenie w stan uśpienia na 10sek (1 = 1 us)
- warto po tej procedurze dodać delay(100)
- czekać
- po 10 sek procesor się samo-resetuje (pin 16 jest ustawiany na 0)
- ot i wszystko - działa
- jeśli w miejsce czasu wstawimy 0 to moduł nie wybudzi się timerem ale będzie musiał być wzbudzony przez zewnętrzny RST
W moim układzie w tym stanie pobór prądu spadł z 70 do 12 mA. Niby 6 x mniej ale 12mA to o rząd za dużo by zasilić to wszystko z bateryjki.
A jeszcze do tego należy rozewrzeć RST i GPIO 16 podczas programowania modułu.
Ponadto okazało się że moduł jest bardzo wrażliwy na przyłączenia na GPIO 15. Miałem na ten pin podane wyjście z odbiornika 433MHz. Wszystko ładnie pracuje do momentu wyłączenia napięcia. Po ponownym załączeniu moduł się wiesza - trzeba go ręcznie zresetować poprzez RST. Odłączenie odbiornika i pozostawienie tego pinu w stanie pull-down przywraca prawidłowe działanie ESP.
W literaturze stanowczo zalecają omijanie szerokim łukiem pinów 0, 2 i 15 do wykorzystania we własnych aplikacjach. Jeśli dodamy do tego piny 6-11 zarezerwowane dla komunikacji wewnętrznej z pamięcią to okazuje się że na 16 pinów ESP tak naprawdę swobodnie możemy dysponować tylko GPIO 4,5,12,13,14. Pięć portów na 16 + ewentualnie dwa (Tx Rx) jeśli dobrze pokombinujemy i jeden analogowy. Hmm niewiele tego jest.
Stąd wniosek, kupowanie bardziej rozbudowanych w piny modułów ESP nie ma żadnego sensu (np ESP-12) lepiej już kupić ESP-07 z porządniejszą antenką na płytce i możliwością przyłączenia dodatkowej zewnętrznej. Pewnie dlatego pojawiła się wersja ESP-14 z dodatkowym 8-bitowym STM8S udostępniająca 22 piny i 5 wejść analogowych. Ale prawdę powiedziawszy wolę już układ ESP z Arduino ze względu na mnogość sprawdzonych bibliotek.
Tak więc ESP w roli samodzielnej pozostanie u mnie li tylko w niewielkich projektach i to raczej tam gdzie będę musiał stosować zasilanie bateryjne. Tylko te 12 mA...
Wracam więc do usypiania. 12 mA to stanowczo za dużo.
Ale Internetowa akademia mówi, że w stanie deep sleep mają być uA a nie mA. Szukam jeszcze raz danych.
Rzeczywiście. W tabelce zamieszczonej tutaj>>>
Mode | Min | Typ | Max | Unit |
Transmit 802.11b, CCK 1Mbps, POUT=+19.5dBm | 215 | mA | ||
Transmit 802.11b, CCK 11Mbps, POUT=+18.5dBm | 197 | mA | ||
Transmit 802.11g, OFDM 54Mbps, POUT =+16dBm | 145 | mA | ||
Transmit 802.11n, MCS7, POUT=+14dBm | 135 | mA | ||
Receive 802.11b, packet length=1024 byte, -80dBm | 60 | mA | ||
Receive 802.11g, packet length=1024 byte, -70dBm | 60 | mA | ||
Receive 802.11n, packet length=1024 byte, -65dBm | 62 | mA | ||
Standby | 0.9 | mA | ||
Deep sleep | 10 | uA | ||
Power save mode DTIM 1 | 1.2 | mA | ||
Power save mode DTIM 3 | 0.86 | mA | ||
Total shutdown | 0.5 | uA |
Deep sleep to 10 uA a nie 10 mA. 1000x mniej! Ktoś łże.
Wracam do płytki i zasilam ją bezpośrednio z napięcia 3,3V
Stan pracy - 75 mA
Stan deep sleep - 470 uA
No tak - miliampery brał przecież stabilizator 5/3,3V.
470uA - całkiem nieźle. Nie mam jak sprawdzić gdzie wycieka mi ta różnica pomiędzy 10 a 470 uA bo wymagało by to prucia pracowicie poskładanej płytki prototypowej. Na razie to bez znaczenia. Przy takim poziomie poboru prądu praca z baterii nabiera sensu. Szczególnie że mam pewien pomysł.......
Całą procedurę usypinia można sobie skomplikować dodając dodatkowy parametr
ESP.deepSleep(uint32_t time_us, RFMode mode = RF_DEFAULT)
RF mode może przyjmować warości od 0-4
- RF_DEFAULT = 0, //RF_CAL depends on init data from byte 108
- RF_CAL = 1, //RF_CAL enabled causes large current drain after wake 170mA
- RF_NO_CAL = 2, //RF_CAL disabled, small current drain after wake 75mA
- RF_DISABLED = 4 //RF disabled, smallest current drain after wake 15mA
Wejście analogowe
ESP-07, 08 i 12 mają dodatkowo wyprowadzony na zewnątrz płytki pin wejścia 10 bitowego przetwornika analogowo-cyfrowego. Szkoda że tylko jedno. Przetwornik czyta się standardowo
pomiar = analogRead(A0);
Wadą jest również zakres pomiarowy - 0 - 1 V co dla 10 bitów daje rozdzielczość 100uV . A więc na poziomie szumów. Pewnie praktycznie do wykorzystania będzie 8 bitów.
Ale ESP ma jedną ciekawą właściwość związaną z wejściem ADC (czasami nie wiedzieć czemu nazywanym również TOUT)
można nim pomierzyć napięcie zasilania wewnątrz układu (na pinie 3 i 4)
W tym celu należy
- wejście ADC ma wisieć w powietrzu nie podłączone
- zadeklarować ADC_MODE(ADC_VCC)
- w pętli głównej odczytać
float
voltaje=0.00f;
voltaje = ESP.getVcc();
Serial.print(voltaje/1024.00f);
Serial.println(" V");
voltaje = ESP.getVcc();
Serial.print(voltaje/1024.00f);
Serial.println(" V");
i powinno uzyskać się wynik w Voltach
Ale są jakieś dodatkowe warunki których nie bardzo rozumiem
- The 107th byte in esp_init_data_default.bin(0~127byte) must be 0xFF
- RF must be enabled (pewnie coś związane z wywołaniem funkcji DeepSleep)
Brak komentarzy:
Prześlij komentarz