Tak wyszło 😂 Lecz dziś zajmiemy się płytką ESP8266 z znanym nam już DS18B20.
Założenia:
- małe rozmiary
- energooszczędność
- ładne wykresy
- monitorowanie napięcia zasilania i jakości sygnału Wi-Fi
Użyte elementy:
- ESP8266-12e wraz z podstawką
- Czujnik temperatury DS18B20
- Ogniwo Li-Ion 18650
- Ładowarka do ogniw TP4056 wraz z zabezpieczeniem przed zbyt dużym rozładowaniem
- Stabilizator HT7333
- Kondensator 2200uF
- Rezystor 4,7kOhm
Rys.1 Schemat połączeń płytki
Zasilanie
Ponieważ ogniwo 18650 wraz z zabezpieczeniem dostarcza od 4,2 do 2,5 V ,a ESP8266 działa stabilnie przy 3,3V należy stabilizować napięcie.
Najważniejszy parametr jakiego szukamy w dokumentacji to "voltage drop-out" czyli jaki najmniejszy spadek napięcia będzie na stabilizatorze.
Popularny LM1117 nie nadałby się zbyt gdyż spadek w nim to około 1-1,2V więc potrzebowalibyśmy zasilać go przynajmniej 4,3-4,5V.
Z pomocą przychodzi nam stabilizator HT7333 którego spadek napięcia to tylko 90mV !
Dodatkowo koszt 10 sztuk u Chińczyków to około 1$!
Zastosowałem również kondensator elektrolityczny o pojemności 2200uF aby ograniczyć "piki" poboru prądu przez ESP.
Rys.2 Nota katalogowa HT7333
Stabilizator pasuje idealnie do podstawki do naszego ESP
Rys.3 Przykład kiepskiego lutowania
Usypianie:
Z moich pomiarów wynika że ESP podczas łączenia się z siecią Wi-Fi oraz wysyłając dane na serwer pobiera 70-73mA podczas uśpienia tylko 0,23mA! To świetny wynik, dzięki tak głębokiemu uśpieniu nasz czujnik będzie bardzo długo działał na jednym ogniwie.
ESP.deepSleep(3600000000,WAKE_RF_DEFAULT);
Wartość 3600000000 to godzina w mikrosekundach.
Samo usypianie realizowane jest programowo, należy pamiętać aby pin GPIO16 podłączyć do resetu. Odpowiada on za reset urządzenia po określonym interwale czasu.
Wizualizacja danych:
Na rynku jest sporo serwisów umożliwiających magazynowanie i wizualizację danych wysyłanych przez nasze urządzenia. Oczywiście moglibyśmy zbudować własny tego typu system chociażby na RPi Zero. Po przeglądnięciu kilku serwisów zdecydowałem się jednak na io.adafruit.com.
2 czujniki (w pokoju i na balkonie) działają już około miesiąca i nie było problemów z serwisem.
Rys.4 Wykresy z io.adafruit.com
Sam serwis jest bardzo łatwy w obsłudze. Po rejestracji otrzymujemy swój indywidualny klucz "AIO KEY" który należy zadeklarować w programie
#define AIO_KEY "INDYWIDUALNY KLUCZ ADAFRUIT"
możemy go sprawdzić w zakładce "settings" na swoim koncie io.adafruit.com. Przy pierwszej wysyłce danych do serwisu zostaną stworzone "feeds" z taką nazwą jaka została podana w programie
sendToAIOFeed("temperatura", temp);przykładowo do "temperatura" wysyła zmienną temp.
Jeśli już mamy jakieś dane wysłane do serwisu, wchodzimy w zakładkę Dashboards i tworzymy nowy. Gdy mamy nowy "dashboard" wchodzimy w niego i możemy dodawać wykresy i zegary aby wizualizować dane. Cały proces jest bardzo prosty i nie powinien sprawić trudności 😂
Działanie programu:
ESP8266 łączy się z siecią domową, odczytuje dane : temperaturę, napięcie zasilania i siłę sygnału Wi-Fi, wysyła dane na serwer adafruit i usypia się na godzinę. Wbudowany timer nie jest na tyle dokładny aby odliczyć dokładnie godzinę przy głębokim uśpieniu dlatego zazwyczaj jest to 53-55 minut.
ADC_MODE(ADC_VCC); //ustawiane adc jako odczyt napięcia zasilania
#include <ESP8266WiFi.h>
#include <math.h>
#include <Adafruit_IO_Client.h>
float temp; //zmienna temp zmiennoprzecinkowa aby wysyłać dokładny pomiar
int WiFiStrength = 0;
#include <OneWire.h> //ds18b20
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5 // do pinu GPIO5 podłączony czujnik ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define SSID "NAZWA SIECI WIFI"
#define PASSWORD "HASŁO DO WIFI"
#define AIO_KEY "INDYWIDUALNY KLUCZ ADAFRUIT"
void setup() {
delay(10);
connectToWiFi();
sensors.begin();
}
void connectToWiFi(){
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void loop() {
sensors.requestTemperatures();
temp=sensors.getTempCByIndex(0); // przypisanie odczytu do zmiennej temp
double volts = ESP.getVcc(); // przypisanie odczytu do zmiennej volts
WiFiStrength = WiFi.RSSI(); // pobranie dBm z ESP8266
sendToAIOFeed("napiecie", volts); //
sendToAIOFeed("sygnal", WiFiStrength);
sendToAIOFeed("temperatura", temp);
ESP.deepSleep(3600000000,WAKE_RF_DEFAULT); // usypianie na konkretny czas
delay(100);
}
void sendToAIOFeed(const char* feed, double val){ //wysyłanie do adafruit
WiFiClient client;
Adafruit_IO_Client aio = Adafruit_IO_Client(client, AIO_KEY);
Adafruit_IO_Feed testFeed = aio.getFeed(feed);
aio.begin();
testFeed.send(val);
}
Wersja zewnętrzna została wyposażona w dwa ogniwa 18650 połączone równolegle. Jest zamknięta w obudowie zmontowanej z doniczki i kilku podstawek z wyciętym dnem tak aby była cyrkulacja powietrza a jednocześnie woda nie dostawała się do środka. Ogniwa 18650 jak czytamy w dokumentacji mogą działać do -20 stopni !
Rys.5 nota katalogowa ogniw 18650
Rys.6 Mało estetyczna obudowa
Jeśli ktoś byłby zainteresowany odczytami z moich czujników to zapraszam na
Jeden z najlepszych tekstów na temat ESP8266. Ja zabrałem sie za to samo w lua i ugrzęzłem na wysyłaniu danych do ThingSpeak.com. Jako router wykorzystuję telefon i dane nie przechodzą. Chanel na serwerze jest skonfigurowany dobrze bo z ręki działa.
OdpowiedzUsuńDziękuję :) Korzystałem z ThingSpeak, jednak wykresy w io.adafruit.com są w mojej ocenie dużo czytelniejsze. Thingspeak wprowadził niedawno ograniczenie roczne co do wysyłania danych. Czyli jak rozumiem przy połączeniu z siecią domową działa a gdy internet udostępnia telefon to już nie ?
UsuńNie mam w domu routera. Internet na kartę w modemie wpiętym do komputera lub w telefonie udostępniam internet (tethering). Esp łączy sie z telefonem ale dane nie pokazują się na chanelu ThingSpeak. Jak wysłałem z ręki to mam trzy punkty na wykresie.
UsuńSprawdzał Pan czy ESP poprawnie łączy się z siecią ? Jakiś przykład z małym serwerem ? Co znaczy "wysyłać z ręki" ? :)
UsuńTakim poleceniem można wysyłać dane do ThingSpeak: http://api.thingspeak.com/update?key=&field1=15.5678
OdpowiedzUsuńi zobaczyć efekt tutaj: https://thingspeak.com/channels/264743
A jeśli chodzi o łączenie sie z internetem to dostaję zwrotnie odpowiedź na terminal (LUA) :
print("Setting up WIFI...")
wifi.setmode(wifi.STATION)
--modify according your wireless router settings
wifi.sta.config("Redmi","moje hasło")
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()== nil then
print("IP unavaiable, Waiting...")
else
tmr.stop(1)
print("Config done, IP is "..wifi.sta.getip())
dofile("ds1820.lua")
end
end)
i print drukuje mi IP telefonu. Powyższy kod to init.lua zaczytany do esp8266 razem z drugim plikiem wywoływanym poleceniem dofile.
Jeszcze raz to polecenie (teraz dobrze) :)
OdpowiedzUsuńhttp://api.thingspeak.com/update?key=TU_JEST_MOJ_KEY&field1=15.5678
Jeśli ESP łączy się z siecią a dane można wysłać bez esp to może jest błąd w kodzie.
OdpowiedzUsuńTen komentarz został usunięty przez autora.
OdpowiedzUsuńZnalazłem w sieci inny przykład i mi ruszyło. Duma mnie rozpiera. Najpierw zrobiłem połączenie szeregowe ESP na port USB do OrangePi - napisałem skrypt do wysyłania danych w Pythonie i wszystko działało. W celach testowych. Ale ESP nie jest po to, żeby działać po drutach. No to mam co chciałem. Napiszę o tym na Wykopie. Pozdrawiam i dziękuje za zainteresowanie. Temperatura już jest aktualna i dosyć ciekawa, jak na tą porę roku. Od 16:30 dane prawdziwe (temperatura na zewnątrz - termometr widzi Giewont) https://thingspeak.com/channels/264743
OdpowiedzUsuńŚwietnie! Na orange Pi można postawić serwer i zrobić kapitalne wykresy korzystając z "Grafana". Zakopane to moje rodzinne tereny :) Pozdrawiam również :)
UsuńOd ostatniego wpisu poczyniłem pewne postępy. Grafana okazała sie za trudna dla mnie i odłożyłem ją na później. Troche bardziej radzę sobie z ThingSpeak, Wysyłam pomiary z 2 ESP (jeden to NodeMcu a drugi taki sam, jak u Ciebie). Przeszedłem na najnowszego Ubuntu 17.04 i jak zwykle tez są problemy ( np. brakowało w Pythonie pyserial niezbędnego do wgrywania firmware w esptool) Zastanawiam się czy sobie poradzę z Domoticz, bo tu gdzie jestem baza trzyma dane tylko z ostatniej doby, a chciałbym mieć wszystkie dane. Pozdrawiam J.L.
OdpowiedzUsuńMoże zacznę od końca :) Do bazy danych czytałem na blog.jokielowie.com o InfluxDB, może warto się nim zainteresować. W adafruit nie mam problemu z podglądem danych. Co prawda wykres można stworzyć z maksymalnie miesięcznym widokiem lecz w bazie można sprawdzić dane z przed kilku miesięcy i chyba nie ma ograniczeń co do tego (chociaż ja wysyłam dane co godzinę i zmniejsza to ilość danych na serwerze). Sam zainteresowałem się nową płytką z ESP8266 a mianowicie Wemos D1 mini. Ma port usb do programowania, stabilizator i jest mała w porównaniu do NodeMcu. W tym miesiącu postaram się opublikować na blogu wpis o automacie do podlewania roślin opartym na tym właśnie Wemos'ie. Pozdrawiam
UsuńPo moim wpisie pokazały sie te śmieci. Nie wiem czemu ? Prosze to usunąć. Rozgryzam InFluxDB. Powoli zmierzam w kierunku Grafany. Pozdrawiam.
OdpowiedzUsuńMotto: "Zawsze słucham dobrych rad"
Trzymam kciuki i czekam na efekty pracy influxdb i grafany! Ja niestety jestem zawalony nauką (sesja), ale w okolicach Bożego Ciała dodam nowy wpis :) Pozdrawiam i zazdroszczę pogody w Zakopanem, u mnie 26 stopni mnie dobija.
UsuńPrzeskoczyłem tutaj, bo mam pytanie dot. tej białej płytki. Czy jak się wlutuje stabilizator to trzeba zlikwidować rezystor po drugiej stronie ? Czytałem, że on jest 0R (ma na sobie 3 zera) i trzeba go wyjąć, żeby działał stabilizator. Pełni rolę zworki. Na RPi 0 zrobiłem 2-gi termometr i "skompilowałem" kod w pythonie z dwóch innych. Na razie mi działa. Powodzenia na egzaminach - mój syn na agh też ma sesję więc trzymam za Was obu ! Wklejam kod, może komuś się przyda. http://wklej.org/id/3202929/
OdpowiedzUsuńDokładnie, środkowy rezystor 0Ohm to zworka, jeśli go wylutujemy to napięcie zasiania będzie musiało przejść przez stabilizator. Celna uwaga, zaraz dopiszę to w wpisie :). Dzięki, powodzenia również dla syna! Co studiuje na AGH ?
Usuń