Witam. Z góry uprzedzam, że kod źródłowy nie jest mojego autorstwa, a jest to zlepek kilku projektów dostępnych w Sieci, które udało mi się w lepszy lub gorszy sposób poskładać w całość i uruchomić. Najważniejsze, że działa tak jak chciałem. W przyszłości będę chciał go rozbudować i ulepszyć. Arduino mam o 2 tygodni i na razie jestem na etapie ctrlc, ctrlv:)
Zasada działania prosta, ale wydaje mi się skuteczna. W dwóch pomieszczeniach na piętrze umieszczone będą czujniki temperatury DS18B20. Na grzejnikach zamontowane będą elektrozawory (w stanie beznapięciowym zamknięte). Jeśli temperatura w pomieszczeniu spadnie poniżej zadanej, elektrozawór na grzejniku zostanie otwarty i do nadajnika zostanie wysłany sygnał który uruchomi piec. Na schemacie nie wrysowywałem przekaźników, zostaną dołączone przed rezystorem diody.
Chciałem, żeby sygnał dla pieca wysłany był z opóźnieniem 2-4 min, bo tyle mniej więcej trwa otwarcie zaworów grzejnikowych, ale nieszczęsna funkcja delay rozkładała mi program. Na razie nie wiem jak ją obejść.
Wykorzystane (najważniejsze) elementy:
- Termostat (nadajnik) : Arduino UNO, czujnik DS18B20, nadajnik 433MHz RF FS100A, LCD 16 2 z modułem I2C, przekaźnik z cewką 5VDC do wysterowania elektrozaworu
- Odbiornik: Arduino Nano, odbiornik 433MhZ, przekaźnik z cewką 5VDC
Poniżej schematy i kody. Dotyczą jednego nadajnika, ale docelowo będzie jeden nadajnik z rozprowadzonymi dwoma czujnikami, lub dwa pojedyncze jak niżej, ale nie wiem, czy odbiornik obsłuży 2 takie same nadajniki.
Mile widziane wszelkie sugestie co do ulepszenia.
Kod pewnie się przyda nowicjuszom, takim jak ja:)
Nadajnik/termostat
Kod termostatu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#include <VirtualWire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); #include <OneWire.h> #include <DallasTemperature.h> int p1 = 7; // przycisk zwiekszajacy nastawe temperatury T1 int p2 = 6; // przycisk zmniejszajacy nastawe temperatury T1 int p1state = 0; int p2state = 0; #define ONE_WIRE_BUS A0 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int nastaw1 = 22; // zadana temperatura T1 int przekaznik1 = 8; // pin przekaznik elektrozaworu z czujnika T1 void setup(void) { lcd.init(); lcd.backlight(); vw_set_tx_pin(12); //pin sygnalowy do nadajnika RF vw_setup(2000); // Bits per sec pinMode(przekaznik1,OUTPUT); pinMode (7, INPUT_PULLUP); // przycisk zwiekszajacy nastawe temperatury pinMode (6, INPUT_PULLUP); // przycisk zmniejszajacy nastawe temperatury sensors.begin(); Serial.begin(9600); } void wys(void) { sensors.requestTemperatures(); lcd.setCursor(0, 0); lcd.print("T1="); lcd.print(sensors.getTempCByIndex(0)); lcd.print(" "); lcd.print("NT1="); lcd.print(nastaw1); if (sensors.getTempCByIndex(0) < (nastaw1)) { digitalWrite(8,HIGH); } if (sensors.getTempCByIndex(0) > (nastaw1+1)) // histereza { digitalWrite(8,LOW); } } void loop() { p1state = digitalRead(p1); p2state = digitalRead(p2); if(p1state == LOW){nastaw1=nastaw1+1;} if(p2state == LOW){nastaw1=nastaw1-1;} wys(); char *msg; if (digitalRead(8) == HIGH) {msg="on"; } else {msg="off"; } ; vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Wait until the whole message is gone } |
Odbiornik
Kod odbiornika
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <VirtualWire.h> char stan; void setup() { Serial.begin(9600); pinMode (10,OUTPUT); // sygnal do przekaznika vw_setup(2000); vw_set_rx_pin(4); // sygnal z odbiornika RF vw_rx_start(); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { int i; String stan; for (i = 0; i < buflen; i++) { stan +=char(buf[i]); } if ( stan =="on") {digitalWrite (10, HIGH);} else {digitalWrite (10, LOW);} delay(200); } } |
Witam fajny projekt, ja z delay poradziłem sobie przy pomocy tego wpisu o bibliotece timers http://forum.arduinopolska.com/watek-biblioteka-timers-koniec-z-uciążliwym-delay
A żeby zrozumieć jak to działa i radzić sobie bez biblioteki warto przeczytać https://techniczny.wordpress.com/2012/04/07/wielozadaniowosc-w-arduino/
Delay zamień na funkcję millis(), nie zatrzymuje działania programu i dla 3-4 minut będzie dokładna. Ewentualnie zastosuj zegar czasu rzeczywistego :)
Powodzenia w realizacji projektu !
Wspaniałe urządzonko daję 5+
Fajny i szybki projekt :)
Dzięki za oceny i komentarze. Powalczę z milis i dodatkowo chciałbym wykorzystać ESP8266, żeby przy okazji wrzucać na Suplę.
Bardzo fajny projekcik. Jak będzie gotowy w całości podjadę (rowerem) aby zobaczyć na “żywo” zasadę działania.
Gratulację pomysłu
Zapraszam Jacku:)
Projekt jest niepełny :
Przydało by się jakieś hasło wysyłane a nie tylko On/Off aby weryfikować sygnał wysyłany na 433MHz
LCD jest, jak wynika nawet z kodu, ale fakt, nie wrysowałem w schemat.
Projekt (kod programu) dotyczy jednego czujnika i jednego elektrozaworu, ale wspomniałem o dwóch czujnikach, bo docelowo będą dwa czujniki i dwa elektrozawory, każdy w innym pomieszczeniu. Czyli sterowane będą zawory w danym pomieszczeniu. Piec załączy się i będzie pompował wodę tylko tam, gdzie temperatura spadnie poniżej zadanej. Nastawy dla pomieszczeń mogą być różne. Mam piec gazowy, który w większość czasu jest wyłączony, bo jest ogrzewanie kominkiem. Piec ma się włączyć tylko wtedy, kiedy trzeba szybko podgrzać dane pomieszczenie. Wg mnie rozwiązanie jest poprawne.