wtorek, 9 października 2018

Automatyka pompy cyrkulacyjnej CWU czyli VIRTUINO w akcji cz. II


Dziś kolejny odcinek z podmiany BLYNKa przez VIRTUINO w projekcie sterownika pompy cyrkulacyjnej CWU.


Słów kilka o technologii przygotowania projektu. Moduł ESP-01S jest świetnym wyborem  dla prostego układu domowej automatyki - na przykład sterownika pompy. Ale uruchamianie na nim oprogramowania to wyzwanie dla cierpliwych. Napięcie jeszcze rośnie gdy dodać do tego trzeba testowanie nieznanego wcześniej systemu VIRTUINO. Przekładanie dziesiątki razy modułu ESP-01 z układu do programatora i z powrotem doprowadzi do szewskiej pasji nawet niesłychanie spokojnego gościa. A co dopiero mnie.

Z przyjemnością buduję więc kolejne urządzenia na tym micro module ale w całym procesie przygotowania projektu wysługuję się na układem D1 MINI czyli ESP-12 z konwerterem USB-RS232. Na nim to wgrywanie kolejnych wersji softu jest bajecznie proste o ile tylko wykorzysta się w tym celu ARDUINO IDE.

ESP-01 ma do wykorzystania jedynie 4 porty: 0, 1/Tx, 2 i 3/Rx. D1 MINI o siedem więcej. W D1 MINI  porty Tx i Rx  pozostawiam wolne by nie wchodzić w konflikt z konwerterem USB. W ESP-01 każdy port jest na wagę złota i oba porty komunikacyjne najczęściej robią za porty robocze projektu - tutaj wykorzystuję RDX.  Przechodząc z jednego modułu na drugi muszę pamiętać o dwóch sprawach
- zmienić odpowiednio numerację portów z D1 MINI na ESP-01
- wyłączyć wysyłanie jakichkolwiek komunikatów na monitor w trakcie normalnej pracy urządzenia jeżeli port Tx jest portem roboczym.

Zrobiłem sobie w programie możliwość wyboru typu modułu dodając zmienną przełączającą oba powyższe warunki

#define ESP01 1
#define D1MINI 2
int procesor = D1MINI;
.......
void no433setup()
{
  if (procesor == D1MINI) {
    mySwitch.enableReceive(12);  // port odbiornika
    mySwitch.enableTransmit(14); // nadajnika
  }
  if (procesor == ESP01) {
    mySwitch.enableReceive(3);  //
    mySwitch.enableTransmit(1); //
  }
}
........
 if (procesor == D1MINI) Serial.println(mess);

Kod programu jest nieco nadmiarowy ale przy megabajcie pamięci ESP nie ma to żadnego znaczenia.  A ułatwienie jest spore. Tym prostym sposobem dylemat ciastka został rozwiązany.

Schemat


Jest mocno nieskomplikowany więc będzie w takiej postaci


Cztery połączenia wewnątrz układu, podanie napięcia zasilania 5 V i przyłączenie pompy. Ot i cały sterownik cyrkulacją z wykorzystaniem VIRTUINO. Nie tylko VIRTUINO. Prawie każdy systemem IoT da się w tym układzie zainstalować ale tu będzie o VIRTUINO.
Wrócę jeszcze do tych czterech połączeń. To jest właśnie uroda chińskiej elektroniki - składamy złożony system mikroprocesorowy w 10 min z gotowych klocków po dolarze za sztukę. Nie ma nic piękniejszego szczególnie na początku elektronicznej drogi.

W projekcie wykorzystuję trzy porty ESP-01S

RXD - dane z odbiornika 433 MHz
GPIO 0 - przekaźnik i LED przekaźnika
GPIO2 - LED na module ESP

Program


Kod programu zamieściłem na githubie.
Nie jest duży ale rozbiłem go na fragmenty by łatwiej nad nim panować. Dołączyłem też biblioteki coby ich nie szukać po Internecie.
V_pompa_3.ino  - podstawowy program Arduino IDE z setup() i loop()
NO433.h - obsługa modułu/ów 433 MHz
led.h - obsługa LEDów
virtuino.h - wszystko co potrzeba by uruchomić VIRTUINO na ESP8266         
pompa.h - główny program obsługi pompy cyrkulacyjnej CWU 

Zacznijmy od virtuino.h. To moja nowa biblioteka i jeszcze mocno w powijakach. Ale działa i nie sprawia kłopotów. No prawie. Z jakiś przyczyn mój D1MINI nie loguje się do sieci za pierwszym razem i trzeba go szturchnąć resetem by zaskoczył. Do tego służy watchdog ustawiony na 9 sek.

W kodzie nie ma nic odkrywczego. Ot standardowe ustawienia serwera VIRTUINO. Dodałem tylko kontrolnego LEDa migającego w aplikacji pokazującego połączenie z mikrokontrolerem 

virtuino.vDigitalMemoryWrite(0, flaga_led1);

Cały sterownik pompy zawarty jest w pompa.h. Działa identycznie jak wersja z BLYNKiem. 
Pompę może załączyć odebrany kod bezprzewodowej czujki PIR lub pilota do ręcznego uruchamiania pompy (linia 85-92).  Stan pompy wysyłany jest do telefonu

