[code] /* Programm für Zimmergewächshaussteuerung von AM, am 07.02.2017 Quellen für HYT939: http://www.hygrochip.com/index.php?id=3854 http://www.loetstelle.net/arduino/hyt939/hyt939.php Ein Relais schaltet Zeitabhängig LED-Lampen zur Pflanzenbeleuchtung Damit die Temperatur nach Abschalten der Lampen nicht zu weit absinken kann, wird eine elektrische Heizfolie über ein Relais zugeschaltet. Programmrelevante Bauelemente: Arduino Micro Display: LCD Modul 20x4 über i²C RTC: DS3231 über i²C, Temperatursensor wird zur Überwachung der Board- / Gehäuseinnentemperatur ausgelesen Feuchte- und Temperatursensor: HYT939 über i²C für 1. Pflanzschale Feuchte- und Temperatursensor: DHT22 für 2. Pflanzschale */ #include #include "RTClib.h" #include // Library für OLED #include "DHT.h" // DHT Temperatur- und Feuchtesensor #include #include #define HYT939_ADDR 0x28 // i²C Adresse Feuchte- und Temperatursensor HYT939 #define DHTPIN 4 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); // Erzeuge ein DHT-Objekt #define I2C_ADDR 0x27 #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin); unsigned int hourOn = 06; // Einschaltzeit Licht Stundenwert unsigned int minOn = 00; // Einschaltzeit Licht Minutenwert unsigned int hourOff = 22; // Ausschaltzeit Licht Stundenwert unsigned int minOff = 00; // Ausschaltzeit Licht Minutenwert unsigned int onTime = hourOn * 60 + minOn; // Einschaltzeit in Minuten seit Mitternacht unsigned int offTime = hourOff * 60 + minOff; // Ausschaltzeit in Minuten seit Mitternacht unsigned long Systemzeit; // aktuelle Systemzeit in Sekunden unsigned long Einschaltzeit; // Zeitpunkt Systemneustart in Sekunden unsigned long Einschaltverzoegerung = 90; // Sekunden, Einschaltverzögerung für Lampen nach Neustart wegen hohem Einschaltstrom und Einschwingzeit Netzteil int TempMin = 21; // Einschalttemperatur int TempMax = 23; // Ausschalttemperatur const unsigned int RELAIS_PIN_1 = 10; const unsigned int RELAIS_PIN_2 = 11; const unsigned int RELAIS_PIN_3 = 12; char zeit[10]; // für Zeitanzeige char datum[10]; unsigned int y, month, d, h, m; // für Zeitanzeige RTC_DS3231 rtc; // Erzeuge RTC-Objekt DateTime dateTimeNow; // Zum Speichern der RTC-Werte int i_rtc_temp; // rtc-Temperatursensor int HYT939Temp, HYT939rF; void setup() { pinMode(RELAIS_PIN_1, OUTPUT); pinMode(RELAIS_PIN_2, OUTPUT); pinMode(RELAIS_PIN_3, OUTPUT); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); digitalWrite(RELAIS_PIN_1, LOW); digitalWrite(RELAIS_PIN_2, LOW); digitalWrite(RELAIS_PIN_3, LOW); // Serial.begin(9600); Wire.begin(); dht.begin(); lcd.begin (20, 4); lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); lcd.setBacklight(HIGH); lcd.home (); rtc.begin(); // Initialisierung RTC Objekt // following line sets the RTC to the date & time this sketch was compiled // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Diese Zeile setzt den RTC mit einem expliziten Datum & Uhrzeit, zB um den 21. Mai 2015 um 18:00 Uhr aufzurufen : (24 Stunden) // rtc.adjust (DateTime (2015, 5, 21, 18, 0, 0)); dateTimeNow = rtc.now(); Einschaltzeit = dateTimeNow.unixtime(); // Sekunden, Zeitpunkt Systemneustart } void loop() { // DTH Sensor Feuchte auslesen float h_dht = dht.readHumidity(); int dht_h = round(h_dht); // DTH Sensor Temperatur auslesen float t_dht = dht.readTemperature(); int dht_t = round(t_dht); read_time_and_temp_from_rtc(); read_hyt939(); lcd.clear(); // Zeit und Datum anzeigen lcd.setCursor(0, 0); sprintf(zeit, "%02d:%02d", h, m); lcd.print(zeit); lcd.print(" Uhr"); lcd.print(" "); sprintf(datum, "%02d.%02d.%04d", d, month, y); lcd.print(datum); lcd.setCursor(0, 1); lcd.print("S1: "); lcd.print(HYT939Temp); // Temperaturanzeige HYT939 lcd.print("\337C"); lcd.print(" "); lcd.print(HYT939rF); // Anzeige Luftfeuchte HYT939 lcd.print("%"); lcd.setCursor(0, 2); lcd.print("S2: "); lcd.print(dht_t); // Temperaturanzeige DHT lcd.print("\337C"); lcd.print(" "); lcd.print(dht_h); // Anzeige Luftfeuchte DHT lcd.print("%"); lcd.print(" Bd."); // Anzeige Temperatur von RTC als Gehäuseinnentemperatur lcd.print(i_rtc_temp); lcd.print("\337C"); // Licht schalten unsigned int MinutenSeitMitternacht = (h * 60) + m; if (MinutenSeitMitternacht >= onTime && MinutenSeitMitternacht < offTime && Systemzeit >= (Einschaltzeit + Einschaltverzoegerung)) { digitalWrite(RELAIS_PIN_1, HIGH); // schaltet Licht an lcd.setCursor(0, 3); lcd.print("Licht an"); } else { digitalWrite(RELAIS_PIN_1, LOW); // schaltet Licht aus lcd.setCursor(0, 3); lcd.print("Licht aus"); } // Heizung schalten if (HYT939Temp <= TempMin) { digitalWrite(RELAIS_PIN_2, HIGH); // Heizung an } // dazwischen liegt Schalt-Hysterese else if (HYT939Temp >= TempMax) { digitalWrite(RELAIS_PIN_2, LOW); // Heizung aus } // Anzeige Status Heizungsrelais boolean RELAIS_2_STATUS = digitalRead(RELAIS_PIN_2); if (RELAIS_2_STATUS == HIGH) { lcd.setCursor(10, 3); lcd.print("Heiz. an"); } else { lcd.setCursor(10, 3); lcd.print("Heiz. aus"); } delay(15000); } void read_hyt939() { // HYT939 Temperatur Sensor auslesen #define TFACTOR 99.2909 #define TDELTA 40.0 #define HFACTOR 163.83 unsigned int traw; unsigned int hraw; double temp; double hum; unsigned int i; unsigned char buffer[4]; Wire.beginTransmission(HYT939_ADDR); Wire.endTransmission(); delay(100); Wire.requestFrom(HYT939_ADDR, 4, true); i = 0; while (Wire.available()) { char c = Wire.read(); buffer[i] = c; i++; } traw = buffer[2] * 256 + buffer[3]; hraw = buffer[0] * 256 + buffer[1]; traw &= 0xfffc; hraw &= 0x3fff; traw = traw / 4; temp = (double)traw / TFACTOR; temp = temp - TDELTA; HYT939Temp = round(temp); // In int konvertieren und runden für Anzeige ohne Dezimalstellen hum = (double)hraw / HFACTOR; HYT939rF = round(hum); // In int konvertieren und runden für Anzeige ohne Dezimalstellen } void read_time_and_temp_from_rtc() { dateTimeNow = rtc.now(); y = (dateTimeNow.year()); month = (dateTimeNow.month()); d = (dateTimeNow.day()); h = (dateTimeNow.hour()); m = (dateTimeNow.minute()); Systemzeit = dateTimeNow.unixtime(); // für Berechnung der Einschaltverzögerung i_rtc_temp = round(rtc.getTemperature()); // liest Temperatursensor der RTC aus und rundet } [/code]