czwartek, 4 maja 2017

Bezprzewodowe czujniki temperatury wew. i zew. + wizualizacja danych + dobry regulator 3,3V !

Kolejny wpis i kolejny czujnik temperatury ? 
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

16 komentarzy:

  1. 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ń
    Odpowiedzi
    1. 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ń
    2. 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ń
    3. Sprawdzał Pan czy ESP poprawnie łączy się z siecią ? Jakiś przykład z małym serwerem ? Co znaczy "wysyłać z ręki" ? :)

      Usuń
  2. Takim poleceniem można wysyłać dane do ThingSpeak: http://api.thingspeak.com/update?key=&field1=15.5678
    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.

    OdpowiedzUsuń
  3. Jeszcze raz to polecenie (teraz dobrze) :)
    http://api.thingspeak.com/update?key=TU_JEST_MOJ_KEY&field1=15.5678

    OdpowiedzUsuń
  4. Jeśli ESP łączy się z siecią a dane można wysłać bez esp to może jest błąd w kodzie.

    OdpowiedzUsuń
  5. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  6. 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ń
    Odpowiedzi
    1. Ś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ń
  7. 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ń
    Odpowiedzi
    1. 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ń
  8. Po moim wpisie pokazały sie te śmieci. Nie wiem czemu ? Prosze to usunąć. Rozgryzam InFluxDB. Powoli zmierzam w kierunku Grafany. Pozdrawiam.
    Motto: "Zawsze słucham dobrych rad"

    OdpowiedzUsuń
    Odpowiedzi
    1. 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ń
  9. 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ń
    Odpowiedzi
    1. 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ń