poniedziałek, 25 lipca 2016

Bezprzewodowy miernik wilgotności gleby z odczytem w telefonie

ESP8266 w działaniu - czyli projekt z bateryjką

Czas coś popełnić z samodzielnie działającym ESP8266. W poczekalni jest pomysł na małą automatykę ogrodową - coś co odciąży od obowiązku doglądania i podlewania donic i pojemników z warzywami w ogrodzie. Skrzyń z warzywami jest trochę a nawet chwilowy niedobór wody odbija się znacząco na kondycji roślin  i plonach. Trzeba więc zatrudnić dobrego dżinna by robił to za mnie.

Pierwszy krok to czujnik wilgotności. Wymagania
- komunikacja bezprzewodowa
- zasilanie bateryjne
- prosty
- ładny
Padło więc na ESP8266. Postaram się go zmieścić w małej ładnej standardowej ogrodowej lampce solarnej. Np takiej (6,50 PLN)
Sonda wilgotności będzie w szpikulcu, akumulator w nóżce a elektronika w kopule. Byłoby pięknie gdyby jeszcze udało się wykorzystać panel solarny do doładowywania akumulatora - ale to już extra dodatek. Na razie trzeba uruchomić moduł podstawowy.
Akumulatorek 18650 lub 14500 w zależności od tego co wejdzie do rurki. Mam więc do dyspozycji 1000do 2000 mAh na zasilanie układu. ESP potrzebuje 70-100 mA w czasie pracy i 10-100uA w stanie deep sleep. Mogę więc zakładać około 10 - 20 godzin ciągłej pracy. Restart systemu w raz z pomiarem zajmuje 10 - 20 sek po czym ponownie można uśpić procesor. Załóżmy więc pracę przez 2 min dziennie (6 pomiarów) co teoretycznie powinno pozwolić na pracę układu przez  około 300 - 600 dni. Tak naprawdę układ będzie pracował nie więcej niż 120-150 dni więc zasilania powinno starczyć na cały sezon.

Schemat maksymalnie prosty widoczny jest na zdjęciu


ESP-07 przygotowany do pracy z usypianiem (zwarte GPIO 16 i RST poprzez zworkę rozwieraną w trakcie programowania). Dodane są niezbędne polaryzacje i wejścia/wyjścia do programowania modułu wlutowanego na płytkę.  Rx na wejściu ma dzielnik dla dopasowani poziomów napięć z konwerterem USB/RS232.  Wejście sondy podane jest równolegle do rezystora 20 k (w rzeczywistości wstawiłem tam 39 kom). Wyżej potencjometr 100kom do kalibracji zakresu pomiarowego (ostatecznie trafił tam opornik 81kom). Te dwa oporniki stanowią jednocześnie dzielnik zapewniający na wejściu ADC poziom napięcia nie wyższy niż 1,1 V - ADC mierzy napięcia z zakresu 0-1V. Zasilanie całości z akumulatorka Li-Ion 3,7 V poprzez diodę obniżającą napięcie do poziomu 3,5 - 3 V w zależności od stanu naładowania akku.
ESP8266 wlutowałem na pająka dzięki czemu nie musiałem stosować płytki przejściowej. Układ ESP-07 ma dodatkową zaletę - możliwość przyłączenia anteny zewnętrznej co może się przydać w pracy polowej. Oporniki zmieściły się pod układem a po bokach ESP wlutowane są złącza szpilkowe do szybkiego łączenia z sondą i zasilaniem oraz niezbędne piny w procesie programowania procesora.

  • Test pierwszy -  pomiar napięcia - pozytywny 
procedura identyczna jak w Arduino  analogRead (A0) działa bez problemów pamiętając, że napięcie wej to 0-1 V. Dokładność zaskakująco duża przy napięciach bliskich 1 V "przeskakuje" tylko ostatni bit co oznacza że mamy rozdzielczość 9 bitów (zakładałem 8)
  • Test drugi BLYN z widget GRAPH i HISTORY GRAPH
Do odczytu danych przesyłanych cyklicznie ale w długich odstępach czasu przyda się widget HISTORY GRAF. Ale tego co zaobserwowałem jego wskazania są prawdziwe jedynie w chwili połączenia telefonu z mikroprocesorem (via serwer). Po wyłączeniu ekranu w danych powstaje czarna dziura. Powinno być inaczej - i telefon i procesor powinny pobierać aktualne dane z serwera nawet gdy urządzenie na przeciwległym końcu jest nieaktywne. O ile synchronizacja danych z BLYNK serwera w procesorze może ( i powinna) być dokonana komendą  Blynk.syncAll(); 
po której wszystkie zmienne i porty powiązane z widgetami w telefonie aktualizują swoje wartości. W drugą stronę coś  jednak szwankuje i wyświetlane wartości nie zawsze odpowiadają temu co powinno znajdować się na serwerze BLYNKa wcześniej przesłane z procesora

Poczytałem jeszcze raz dokumentację i forum i sprawa się wyjaśniła. Stosowana przez mnie procedura pobierania danych przez BLYNK z procesora - BLYNK.Read(vPin) -  jest wywoływana JEDYNIE gdy aplikacja w telefonie jest aktywna (patrzymy na nią). Po zamknięciu okna funkcje nie jest nieaktywna. Trzeba użyć cyklicznego wywołania funkcji Blynk.wirtualWrite(vPin,wartość).
Każde wywołane tej procedury zapisuje dane w serwerze BLYNK skąd telefon może je już sobie pobrać przy otwarciu aplikacji. Rzeczywiście wszystko działa 


 To trzydniowy zapis danych "na sucho"wysyłanych co godzinę z czujnika wilgotności. Wykres opada z wartości 1019 do 1000 razem ze spadkiem napięcia zasilania rozładowującego się akumulatorka (o ok 2%). Będzie to miało jakiś wpływ na pomiary - napięcie na akumulatorze będzie zmieniać się od 4,2 V do 3,7 V a więc ponad 10%. Trzeba będzie uwzględnić ten fakt w przyszłych konstrukcjach.

Ostatecznie czujnik wilgotności trafił do nieco większej obudowy - lampki solarnej za 9 PLN. Akumulatorek Li-Ion 14500 o wymiarach AA zmieścił się na siłę w miejscu akumulatorka AAA a cała elektronika poszła do klosza. Na razie musi tak zostać. Dla pewności połączenia dołączyłem zewnętrzną antenkę i całość przybrało postać kompaktowego urządzenia

 
   Solar z lampki wisi na razie w powietrzu. W następnej wersji może uda się go zmusić do podładowywania akumulatorka.

No to teraz do ogrodu na małą próbę ognia

I zapewnie cdn ...........  

Brak komentarzy:

Publikowanie komentarza