virtuino.vDigitalMemoryWrite(10, 1);

Sygnałem do uruchomienia pompy jest ładowany do pełnej wartości jest licznik opóźnienia wyłączenia urządzenia (linia 87). Od tego momentu licznik jest zmniejszany każdym wywołaniem timera (linia 94). Aktualny stan licznika wysyłany jest do aplikacji VIRTUINO  

virtuino.vMemoryWrite(11, obieg);

Z aplikacji można również sterować pompą (linie 38-45) i zmieniać czas opóźnienia wyłączenia (linie 46-53). Czas jest zapamiętywany w eepromie - a tak naprawdę w pamięci flash udającej eeprom - (linia 50) i odtwarzany przy uruchomieniu programu (66).


Pompą steruje przekaźnik na porcie GPIO 0 (linia 73, 81). Zmiana stanu pompy sygnalizowana jest prędkością migania LEDa na module ESP-01S (GPIO2). Dla załączonej pompy LED miga co 1 sek dla wyłączonej co 2 sek.

Pozostałością po wcześniejszej wersji programu jest sterowanie radiowym gniazdem. Pozostawiłem tę opcję gdyż do testów używam płytki zawierającej również nadajnik 433MHz. A może wogóle zmienię aktualnie działający na BLYNKu system i przerobię go na VIRTUINO?  Sie zobaczy.

Jest jeszcze mały problem do rozwiązania. W liniach 105-111 zawarta jest blokada działania pompy w wybranych godzinach nocnych. W BLYNKu sterował tą funkcją timer aplikacji. W VIRTUINO też mamy timer aplikacji ale działa on jedynie gdy aplikacja jest aktywna - czyli prawie nigdy. Muszę pomyśleć jak to można zrobić.


Aplikacja


Tu na razie bez fanatyzmu. ot proste zestawienie dostępnych widgetów.




Prosta ale mnie się podoba. Żółty led to wskaźnik połączenia z mikrokontrolerem. Dubluje słabo widoczny wskaźnik połączenia w górnym lewym rogu( zielona kropka). Po prawej stronie pole terminala pokazuje odbierane kody 433 MHz. Poniżej timer, na razie bezużyteczny, do blokowania pompy nocą. Podoba się mi wskaźnik i zadajnik czasu działania pompy. Są czytelne i świetnie się uzupełniają. Wszytko to zrobione w darmowej wersji VIRTUINO.

A tak to mniej więcej działa.






Idę więc myśleć a ciąg dalszy niech cierpliwie czeka..

Wpisy w tym temacie
http://100-x-arduino.blogspot.com/2018/09/automatyka-pompy-cyrkulacyjnej-cwu.html
152



