Sky Control v1
Witam wszystkich, chciałbym wam przedstawić prosty moduł kontroli temperatury i wilgotności, będący w stanie za pomocą przekaźników sterować parametrami pomieszczenia. Przekaźniki obsługują urządzenia do około 2 KW. Ja używam Sky Control by sterować wilgotnością oraz temperaturą w terrarium.
Sterownik oparty jest o Arduino UNO (lub klon) oraz czujnik temperatury i wilgotności DHT22.
Informacja dla Administracji: Mój projekt wrzuciłem wcześniej na jeden z anglojęzycznych portali poświęconych Arduino. Jeśli będzie to konieczne mogę udowodnić, że to ja jestem jego oryginalnym autorem.
1. Lista zakupów:
- Arduino Uno (lub klon)
- Sensor DHT22
- LCD Keypad Shield – ja używam tego z firmy DFRobot
- 2 kanałowy moduł przekaźników, sterowny 5V
Opcjonalnie – używam tego w terrarrium
- Ultradźwiękowy nawilżacz USB
- Płytka grzewcza
- Zasilacz USB (ja użyłem osobnego do zasilania nawilżacza oraz płytki grzewczej)
- Zasilacz do Arduino (nie ma sensu bawić się z bateriami)
- Screw Shield (nie trzeba lutować)
- Kabelki goldpin rożnego rodzaju
2. Podłączenie podzespołów
Schemat nie zawiera podłączenia urządzeń do przekaźników. Generalna zasada mówi, iż do przekaźnika do portów COM1 i COM2 podpinamy źródło zasilania, a do NO1 i NO2 (NO -normally open) przewód dodatni urządzenia.
Schemat do programu Fritzing do pobrania niżej, tak samo jak i biblioteka części.
W przypadku podłączania czujnika DHT22 nieposiadającego rezystora (ja taki miałem), należy pomiędzy gniazdem A1 i 5V dać rezystor 4,7k ohm. (lub inaczej – rezystor trafia pomiędzy nóżkę danych czujnika, a zasilanie 5V). Rezystor jest umieszczony na schemacie.
Nie pokazuję podłączenia ekranu, gdyż jako. iż jest to shield, nakładamy go na moduł Arduino.
Podłączenie wygląda tak:
3. Kod programu
Wyświetlanie odczytów i instrukcje są w języku angielskim (idealnie mieściły się na ekranie). Jeśli ktoś chce, łatwo je zmienić na język polski.
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
/*Sky Control - Kontrola temperatury i wilgotności - autor: Gratak (ArkadiuszO2) * Czytajcie komentarze * Podstawowa lista zakupów * 1. Arduino Uno * 2. Czujnik DHT22 * 3. 2 kanałowy moduł przekaźników - 5V * 4. DFRobot LCD Keypad Shield * * W wersji 2 pojawi się dodatkowo odczyt stężenia pyłu PM2.5 oparty na czujniku Sharp GP2Y1010AU0F */ #include <LiquidCrystal.h> #include <DFR_Key.h> #include <DHT.h> //Wartości początkowe, można zmieniać dowolnie (byle by powyżej 0) int temp = 25; int hum = 50; //Dla czujnika DHT22 (AM2023) #define DHTPIN 15 #define DHTTYPE DHT22 const int relay1 = 18; const int relay2 = 19; DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); DFR_Key keypad; int localKey = 0; String keyString = ""; int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 int read_LCD_buttons(){ adc_key_in = analogRead(0); if (adc_key_in > 1000) return btnNONE; if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT; } void setup() { pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Sky control v1"); lcd.setCursor(0, 1); lcd.print("Instr on Select"); delay(2500); Serial.begin(9600); dht.begin(); delay(1000); lcd.clear(); //Sample rate (domyślnie 10 ms) keypad.setRate(10); digitalWrite(relay1, HIGH); digitalWrite(relay2, HIGH); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { //sprawdzamy czy czujnik działa lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Sensor broken!!"); delay(10000); } else { /*Można zmienić wartości (krok) zmiany zadanych parametrów po każdorazowym naciścnięciu guzika, domyślnie jest 1'C per naciśnięcie i 5% wilgotności per naciśnięcie*/ lcd_key = read_LCD_buttons(); switch (lcd_key){ case btnLEFT:{ temp = temp +1; break; } case btnRIGHT:{ temp = temp - 1; break; } case btnUP:{ hum = hum + 5; break; } case btnDOWN:{ hum = hum - 5; break; } case btnSELECT:{ lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hum Up/Down +-5%"); lcd.setCursor(0, 1); lcd.print("Temp L/R +-1"); lcd.print((char)223); lcd.print("C"); delay (5000); break; } } lcd.setCursor(0, 0); lcd.print("Hum: "); lcd.print(h); lcd.print("%"); lcd.print("("); lcd.print(hum); lcd.print("%)"); lcd.setCursor(0, 1); lcd.print("Tem: "); lcd.print(t); lcd.print((char)223); lcd.print("("); lcd.print(temp); lcd.print((char)223); lcd.print(")"); /*Blok poniżej dobija wilgotności o 10% powyżej ustalonego limitu, tak by nawilżacz nie włączał się non stop dla 1% (przykładowo przy zadanych 50%, po spadku do 49% nawilżacz by się włączył, a przy 50% wyłączył. Jeśli potrzebujecie dokładnego działa, należy usunąć/zakomentować 5 lnii poniżej i usunąć komentarz kolejnego bloku*/ int H = hum + 10; if(h < hum ) digitalWrite(relay1, LOW); else if (h >= H) digitalWrite(relay1, HIGH); /* <- Usuwamy komentarz, ale KONIECZNIE komentujemy lub usuwamy 5 linni kodu powyżej tego miejsca! if(h < hum ) digitalWrite(relay1, LOW); else digitalWrite(relay1, HIGH); */ if(t < temp ) digitalWrite(relay2, LOW); else digitalWrite(relay2, HIGH); } } |
Plik ino oraz konieczne do jego kompilacji biblioteki do pobrania poniżej.
3. Działanie
Po podłączeniu (u mnie kable mają około 1.5m, dłuższych nie testowałem), moduł ustawi cele dla wilgotności oraz temperatury na takie jakie wpisaliśmy w kodzie (domyślnie 25 st C i 50% wilgotności). Na ekranie pojawią się też aktualne odczyty. Przyciskami pod ekranem możemy sterować zadanymi parametrami pracy.
Domyślnie GÓRA/DÓŁ zmienia zadaną wilgotność o +-5%, a przyciski PRAWO/LEWO zmieniają zadaną temperaturę o +-1 st C.
By uniknąć zbyt częstego włączania i wyłączania nawilżacza, po spadku wilgotności o 1% poniżej zadanej, nawilżacz włączy się, ale przekroczy zadany limit o 10%. By tego uniknąć należy zmienić kod (komentarze w kodzie).
W kolejnej wersji urządzenia dodam czujnik stężenia pyłu PM2.5 oparty o SHARP GP2Y1010AU0F.
W przypadku problemów z podłączeniem, lub kodem – służę pomocą.
Szkoda, że do zapisu danych nie wykorzystałeś pamięci EEPROM. Po każdym braku zasilania trzeba na nowo ustawiać parametry. Rozumiem, że wyświetlacz cały czas się świeci?
To mój pierwszy projekt na Arduino (uczę się). W 2 wersji mam zamiar dodać logowanie zmian temperatury i wilgotności na kartę SD, oraz dodać czujnik stężenia pyłu PM 2.5. Co do parametrów, startowe ustawia się w kodzie, ale pomysł bardzo dobry, żeby je pamiętał.
Witam, jak zrobić aby grzanie załączało się po spadku temperatury o 0,5 C i wyłączało po osiągnięciu zadanej temp. ( np: zadana temp: 21 C , temp spada o 0,5 C czyli do 20,5 C i załącza się grzanie , i jak osiągnie 21 C się wyłącza.