#include //Setup Sensoren #include #include //Setup SD SDK=D13, MOSI=D11, MISO=D12 #include //Setup LCD #include LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x3F = Adresse des Displays static unsigned long last_lcd_time = 0; static unsigned long last_mess_time = 0; static unsigned long last_schalt_time = 0; class Truhe { private: int _relay; DHT _dht; int _stat = -1; int _cur_temp = 0; int _updlcd = 0; String _name = ""; public: Truhe(String name, int relay, int dhtpin, int dhttype) { _name = name; _relay = relay; _dht.setup(dhtpin); pinMode(_relay, OUTPUT); }; void mess() { //Serial.println(String(_name) + " mess()"); //Serial.print("Minimum Sampling Period: "); //Serial.println(_dht.getMinimumSamplingPeriod()); //delay(_dht.getMinimumSamplingPeriod()); _cur_temp = _dht.getTemperature(); //Serial.println(String(_name) + "\t\t" + String(_cur_temp) + " grad gelesen"); }; void log(File logfile) { //Serial.println(String(_name) + " log()"); String logdata = String(_name) + "\t" + String(_cur_temp) + "\t" + String(_stat); logfile.println(logdata); } void updateLCD(int row) { //Serial.println(String(_name) + " updateLCD("+String(row)+")"); //LCD-Anzeige lcd.setCursor(0, row); //...(Zeichen,Zeile); lcd.print(_name + " " + String(_updlcd)); lcd.setCursor(8, row); lcd.print(" "); //Serial.println(sizeof(String(_cur_temp))/2); lcd.setCursor(11 - sizeof(String(_cur_temp))/2, row); lcd.setCursor(8, row); lcd.print(String(_cur_temp)); lcd.setCursor(11, row); lcd.print("\337"); lcd.setCursor(13, row); if (_stat == -1) { lcd.print("-"); } else if (_stat == 1) { lcd.print("I"); } else if (_stat == 0) { lcd.print("O"); } if(_updlcd == 0){ lcd.setCursor(15, row); lcd.print(String("|")); //Serial.println(String(_name) + " updateLCD("+String(row)+") ."); _updlcd = 1; }else{ lcd.setCursor(15, row); lcd.print(String("-")); //Serial.println(String(_name) + " updateLCD("+String(row)+") "); _updlcd = 0; } } void schalt(int oT, int uT) { Serial.print(String(_name) + " schalt() stat: " + String(_stat)); if (_cur_temp >= oT && _stat != 1) { digitalWrite(_relay, LOW); _stat = 1; Serial.println("schalt " + _name + " zu " + String(_stat)); } else if (_cur_temp <= uT && _stat != 0) { digitalWrite(_relay, HIGH); _stat = 0; Serial.println("schalt " + _name + " zu " + String(_stat)); } } void printName(){ //Serial.println(_name); } }; //* **EINSTELLUNGEN** *// #define DHTTYPE DHT22 #define SETUPTIMEOUT 500 // So, the minimum sampling period is the minimum time // interval that we need to wait between two consecutive // measurements from the sensor. In the case of the DHT22, // this value is of 2 seconds [1]. static const unsigned long MESS_REFRESH_INTERVAL = 10000; // ms getMinimumSamplingPeriod == 2 sec static const unsigned long SCHALT_REFRESH_INTERVAL = 10000; // ms static const unsigned long LCD_REFRESH_INTERVAL = 500; // ms const int uT = 1; //Abschalt-Temperatur in °C const int oT = 6; //Einschalt-Temperatur in °C Truhe truhen[] = { Truhe("Truhe 1", 2, 8, 0), Truhe("Truhe 2", 3, 9, 0), }; void setup_sd() { //Initialsierugn SD lcd.clear(); lcd.setCursor(0, 0); //...(Zeichen,Zeile); lcd.print("Init SD"); if (!SD.begin(4)) { //Init SD_Karte mit CS auf Pin D4 lcd.setCursor(0, 1); lcd.print("fehlgeschlagen!"); Serial.println("Init SD fehlgeschlagen!"); delay(SETUPTIMEOUT); return; } else { lcd.setCursor(0, 1); lcd.print("abgeschlossen!"); Serial.println("Init SD abgeschlossen!"); delay(SETUPTIMEOUT); } } void setup_lcd() { //LCD lcd.begin(16, 2); //Starten des LCD, 16 Zeichen, 2 Zeilen lcd.backlight(); //Beleuchtung des Displays einschalten lcd.blink(); lcd.clear(); lcd.setCursor(0, 0); //...(Zeichen,Zeile); lcd.print("Init LCD"); lcd.setCursor(0, 1); lcd.print("abgeschlossen!"); Serial.println("Init LCD abgeschlossen!"); delay(SETUPTIMEOUT); } void setup() { Serial.begin(9600); Serial.println(); Serial.println(); setup_lcd(); setup_sd(); File logfile = SD.open("logTruhe.txt", FILE_WRITE); //Erstelle bzw. öffne log-Datei logfile.println("t(min)\tTruhe\tT(°C)\tStatus"); logfile.close(); lcd.clear(); wdt_enable(WDTO_5S); // Watchdog auf 1 s stellen Serial.println("Setup fi"); } void loop() { if(millis() - last_mess_time >= MESS_REFRESH_INTERVAL || last_mess_time == 0) { //MESSINTERVALL last_mess_time = millis(); for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) { truhen[i].printName(); truhen[i].mess(); File logfile = SD.open("logTruhe.txt", FILE_WRITE); truhen[i].log(logfile); logfile.close(); } logfile.println(); } //Serial.println("Schaltintervall: "+ String(millis() - last_schalt_time) + " " + String(SCHALT_REFRESH_INTERVAL)); if(millis() - last_schalt_time >= SCHALT_REFRESH_INTERVAL || last_schalt_time == 0) { //SCHALTINTERVALL Serial.println("SCHALTINTERVALL"); last_schalt_time = millis(); for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) { truhen[i].schalt(oT, uT); } } if(millis() - last_lcd_time >= LCD_REFRESH_INTERVAL || last_lcd_time == 0) { //LCD Update INTERVALL last_lcd_time = millis(); for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) { truhen[i].updateLCD(i); } } wdt_reset(); }