Elektroda.pl
Elektroda.pl
X
Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterownik ogrzewania wody w basenie.

17 Lis 2018 19:49 885 25
  • Poziom 11  
    Witam.

    Jakiś czas temu kupiłem Arduino , wrzuciłem do szafy i tak leży.

    Chcę zrobić sterownik do ogrzewania wody w basenie oparty o czujniki DS18B20 i arduino.

    Założenia do projektu są następujące:

    -Elementem grzejnym jest dach o powierzchni 18 m2
    -Czujniki temperatury wspomniane DS18B20
    -Filtr piaskowy
    -Pompa obiegowa 200 W
    -Wyświetlacz 16x4

    A teraz czego oczekuję od sterownika:

    - Wyświetlanie temperatury z 4 czujników:
    -wody w basenie
    -powierzchni dachu
    -zewnętrznej
    -wewnętrznej w domu
    - Sygnalizacji załączenia filtra piaskowego oraz pompy obiegowej kierującej wodę z basenu na dach.

    A teraz jak ma to działać:

    Po pobraniu danych z czujników temperatury jeżeli temperatura dachu będzie większa od temperatury wody w basenie ma się załączyć pompa filtra piaskowego oraz pompa obiegowa.
    Przy wyrównaniu temperatur pompa obiegowa ma się wyłączyć a po 2 minutach wyłączyć pompa filtra piaskowego.
    Następne załączenie pomp aby uniknąć zbyt częstego ich włączania ma nastąpić przy różnicy temperatur pomiędzy dachem a wodą w basenie o ok 10 stopni Celsjusza.

    Dobrze by było aby wykorzystać do włączania przekaźników pomp oraz czujnika temperatury wody basenowej transmitera 433 MHz.

    Proszę o porady jak taki sterownik zbudować , wraz z oprogramowaniem.
    Cała zima przede mną wiec pewnie się poduczę programowania przy okazji.
  • Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
  • Poziom 32  
    Najlepiej zacznij od kursu Arduino, darmowy jest np. tu: https://forbot.pl/blog//kurs-arduino-podstawy-programowania-spis-tresci-kursu-id5290. Ściągnij biblioteki do 1Wire, Ds18b20, LCD, najlepiej kilka, naucz się ich używać bez delay, wybierz, która Ci leży najlepiej, rozważ również inne czujniki np. LM35. Twój program powinien być "wielozadaniowy", czyli bez delay, do zarządzaniem czasu naucz się używać timerów/bibliotek obsługujących czas przez jakiś tik systemowy/lub wbudowanych w arduino funkcji millis() i micros() - znajdziesz na końcu kursu. By móc zmieniać nastawy na pewno przydałaby się umiejętność obsługi menu i przycisków (LCD już wymieniłem wcześniej), zapisywania zmian w ustawieniach (eeprom lub pamięć zewnętrzna), do zdalnej kontroli ESP8266 przez WIFI. I super poznać co to jest watchdog. Zimy może braknąć, ale nie jedna jeszcze przed nami - mam nadzieję. Kilka stówek już na sprzęt do zabawy by nie zjadła nuda w pierwszym tygodniu też lepiej zacząć odkładać. Na tym etapie to po prostu zacznij od instalacji Arduino i migania led, realizacji kursu i pojawią się bardziej sprecyzowane pytania, na razie to nawet nie wiesz czego nie wiesz.
  • Poziom 41  
    kagiva napisał:
    - Wyświetlanie temperatury z 4 czujników:
    -wody w basenie
    -powierzchni dachu
    -zewnętrznej
    -wewnętrznej w domu


    Jaki sens aż tylu czujników?
    Woda po dachu? solary? czy po prostu będzie sobie po nim spływała ?
  • Poziom 11  
    Projekt ma być rozwojowy tzn. może kiedyś sonda PH i REDOX z dozownikami chemii.
    Czujniki temperatur wystarczyłyby dwa, ale żona lubi sprawdzać gdzie jest jaka temperatura i lata z analogiem do basenu i na zewnątrz ;)

    Woda po dachu przez filtr wstępny prosto do skimmera i do filtra piaskowego.
  • Poziom 41  
    kagiva napisał:
    Woda po dachu


    Ta opcja jest chyba jedną z najgorszych - zrób /kup solary sprawność większa jak i brak dodatkowego zanieczyszczenia wody
  • Poziom 11  
    Nie mamy się zajmować jakością wody, lecz sterownikiem.
    Woda z dachu przepływająca przez filtr piaskowy nie będzie zanieczyszczona.

    Mam 2 x Arduino i to wszystko co teraz kupić by zacząć ten projekt ?
  • Relpol przekaźniki nadzorczeRelpol przekaźniki nadzorcze
  • Poziom 32  
    W sumie to napisałeś co kupić - wyświetlacz i 4xDS, do DS jeszcze rezystor 4.7k, do załączania przekaźnik sterowany z Arduino, led do sygnalizacji lub buzzer, kilka rezystorów 200-10k, no i przewody. A jak chcesz to sobie pisać sam to zestaw do przerobienia ćwiczeń z kursu, niekoniecznie ten proponowany w kursie, bo Arduino już masz a tam oryginalne to ponad 50% wartości paczki. Zerknij co jest w paczce i kup sobie jakieś zestawy na Aliexpress/Allegro lub w sklepie.
  • Poziom 32  
    Kod programu wkleja się w pełnej edycji postu. Zrobiłeś sobie zmienne globalne i zmienne lokalne funkcji loop, innego typu i o tych samych nazwach. Tych dwóch różnych zmiennych o tej samej nazwie nie użyjesz równocześnie. Kurs był ciekawy?
  • Poziom 11  
    Teraz działa, do testów mała histereza.
    Tylko zmienne wywołane przyporządkowaniem czujników a nie nazwami zmiennych, które by były bardziej dla mnie wyraziste w programie.




    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 31  
    kagiva napisał:
    - Wyświetlanie temperatury z 4 czujników:
    -wody w basenie
    -powierzchni dachu
    -zewnętrznej
    -wewnętrznej w domu

    Pamiętaj o zabezpieczeniu ESD. Najlepszy jest DS9503.
    Jak nie chcesz aby awaria jednego czujnika nie zablokowała wszystkich, zrób osobne magistrale. Doskonale do tego nadaje się DS2482-800. Jak nie chcesz się wykosztować, to użyj uC z odpowiednią liczbą UART dla 1-Wire. Uno się nie nadaje, możesz niby dołożyć SC16IS7xx ale są drogie. Lepiej użyć ArduinoMega, który ma 4 UART ale jeden w praktyce odpada na pseudo debugowanie. Pomyśl o ARM z np 6 UART.
    Czujniki możesz połączyć np tak:
    - Magistrala 1: woda w basenie
    - Magistrala 2: powierzchnia dachu
    - Magistrala 3: temp. zewnętrzna + wewnętrzna w domu
    Tyle o sprzętowym podłączeniu czujników.

    Co do obsługi programowej, wysyłasz komendę konwersji do wszystkich termometrów. Timerem odliczasz czas (albo używasz millis), nie blokując programu głównego i po czasie konwersji odczytujesz WSZYSTKIE rejestry każdego czujnika i sprawdzasz CRC.
    Co do millis, poczytaj o problemie przepełnienia licznika i zabezpiecz się przed tym.

    Uwzględnij sytuacje awaryjne (brak czujnika, błędy transmisji).
    Używaj WDG, włącz przerwania od WDG, będzie łatwiej namierzyć gdzie program się zawiesza.
    Dobrze jest sygnalizować co jest przyczyną resetu (BOR, POR, WDG, wejście reset). To pomaga w diagnostyce problemów.
    Błędy warto logować, np w wewnętrznej EEPROM. Powstanie problem odczytu logów, na LCD może to być niewygodne ale w płytkach Arduino masz USB przez mostek UART. Naturalnie UART w przerwaniach. UNO nie bardzo nadaje się do tego, bufor na UART, bufor na I2C, na LCD, idt, itp i 2kB za mało, więc kolejny powód aby użyć co najmniej Mega.

    Dodano po 4 [minuty]:

    Co do LCD, najlepiej podłączyć bezpośrednio do uC a nie przez jakieś ekspandery I2C zwłaszcza przestarzały PCF8574. Jeśli już to użyj nowszego, szybszego, 16 bit, najlepiej z SPI. Jeśli musi to być I2C, użyj przerwań do jego obsługi. Ze względu na to, ze wskazane jest użycie ArduinoMega, LCD należałoby podłączyć w obszarze EXTRAM i wykorzystać buskeeper. Fajnie obsługuje się LCD na przerwaniach, np co 1ms wysyłasz 1 znak. Przy 4x16, cały wyświetlacz jest odświeżany co 64ms. W RAM masz bufor do którego wpisujesz znaki do wyświetlenia. Zaletą jest to, że obsługa wyświetlacza nie pochłania praktycznie czasu pętli głównej. Inne mechanizmy spowodują, że program główny "wisi" przy obsłudze LCD kilkanaście czy kilkadziesiąt ms.

    Dla pomp zrób timeotut, aby z powodu np błędu w programie nie pracowały bez przerwy. Oczywiście takie zdarzenie warto odnotować w logach.

    W pętli głównej przechodź w tryb IDLE albo inny oszczędzający energię a przy okazji zmniejszający EMI.

    Dodano po 38 [minuty]:

    Nic nie napisałeś o tym, jak zamierzasz wprowadzać nastawy. Wygodny jest enkoder. Nastawy zapisuj w EEPROM, chroń przez CRC. Warto zrobić dwie kopie, w razie awarii jednej dane odzyskasz z drugiej. Jak sięnie uda przywrócisz standard. Warto poinformować użytkownika o przywróceniu kopii lub standardowych ustawień. Ponadto powinno to być zalogowane.


    PS
    Oczywiście, można to wszystko zrobić na UNO, LCD przez PCF, delay, zero zabezpieczeń, zero diagnostyki, bez WDG ale czy będziesz zadowolony z projektu, który działa tylko gdy wszystko jest ok i byle błąd zawiesi program?
  • Poziom 11  
    Z założenia to miało być jak najmniej skomplikowane, a z tego co piszesz to projekt pochłonął by nie dość że fundusze to i czas poświęcony na pisanie programu.

    Nastawy będą raz skonfigurowane to tylko histereza zadziałania pompy i zwłoka czasowa wyłączenia filtra.

    Przepełnienie licznika millis mi raczej nie grozi, sterownik będzie uruchamiany rano a wyłączany ok 17, kiedy słońce nie będzie oświetlało dachu.

    Projekt ma być jak najbardziej budżetowy i z racji mojej skromnej wiedzy na temat programowania - prosty.

    Dodatkowymi funkcjami, które nie były uwzględnione wcześniej mają być manualne włączanie pompy oraz filtra.
  • Poziom 31  
    kagiva napisał:
    a z tego co piszesz to projekt pochłonął by nie dość że fundusze

    Różnica w cenie, pomiędzy UNO a Mega nie jest duża, to cena 2 piw w barze. Arduino nie będziesz kupował co tydzień, tylko raz, więc nie pisz o dużych kosztach, duże będą jak zaczniesz dokładać do UNO kolejne układy, które w przypadku Mega czy ARM nie są potrzebne.

    kagiva napisał:
    z racji mojej skromnej wiedzy na temat programowania - prosty.

    Jak będzie prosty, to będzie zawodny.
    - Program się zawiesi i jeśli się nie zorientujesz, w takim stanie będzie dopóki nie wymusisz resetu a wszytko prze prostotę czyli brak WDG.
    - Nie będziesz sprawdzał CRC, kontrolował występowania presence, magistrala 1-Wire zastanie uszkodzona termometr odczyta 0 albo -127 stopni, wszystko dlatego, że zrobiłeś prosto.
    - Jeden czujnik czy przewód uszkodzi się, wszystkie przestaną funkcjonować, bo zrobiłeś prosto, wszystko na jednej magistrali.
    - Przypuśćmy, ze obsłużysz WDG, zadziała ale nie wiesz jaka funkcja to spowodowała, wszystko dlatego, ze program jest prosty i nie masz przerwań od WDG.
    - Sterownik będzie się resetował, długo będziesz szukał przyczyny, o nie badasz przyczyny resetu, wszystko dlatego, że program jest prosty.

    "Kilka" programów napisałem, i ok 30% programu to procedury diagnostyczne, kontrola błędów, logi.
    W Internecie widziałem setki "genialnych" programów, które można "wykrzaczyć" w kilka sekund!
    Nagminne błędy, to:
    - Zawieszanie CPU gdy w I2C podciąganie będzie niepodłączone (niedolutowany rezystor).
    - Kolejny, to pokazywanie przez termometr 0 stopni gdy zwarta magistrala 1-Wire i np sterownik lodówki jest przekonany, że nie trzeba włączać agregatu a z zamrażalnika już cieknie. To samo gdy brak termometru, -127, więc po co chłodzić? Agregat lodówki pracuje 8 godzin ale sterownika to nie dziwi, że temperatura nie spada.
    - W sterowniku pralki, zawór wody otwarty godzinę, woda nie osiągnęła wymaganego poziomu, ale sterownik, niczym mechaniczny, trzyma otwarty zawór. W konsekwencji, woda z uszkodzonego wężyka, przestaje się lać w pomieszczeniu gdy zawór się spali od przegrzania.
    - Sterownik rolet trzyma włączony 10 minut silnik, bo krańcówka nie dała sygnału, że roleta osiągnęła skrajne położenie, choć rolety powinny to zrobić w kilka sekund.

    Mógłbym mnożyć i mnożyć przykłady.
    Nadal chcesz napisać prosty program?
    Czy chciałbyś aby pralka, lodówka miała prosty program i działała jak opisałem wcześniej? Chciałbyś prosty program w sterowniku pieca? Poduszkach powietrznych samochodu? ABS? W samolocie?

    Dodano po 14 [minuty]:

    kagiva napisał:
    projekt pochłonął by nie dość że fundusze to i czas poświęcony na pisanie programu.

    Dobrego programu nie pisze się w tydzień. Stosunkowo prosty program to ok miesiąc pracy.
    Dobry program trzeba jeszcze przetestować i to nie trwa dzień czy dwa, raczej od tygodnia w górę.
  • Specjalista - ESP32, ESP8266
    LChucki napisał:
    Co do LCD, najlepiej podłączyć bezpośrednio do uC a nie przez jakieś ekspandery I2C zwłaszcza przestarzały PCF8574. Jeśli już to użyj nowszego, szybszego, 16 bit, najlepiej z SPI

    PCF8574 wprawdzie jest starą konstrukcja, ale do celów obsługi wyświetlacza alfanumerycznego LCD w zupełności wystarczającą. Użycie szybszych ekspanderów I2C nie wpłynie na poprawienie jakości wyświetlania, ani na lepsze działanie samego programu w tym konkretnym projekcie.

    LChucki napisał:
    Jeśli musi to być I2C, użyj przerwań do jego obsługi. ... Fajnie obsługuje się LCD na przerwaniach, np co 1ms wysyłasz 1 znak.

    Rozwiązanie to jest nadmiarowe i niepotrzebnie angażuje dodatkowe zasoby procesora. Obsługa wyświetlacza LCD może pozostać w loop(), przy czym należy zwrócić uwagę na dwie rzeczy:
    1. Komendy do wyświetlacza powinny być wysyłane tylko wtedy, kiedy związane jest to z faktyczną zmianą treści lub jej części - należy więc sprawdzać, np. czy kolejna wartość temperatury do wyświetlania nie jest taką samą, jak już była wyświetlona w poprzedniej iteracji loop(). W ten sposób zostanie zminimalizowany czas potrzebny na obsługę wyświetlacza w loop().
    2. Zminimalizować lub wręcz wykluczyć użycie funkcji clear() wyświetlacza, która jest czasochłonna i może powodować odczuwalny efekt migotania.

    Obsługę przerwań lepiej zarezerwować do bardziej krytycznych zadań wymagających reżimu czasowego - nie jest nim obsługa wyświetlacza LCD.
  • Poziom 11  
    Teraz taka prośba jak zastąpić delay na millis aby program był bez stopów.

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Specjalista - ESP32, ESP8266
    Jeżeli chcesz to naprawdę porządnie zrobić z użyciem millis() to proponuję nieco zainwestować w samo-edukację i wykorzystać bibliotekę TaskScheduler:
    https://github.com/arkhipenko/TaskScheduler
    Jest to system harmonogramowania zadań pracujący w trybie event-driven, bez użycia przerwań - do odmierzania czasu używa właśnie millis().
    Mnóstwo przykładów:
    https://github.com/arkhipenko/TaskScheduler/tree/master/examples
    oraz niezła dokumentacja:
    https://github.com/arkhipenko/TaskScheduler/tree/master/extras
    Używam tej biblioteki wtedy, kiedy nie mogą skorzystać z RTOS na danej platformie.
  • Poziom 11  
    Chcę to zrobić by działało i na ten czas tak jest.
    Podstawowe założenie jest spełnione - tryb termostatu z histerezą, reszta to bajery, które mogą być lecz nie koniecznie.
    Nie będę się edukował dla jednego projektu, i tak jestem zadowolony z efektu, do którego doszedłem.
    Pozostają opóźnienia millis i manualne załączanie pomp.

    Porozpisywaliście się co i jak zrobić na poziomie wytrawnych znawców programowania, a nie taki był cel założenia tego wątku.


    Sterownik na dzień dzisiejszy działa i ma się całkiem dobrze.
    Chcę dodać diody do sygnalizacji stanu pomp.
    Jak przypisać zmienną do pinów expandera PCF8574.
    Zależy mi aby np:
    LED_POMPY_RED = 1 pin pierwszego expandera
  • Poziom 11  
    Nie ma ani jednego przykładu z przypisaniem zmiennej do pinu expandera.
  • Poziom 32  
  • Poziom 11  
    pcf8574.digitalWrite(P0, HIGH);

    to nie deklaracja zmiennej a wywołanie działania na danym pinie.
    ja potrzebuję :

    LED_POMPY_RED = pcf8574.(P0);

    tylko to nie działa
  • Poziom 32  
  • Poziom 11  
    Mam już zadeklarowane takie zmienne, które są użyte w programie.
    8 diod i 7 przycisków, nie chce mi się przepisywać całości - łatwiej zmienić przypisanie pinów do użytych zmiennych - tak mi się wydawało .
    Zabrakło mi pinów w UNO i dlatego dołożyłem PCF-y.

    Proste pytanie da się czy nie ?
  • Specjalista - ESP32, ESP8266
    kagiva napisał:
    Proste pytanie da się czy nie ?

    Prosta odpowiedź: da się, wykorzystując bibliotekę, która podałem w poście #18. Piny ekspandera to nie to samo, co piny procesora.

    Możesz napisać oczywiście własne wersje funkcji digitalWrite() i digitalRead(), które będą przyjmowały jako parametr bezpośrednio piny ekspandera. Nie jest to trudne, można skorzystać ze wspomnianej biblioteki w celu ich implementacji.
  • Poziom 32  
  • Poziom 11  
    Wyrzucę diody LED na expandery, z przyciskami byłby tylko kłopot.
    Uzyskane miejsce w UNO będę mógł wykorzystać na PH i REDOX.
    Pompki dozujące najwyżej też dodam do expandera.