Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Termostat ze sterowaniem pompą oparty na ESP8266

kolgreen 05 Nov 2018 09:50 7698 28
Optex
  • Termostat ze sterowaniem pompą oparty na ESP8266

    Do stworzenia termostatu opartego o ESP8266 nakłonił mnie znajomy. Potrzebował urządzenia sterującego grzałką i łatwo zdalnie konfigurowalnego. Zaraz pomyślałem o płytce NodeMCU którą miałem pod ręką...

    Oprogramowanie nie powstało w języku LUA (co mogłaby sugerować płytka) a w języku C++ w środowisku programistycznym Arduino.

    Choć urządzenie nie doczekało się działania w docelowej lokalizacji, to po publikacji projektu w Internecie otrzymałem sugestię by dodać obsługę pompy.
    W chwili obecnej program umożliwia ustawienie temperatury utrzymywanej przez grzałkę (oraz definicję histerezy), możliwa jest również definicja temperatur przy których uruchamiana jest pompka obiegu wody. Na chwilę obecną projekt zawiera jedynie samo oprogramowanie, brak natomiast projektu płytki. By uruchomić urządzenie wystarczy do płytki NodeMcu podłączyć transoptor sterujący triakiem, który z kolei uruchamia np. grzałkę. Odczyt temperatury dokonywany jest za pomocą DS18B20.

    Po wgraniu oprogramowania do układu należy nawiązać z nim połączenie za pośrednictwem portu UART (prędkość: 115200 baud).
    Ważnym jest by jako zakończenie linii wybrać "nowa linia", czyli znak "n" - informuje on ESP o zakończeniu wysyłania instrukcji, bądź ciągu znaków.
    Wysyłając znak "h" wyświetlane jest menu z poziomu którego dokonujemy konfiguracji sieci WiFi (wyświetlamy dostępne sieci, łączymy z wybraną, wpisujemy hasło).
    Po uzyskaniu adresu IP możliwa jest w następnej kolejności konfiguracja urządzenia za pośrednictwem przeglądarki stron internetowych.

    Termostat ze sterowaniem pompą oparty na ESP8266 Termostat ze sterowaniem pompą oparty na ESP8266

    Szczegółowy opis urządzenia oraz odnośniki do najnowszych "wsadów" dla ESP8266 opublikowałem w artykule ESP8266 - Termostat

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    kolgreen
    Level 15  
    Offline 
    kolgreen wrote 264 posts with rating 230, helped 11 times. Been with us since 2007 year.
  • Optex
  • #2
    Linoge
    Level 27  
    Może i się czepiam ale tą samą funkcjonalność można otrzymać przy pomocy esp easy i pewnie temu podobnych w ciągu kilku sekund bez środowiska "programistycznego".
    No i pisanie, że program jest w C++ gdzie nie ma żadnej klasy jest dalekim nadużyciem.
  • #3
    kolgreen
    Level 15  
    Linoge wrote:
    Może i się czepiam



    Chyba tak :D

    Linoge wrote:
    ale tą samą funkcjonalność można otrzymać przy pomocy esp easy i pewnie temu podobnych w ciągu kilku sekund bez środowiska "programistycznego".


    Oczywiście... Również można taką samą funkcjonalność uzyskać używając zakupionego w sklepie sprzętu. Ot, moje rozwiązanie jest takie jak zaprezentowałem... Co nie znaczy, że jedyne i jedynie słuszne. Jeśli ktoś chce skorzystać, miło mi - udostępniam wsad (nie ma potrzeby używania "środowiska programistycznego"). Jeśli natomiast ktoś chce sobie coś zmienić w programie i bardziej dostosować - udostępniam źródła.


    Linoge wrote:
    No i pisanie, że program jest w C++ gdzie nie ma żadnej klasy jest dalekim nadużyciem.


    Czy przejrzałeś wszystkie pliki linkowane przez kompilator w tym programie? :D
    Generalnie jest to kompilator języka C++ a nie C.
  • #4
    Galareta
    Level 22  
    Pewno mu chodziło o zgubne skutki zawieszenia sie;) ale realnie patrząc dobrze zbudowany układ powinien przewidywać zespawanie się styków wiec zawieszenie tez nie zaszkodzi;) A czy esp się aż tak bardzo wiesza, mam prawie 3 lata w akwarium do sterowania oświetleniem i działa.
    Częściej wynalazki fabryczne w bojlerach padają np dość często.
  • Optex
  • #5
    kolgreen
    Level 15  
    Galareta wrote:
    Pewno mu chodziło o zgubne skutki zawieszenia sie;) ale realnie patrząc dobrze zbudowany układ powinien przewidywać zespawanie się styków wiec zawieszenie tez nie zaszkodzi;)


    Jak napisałem w pierwszym poście, bardziej myślałem o triaku... Przekaźniki półprzewodnikowe również są... Może jestem w błędzie ale nie używam przekaźników opartych o elektromagnes.
    Po za tym co złego się może stać w przypadku zawieszenia się? Większy rachunek za prąd i wodę? Trzeba być szaleńcem żeby mieć instalację CO bez zabezpieczenia (całkowicie zamknięty obieg).

    Galareta wrote:
    A czy esp się aż tak bardzo wiesza, mam prawie 3 lata w akwarium do sterowania oświetleniem i działa. Częściej wynalazki fabryczne w bojlerach padają np dość często.


    Również jestem tego zdania. No ale może kolega sam wyjaśni co miał na myśli.
  • #6
    Erbit
    Level 42  
    Galareta wrote:
    Pewno mu chodziło o zgubne skutki zawieszenia sie;) ...

    Mam do ESP (NodeMCU) podłączone 3 czujniki temperatury, 4 wilgotności i do tego ESP steruje siłownikiem otwierającym (w zależności od różnicy temperatur) okno w szklarni oraz wysyła zebrane dane na serwer. Układ (będący na zewnątrz) pracuje 4-ty rok i ani razu się nie zawiesił.

    Nie oznacza to jednak, że nie należy się przed tym zabezpieczyć. W moim przypadku (gdyby się zawiesił) mogłoby mi poparzyć rośliny w szklarni.
  • #7
    khoam
    Level 41  
    Mam jedną uwagę do tego fragmentu kodu programu:
    Code: c
    Log in, to see the code

    Dobra praktyka nakazuje, aby w C/C++ nie używać operatorów porównania (==) dla wartości typu float. Takie porównywanie wcale nie musi zwracać prawidłowej wartości logicznej. Akurat w tej części programu jest to niezwykle istotne.
    Gdybyś trochę więcej czasu spędził na przetestowaniu tego kodu, to byś się o tym przekonał.
    Zdaje sobie sprawę, że w necie jest pełno tego typu radosnego kodu, ale to nie znaczy, że należy go bezmyślnie powielać.

    Tutaj możesz sobie o tym trochę poczytać.
  • #8
    Erbit
    Level 42  
    khoam wrote:
    ... Dobra praktyka nakazuje, aby w C/C++ nie używać operatorów porównania (==) dla wartości typu float.


    Problem, którego dotykasz tyczy się nie tylko C/C++. Spotkałem się z nimi w JS, PHP a najwcześniej spotkałem się z nim w Clipperze (gdzieś w okolicach roku 90 ubiegłego stulecia). O ile dobrze pamiętam problem tyczy się sposobu zapisu wartości zmiennoprzecinkowej w pamięci komputera (w systemie binarnym). Obstawiam, że tyczy się "wszystkich" języków programowania.
  • #9
    Erbit
    Level 42  
    AGrodecki wrote:
    ...
    O pompie też coś było. Pompa do grzałki?

    Nie, do obiegu ;)
    AGrodecki wrote:
    ...
    Generalnie im zadanie bardziej odpowiedzialne, tym bardziej odpowiedzialne wykonanie. Użycie zabawkowych modułów raczej nie wchodzi w grę. Dlatego część radioamatorska kosztuje 5zł, odpowiednia funkcjonalnie część do poważnego zastosowania kosztuje 50zł a tej samej funkcjonalności część do zastosowań przemysłowych kosztuje 500zł. Pewnych rzeczy na szemranych modułach nie robi się w ogóle. Po prostu.

    W porządku. Tylko proszę nie wyolbrzymiaj, że z powodu zawieszenia ESP zatną się czujniki temperatur (te Twoje profesjonalne), zatnie się zawór bezpieczeństwa, jednocześnie zablokuje zawór gazowy, i trafią w kocioł wszystkie nieszczęścia tego świata.
  • #10
    kolgreen
    Level 15  
    khoam wrote:
    Mam jedną uwagę do tego fragmentu kodu programu:
    Dobra praktyka nakazuje, aby w C/C++ nie używać operatorów porównania (==) dla wartości typu float. Takie porównywanie wcale nie musi zwracać prawidłowej wartości logicznej. Akurat w tej części programu jest to niezwykle istotne.
    Gdybyś trochę więcej czasu spędził na przetestowaniu tego kodu, to byś się o tym przekonał.


    Prawdę mówiąc z powodzeniem testuję niemalże od 10 lat. :D
    Do tego projektu zaczerpnąłem to rozwiązanie z CCS C dla mikrokontrolerów PIC, jednak widzę, że to rozwiązanie jest również stosowane w wielu innych bibliotekach...
    Po wpisaniu w google "while (temp == 85.0 || temp == (-127.0));" zwracana jest cała masa stron, co oczywiście nie znaczy, że musi to być prawidłowe.
    Zapoznam się z linkiem jaki dostarczyłeś, zakładam, że rzutowanie na int powinno rozwiązać sprawę. Dzięki za zwrócenie uwagi - nie znałem tego problemu.

    Dodano po 10 [minuty]:

    AGrodecki wrote:
    Zawór bezpieczeństwa się nie zatnie. Przy zagotowaniu wody puści i jak to z nimi zazwyczaj bywa, już się nie zamknie :).


    No i wszystko prawidłowo.

    AGrodecki wrote:
    Powtarzam, tak odpowiedzialnych zadań takiej padlinie jak ten moduł się nie powierza.


    Jaki układ zatem kolega poleca?

    Przypominam, że znajdujemy się w dziale DIY i mamy tu do czynienia z konstrukcjami amatorskimi, które wykonujemy dla własnej satysfakcji i na własną odpowiedzialność. Nie są to konstrukcje komercyjne, choć i w takich ESP8266 znajduje zastosowanie (przykład pierwszy z brzegu - Sonoff Smart Home). Wniosek jaki wyciągam z narzekań forumowiczów jest taki, że powinienem w artykule zaznaczyć fakt iż ingerencja w układ CO rodzi pewne ryzyko, z którego być może nie wszyscy zdają sobie sprawę.
  • #11
    pitron
    Level 23  
    Ja już widziałem układy STM32 w poważnych komercyjnych produktach.
    Sam mam sterownik CO na arduino mini pro już 3 lata i działa OK choć długo poprawiałem błędy w trakcie życia systemu.
    Dodam tylko że zabezpieczenia pozostały seryjne i działają niezależnie.
  • #13
    hindoos
    Level 27  
    Myślę, że rozumie, ale chodzi mu o coś innego.
    Każde urządzenie należy produkować z myślą o jego awarii i konsekwencjach jakie z niej wynikną.
    Awaria urządzenia do podlewania kwiatków może doprowadzić do
    a) utopienia kwiatków
    b) ususzenia kwiatków
    Awaria rozrusznika serca może doprowadzić do
    a) śmierci pacjenta
    b) poważnych problemów zdrowotnych
    Awaria sterownika CO może doprowadzić do
    a) ... i tu wpisujemy nasze propozycje

    Teraz jakie są konsekwencje awarii urządzenia do kwiatków? Niewielkie. Czy potrzebujemy zabezpieczenia? Raczej nie - w najgorszym wypadku stracimy kwiatki, ewentualnie zaleje nam podłogę. Warto zabezpieczyć? W ograniczonym zakresie, tak - np. dodać watchdog sprzętowy, dodatkowe programowe funkcje które przerwą program jeśli np. czujnik wilgotności przestanie odpowiadać albo będą dozować średnią dawkę.
    Jakie są konsekwencje dla rozrusznika serca? Chyba nie muszę opowiadać... Błędy oprogramowania się zdarzają, problemy sprzętowe również.
    A co z piecem CO? I na ten problem zwraca uwagę AGrodecki. Trzeba brać pod uwagę możliwości awarii i liczyć się z konsekwencjami. Czasem wystarczy zmienić program, czasem dodać sprzętowe zabezpieczenie, a czasem totalnie zrezygnować ze stosowania rozwiązania.
  • #14
    Erbit
    Level 42  
    hindoos wrote:
    ...
    Każde urządzenie należy produkować z myślą o jego awarii i konsekwencjach jakie z niej wynikną....
    ...


    Kolego. Możemy pisać eseje odbiegając od głównego tematu. Jasne, że tak należy i jak wczytasz się w wątek to zauważysz, że jest kilku (w tym ja), którym udało się obsłużyć coś za pomocą "badziewia" baz błędów. Dlaczego? Bo problemy zawieszania w dużej mierze to źle napisana aplikacja.

    Na domiar złego - onegdaj byłem wzywany do ASO na aktualizację oprogramowanie hamulca parkingowego. Z tego co wyczytałem w necie, zdarzały się przypadki automatycznego zaciągnięcia się hamulca przy prędkości podróżnej. Tak wygląda "myślenie o skutkach awarii" i proszę nie demonizujmy, że ESP, który steruje grzałką i pompą jest zagrożeniem. W każdym takim układzie stosuje się niezależne zabezpieczenia i to bez znaczenia czy grzałką steruje ESP czy "profesjonalny" układ. Gdyby "profesjonalny" był bezawaryjny to nie byłyby potrzebne zabezpieczenia.

    EOT.
  • #15
    khoam
    Level 41  
    kolgreen wrote:
    Prawdę mówiąc z powodzeniem testuję niemalże od 10 lat.

    Na płytce stykowej ?!

    kolgreen wrote:
    Na chwilę obecną projekt zawiera jedynie samo oprogramowanie, brak natomiast projektu płytki. By uruchomić urządzenie wystarczy do płytki NodeMcu podłączyć transoptor sterujący triakiem, który z kolei uruchamia np. grzałkę

    Kolego zdecyduj się, czy piszemy o tym, co opublikowałeś na tym forum, czy o Twoich dotychczasowych doświadczeniach zawodowych.

    kolgreen wrote:
    powinienem w artykule zaznaczyć fakt iż ingerencja w układ CO rodzi pewne ryzyko, z którego być może nie wszyscy zdają sobie sprawę.

    Tak, powinieneś o tym napisać. Dodatkowo też powinieneś skromnie wspomnieć, że opublikowane przez Ciebie oprogramowanie nie zawiera żadnych procedur autodiagnostycznych sterownika np. weryfikacji poprawności działania sensora temperatury w trakcie działania całego układu. W końcu nie chodzi tu o sterownik do oświetlenia na choinkę.
  • #16
    khoam
    Level 41  
    kolgreen wrote:
    Zapoznam się z linkiem jaki dostarczyłeś, zakładam, że rzutowanie na int powinno rozwiązać sprawę.


    Niestety nie rozwiąże problemu. W podanym przeze mnie linku jest wiele przykładów na rozwiązanie tego problemu.
    W tej chwili wystąpienie błędów w odczycie temperatury jest całkowicie ignorowane przez Twój kod, ale sterownik "działa".
  • #17
    kolgreen
    Level 15  
    khoam wrote:
    kolgreen wrote:
    Prawdę mówiąc z powodzeniem testuję niemalże od 10 lat.

    Na płytce stykowej ?!


    Nie. Dlaczego? Jeśli zerkniesz na moją skromną stronę zauważysz, że żadne z urządzeń nie jest zbudowane na płytce stykowej. Jestem daleki od tego typu rozwiązań. ESP8266 można oczywiście wstawić jako "moduł" do zaprojektowanej przez siebie płytki (na gold pinach), ale o wiele lepiej zwyczajnie wlutować. Na przykład będący w takiej postaci:

    Termostat ze sterowaniem pompą oparty na ESP8266
  • #18
    hindoos
    Level 27  
    kolgreen wrote:
    Dlaczego?

    Pewnie dlatego, że w pierwszym poście dałeś obrazek z płytki stykowej ;)
  • #19
    tmf
    Moderator of Microcontroller designs
    Moderated By tmf:

    Koledzy, proszę trzymać się tematu. Dyskusje nie na temat, można prowadzić w HydeParku lub odpowiednich działach Po godzinach.

  • #20
    kuba2509
    Level 14  
    Witam
    tak dla testu chciałem kompilować kod który zamieściłeś ale niestety się nie da wywala błędy.
  • #21
    khoam
    Level 41  
    kuba2509 wrote:
    tak dla testu chciałem kompilować kod który zamieściłeś ale niestety się nie da wywala błędy.


    U mnie się kompiluje bez błędów. Może wybrałeś niewłaściwą płytkę - ma być NodeMCU.
  • #22
    kolgreen
    Level 15  
    kuba2509 wrote:
    Witam
    tak dla testu chciałem kompilować kod który zamieściłeś ale niestety się nie da wywala błędy.


    Jak tu kolega powyżej napisał - sprawdź czy wybrałeś dobrą płytkę lub pokaż błędy.

    Dodano po 4 [minuty]:

    khoam wrote:

    Dobra praktyka nakazuje, aby w C/C++ nie używać operatorów porównania (==) dla wartości typu float.


    Zagłębiłem się trochę w temat i jestem chyba bogatszy o jakąś wiedzę.

    Została dodana funkcja porównująca floaty czy są sobie równe, z dokładnością przesadną przy pomiarze temperatury:

    Code: c
    Log in, to see the code


    I teraz odczyt wygląda następująco:

    Code: c
    Log in, to see the code


    Co zatem wiąże się z powyższym, kod jak i binarka zostały zaktualizowane.
    Jest też innych kilka aktualizacji, jak np. pokazanie w przeglądarce czy pompa i grzałka są włączone.
  • #23
    khoam
    Level 41  
    To teraz trzeba sobie odpowiedzieć na pytanie: co się stanie jeżeli te błędy odczytu temperatury będą miały charakter permanentny np. w wypadku uszkodzenia sensora? :)
    Pętla będzie działać w nieskończoność, a grzałka raz włączona grzać czas cały. Nie widziałem, aby kolega obsługiwał w kodzie watchdog - nie ma też obsługi błędów na tę okoliczność.
    Nie czepiam się, to akurat jest bardzo ważne.

    Dodano po 27 [minuty]:

    kolgreen wrote:
    if (fabsf(a-b) < 0.0001f){


    Zamiast 0.0001f użyłbym stałej FLT_EPSILON - trzeba dołączyć plik nagłówkowy "float.h".
  • #24
    kamaz8
    Level 11  
    koledzy a mi po wgraniu do nodemcu prawdopodobnie nie działa
    niby połączono do sieci, adres nadany a w przeglądarce cisza

    w konsoli mam

    SSID:Ela
    Haslo:xxxxxxx
    Temperatura: ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮Ela
    Histereza: ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮Ela
    Pompa ON: ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮Ela
    Pompa OFF: ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮Ela
    Connecting to Ela
    ****
    Connected
    IP address:
    192.168.0.105
    s - skanuj sieci
    c - konfiguruj siec
    o - czytaj konfiguracje
    j - polacz z siecia
    h - wyswietl to menu

    a po wpisaniu w przeglądarce adresu 192.168.0.105 nic nie wyświetla, sprawdziłem na 3 przeglądarkach, czy muszę dodatkowo coś uruchomić, wgrać?
    proszę o wskazówkę
    pozdrawiam
  • #25
    kolgreen
    Level 15  
    Zastanawiające są te znaki zapytania.
    Nie, nie musisz nic dodatkowo wgrywać i uruchamiać.
    Wyczyść całą pamięć przed wgraniem.
    Proponuję dokonać kompilacji z dostarczonych źródeł i wgranie ze środowiska Arduino IDE.
  • #26
    kamaz8
    Level 11  
    czyszczę moduł FLASH_DOWNLOAD_TOOLS_V3.6.4
    ściągam projekt, otwieram w Arduino 1.8.7, wybieram nodemcu 1.0 , wgrywam
    odpalam monitor portu szeregowego i wpisuje dane sieci
    plik config i wifi muszę gdzieś skopiować?
  • #27
    kolgreen
    Level 15  
    kamaz8 wrote:
    czyszczę moduł FLASH_DOWNLOAD_TOOLS_V3.6.4
    ściągam projekt, otwieram w Arduino 1.8.7, wybieram nodemcu 1.0 , wgrywam
    odpalam monitor portu szeregowego i wpisuje dane sieci
    plik config i wifi muszę gdzieś skopiować?


    Specjalnie jeszcze skompilowałem ze źródeł i wgrałem. Wszystko jest ok.
    Plik config.cpp i wifi.cpp w katalogu include to jedynie biblioteki potrzebne przy kompilacji. Ale nie musisz nic kompilować. Pobierz termostat.bin i ten plik wrzucasz do esp.
  • #28
    kamaz8
    Level 11  
    udało się uruchomić :-)
    Mam kilka pytań (może dla kogoś są oczywiste ale jestem początkujący )
    co oznaczają wartości 11,32,11,5,100
    char pompoff[11] = ""; //wyłączenie pompy
    char ssid[32] = ""; //nazwa sieci wifi
    clear_array(data.pompon,11);
    pn.toCharArray(data.pompon,5);
    EEPROM.put(100,data);
    Czy jeśli dołożę kilka dodatkowych zmiennych i chciałbym je zapisać w eeprom to czy wystarczy że analogicznie wpiszę "char nowa_zmienna[11]"
    będą to zmienne typu int (czas załączenia, czas wyłączenia przekaźnika) ?
    jeśli można to prosił bym o wyjaśnienie
    pozdrawiam
  • #29
    kolgreen
    Level 15  
    kamaz8 wrote:
    udało się uruchomić :-)


    Świetnie! Co powodowało problem?

    kamaz8 wrote:

    char ssid[32] = ""; //nazwa sieci wifi


    32 oznacza wielkość tablicy, czyli ile znaków może mieć SSID (nazwa sieci)

    kamaz8 wrote:

    clear_array(data.pompon,11);


    Musisz zerknąć jak zbudowana jest funkcja clear_array() i jakie parametry przyjmuje.
    Jeśli dobrze pamiętam to 11 jest wielkością tablicy, funkcja po prostu czyści tyle znaków w tablicy ile tam podasz. W tym przypadku - całą tablicę.