26 komentarzy:

  1. CZeść
    Gdzie wpisać kody z moich czujek? Mam 2 czujki jedna wpisuje zamiast pilota

    OdpowiedzUsuń
  2. https://github.com/krzyspx/VIRTUINO_pompa_CWU/blob/master/pompa.h

    tutaj masz wpisany kod czujki PIR
    #define pirpompa 5526612 //k3off

    jeśli masz dwie czujki uruchamiające pompę dodaj drugi kod zamiast pompapilot
    void pompaakcja() {
    if ((o_kod == pirpompa) || (o_kod == pompapilot)) {
    .......

    OdpowiedzUsuń
  3. Może ja źle programuję, podłączam jak w Twoim poście https://2.bp.blogspot.com/-lfMb77JgJLA/WsjKxzHBmhI/AAAAAAAAB64/f4xRR6WQE_wvcfMG5eVwSi09eovODqSeQCLcBGAs/s1600/129usb-rs1.jpg w arduino wybieram wemos d1 mini też obrazek z Twojego posta

    OdpowiedzUsuń
  4. jak podepnę pod zasilanie to nic się nie dzieje, jak kliknę reset to przekaźnik strzela i obie diody mrugają

    OdpowiedzUsuń
  5. Kupione na ali jako ESP-01S i taki napis na płytce

    OdpowiedzUsuń
  6. Ok - dla pewności tu masz dokładny opis różnic także w wyglądzie
    http://100-x-arduino.blogspot.com/2018/03/esp-01-esp-01s-roznice-obu-moduow.html
    co do programu wrzucę jeszcze raz do układu i zobaczę co z nim jest

    OdpowiedzUsuń
  7. Wszystko wskazuje ze to wersja S

    OdpowiedzUsuń
  8. Sprawdziłem kod - jest Ok ale wstawiłem kod dla D1MINI a nie ESP01
    zmień w pliku V_pompa_3.ino w 3 linii z
    int procesor = D1MINI;
    na
    int procesor = ESP01;

    zmień w pliku led.h w linii 19 z
    digitalWrite(led_ziel, flaga_led);
    na
    digitalWrite(led_wew, flaga_led);

    po uruchomieniu dla pewności wciśnij reset i zaczekaj 10sek w programie jest watchdog który przywraca komunikację z VIRTUINO. Po 10 sek niebieski LED na ESP01 powinien wolno migać.
    Program ściąga ostatnią nastawę opóźnienia wyłączenia przekaźnika z pamięci EEPROM. Przy pierwszym uruchomieniu masz tam śmieci więc trzeba wstawić mu nową wartość np 10 za pomocą widgetu regulator na V13
    Po naciśnięciu przycisku DV10 w aplikacji przekaźnik się załączy a wyświetlacz na V11 będzie pokazywałczas pozostały do wyłączenia przekaźnika. LED niebieski na ESP01 będzie migał szybciej w czasie gdy przekaźnik jest załączony.
    Gdy uda się uruchomienie z aplikacji VIRTUINO możesz wstawić swój kod z czujki PIR w pliku pompa.h linia 3
    #define pirpompa 5526612
    jeśli masz drugą czujkę jej kod wstaw do linii 8
    #define pompapilot 7730435
    kod reaguje na obie te wartości
    w treści posta dodałem widok aplikacji VIRTUINO z podanymi pinami widgetów
    powodzenia

    OdpowiedzUsuń
  9. Dzięki za pomoc. Zrobiłem jak napisałeś, z virtuino działa i ustawianie czasu i włączanie. Na czujki mi nie reaguje, odczyt kodów zrobiłem zgodnie z instrukcją https://www.princetronics.com/how-to-read-433-mhz-codes-w-arduino-433-mhz-receiver/

    OdpowiedzUsuń
  10. To już coś działa
    w programie jest zaszyty monitor odebranych kodów na kanale 0
    virtuino.sendText(0, mess);
    wstaw w aplikacji widget terminal ustaw go na serwer ESP a text channel ID = 0
    wtedy zobaczysz pełne dane wysyłanych kodów przez czujki PIR
    pokaż te dane to będę mógł coś poradzić

    OdpowiedzUsuń
  11. Dzieki wszystko działa, wymieniłem odbiornik 433 i działa.
    Dzieki

    OdpowiedzUsuń
  12. Jest problem, urządzenie wiesza się, po około 0,5h pracy dioda od przekaźnika się nie świeci, raz chyba swieciła się cały czas. Dioda od esp też wyłączona. Nie reaguje na czujki, nie można sie dostać do niego przez virtuino. Vo może być powodem?

    OdpowiedzUsuń
  13. kod zawiera watchdog więc teoretycznie układ nawet jeśli się zawiesi powinien się sam zresetować. czy zmieniałeś coś istotnego w kodzie?

    OdpowiedzUsuń
  14. To co kazałeś i kody czujek, więcej nic. Może to sprzęt, zasilacz? Sptawdze to na wemos d1 mini.

    OdpowiedzUsuń
  15. prawdę mówiąc ja też to uruchamiałem i sprawdzałem na D1MINI

    OdpowiedzUsuń
  16. Nie jestem pewien wszystkich pinów:
    Rx-Rx vcc-3v3 io0-d3 rst-rst io2-d4 gnd-gnd tx-tx a pin en-??

    OdpowiedzUsuń
  17. tak wychodzi
    https://klovimg.com/image/HvMti

    OdpowiedzUsuń
  18. https://www.makerstore.com.au/wp-content/uploads/2017/09/ELEC-ESP01S-000.jpg
    to wiem tylko pin 4 EN (CHPD) nie wiem jaki to pin na d1

    OdpowiedzUsuń
    Odpowiedzi
    1. nie ma go wyprowadzonego - jest na stałe podpięty do Vcc
      tu masz schemat d1 mini
      https://escapequotes.net/esp8266-wemos-d1-mini-pins-and-diagram/

      Usuń
  19. Do jakich pinow d1 podpiety 433, gdzie to jest w programie? Z virtuino moge załączyć przekaźnik, na czujki nie reaguje, w terminalu nic nie ma tak jak by nie widział 433

    OdpowiedzUsuń
  20. już o tym pisałem - w programie jest przełącznik pinów ESP01 <> D1MINI
    musisz go ustawić w pliku V_pompa_3.ino w 3 linii z
    int procesor = D1MINI;
    bo pewnie masz
    int procesor = ESP01;

    OdpowiedzUsuń
  21. no to w pliku NO433.h masz przyporządkowania portów do nadajnika i odbiornika
    if (procesor == D1MINI) {
    mySwitch.enableReceive(12); // port odbiornika
    mySwitch.enableTransmit(14); // nadajnika
    }

    OdpowiedzUsuń
  22. Miałem na D1mini ale się zepsuło. Chce wgrać i mam taki błąd w zakładce virtuino.h w części :
    // //wachdog
    last_loop = millis();
    tickerOSWatch.attach_ms(((OSWATCH_RESET_TIME / 3) * 1000), osWatch);
    Taki błąd i nie umiem rozwiązać. Ma ktoś pomysł
    virtuino.h:45:5: error: 'last_loop' was not declared in this scope
    45 | last_loop = millis();
    ^~~~~~~~~

    virtuino.h:46:5: error: 'tickerOSWatch' was not declared in this scope

    46 | tickerOSWatch.attach_ms(((OSWATCH_RESET_TIME / 3) * 1000), osWatch);

    OdpowiedzUsuń