diff --git a/DHT.zip b/DHT.zip new file mode 100644 index 0000000..064fbff Binary files /dev/null and b/DHT.zip differ diff --git a/Steuerung_Truhen.ino b/Steuerung_Truhen.ino index bae4ece..3153a83 100644 --- a/Steuerung_Truhen.ino +++ b/Steuerung_Truhen.ino @@ -1,10 +1,5 @@ #include //Setup Sensoren -#include -#define DHTPIN1 8 -#define DHTPIN2 9 -#define DHTTYPE DHT22 -DHT dht1(DHTPIN1, DHTTYPE); -DHT dht2(DHTPIN2, DHTTYPE); +#include #include //Setup SD SDK=D13, MOSI=D11, MISO=D12 @@ -12,149 +7,196 @@ DHT dht2(DHTPIN2, DHTTYPE); #include LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x3F = Adresse des Displays -const int REL1 = 2; //Pin des Relais -const int REL2 = 3; -int stat1 = 1; //Status-Variable -int stat2 = 1; +static unsigned long last_lcd_time = 0; +static unsigned long last_mess_time = 0; +static unsigned long last_schalt_time = 0; -float T1 = 0; //Temperatur-Variablen -float T2 = 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); + }; -long logsek = 0; -String logdata1 = ""; -String logdata2 = ""; + 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(0) + "\t\t" + String(_cur_temp) + "\t" + String(_stat); + logfile.println(logdata); + logfile.println(); + } + + 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** *// -const int mess = 10; //Messintervall in s !!! muss >2 wegen Sensoren -const int schalt = 15*60; //Schaltintervall in s -const int uT = 0; //Abschalt-Temperatur in °C +#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 = 60000; // 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 -void setup() { - //Serial.begin(9600); -//Timer Setup: https://www.instructables.com/id/Arduino-Timer-Interrupts/ - cli();//stop interrupts - //set timer1 interrupt at 1Hz - TCCR1A = 0;// set entire TCCR1A register to 0 - TCCR1B = 0;// same for TCCR1B - TCNT1 = 0;//initialize counter value to 0 - // set compare match register for 1hz increments - OCR1A = 15624;// = (16*10^6) / (1*1024) - 1 (must be <65536) - // turn on CTC mode - TCCR1B |= (1 << WGM12); - // Set CS10 and CS12 bits for 1024 prescaler - TCCR1B |= (1 << CS12) | (1 << CS10); - // enable timer compare interrupt - TIMSK1 |= (1 << OCIE1A); - sei();//allow interrupts +Truhe truhen[] = { + Truhe("Truhe 1", 2, 8, 0), + Truhe("Truhe 2", 3, 9, 0), +}; -//Sensoren - dht1.begin(); //Starten der Sensoren - dht2.begin(); - delay(2000); - -//LCD - lcd.begin(16,2); //Starten des LCD, 16 Zeichen, 2 Zeilen - lcd.backlight(); //Beleuchtung des Displays einschalten - delay(1000); - -//Initialsierugn SD - lcd.setCursor(0,0); //...(Zeichen,Zeile); - lcd.print("Initialisierung"); - delay(2000); - if (!SD.begin(4)) { //Initialisiere SD_Karte mit CS auf Pin D4 - lcd.setCursor(0,1); + +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!"); - delay(1000); + Serial.println("Init SD fehlgeschlagen!"); + delay(SETUPTIMEOUT); return; + } else { + lcd.setCursor(0, 1); + lcd.print("abgeschlossen!"); + Serial.println("Init SD abgeschlossen!"); + delay(SETUPTIMEOUT); } - lcd.setCursor(0,1); - lcd.print("abgeschlossen"); - delay(1000); +} - pinMode(REL1, OUTPUT); - pinMode(REL2, OUTPUT); - digitalWrite(REL1, HIGH); - digitalWrite(REL2, HIGH); - delay(1000); - digitalWrite(REL1, LOW); - digitalWrite(REL2, LOW); +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(); -} - -ISR(TIMER1_COMPA_vect){ //timer1 interrupt 1Hz - logsek++; -} + lcd.clear(); -void loop() { -//Messung, LOG und LCD - if (logsek%mess == 0){ - T1 = dht1.readTemperature(); - logdata1 = String(logsek) + "\t1\t" + String(T1) + "\t" + String(stat1); - T2 = dht2.readTemperature(); - logdata2 = String(logsek) + "\t2\t" + String(T2) + "\t" + String(stat2); - File logfile = SD.open("logTruhe.txt", FILE_WRITE); - logfile.println(logdata1); - logfile.println(logdata2); - logfile.println(); - logfile.close(); - //Serial.println("Messung + String(logsek)"); - //LCD-Anzeige - lcd.setCursor(0,0); //...(Zeichen,Zeile); - lcd.print("Truhe1 "); - lcd.setCursor(7,0); - lcd.print(String(T1)); - lcd.setCursor(11,0); - lcd.print("\337C"); - lcd.setCursor(13,0); - if (stat1 == 1){ - lcd.print(" an"); - } - else{ - lcd.print("aus"); - } - lcd.setCursor(0,1); - lcd.print("Truhe2 "); - lcd.setCursor(7,1); - lcd.print(String(T2)); - lcd.setCursor(11,1); - lcd.print("\337C"); - lcd.setCursor(13,1); - if (stat2 == 1){ - lcd.print(" an"); - } - else{ - lcd.print("aus"); - } - delay(999); - } - -//Schaltung - if (logsek%schalt == 0){ - //Truhe 1 - if (T1 >= oT){ - digitalWrite(REL1, LOW); - stat1 = 1; - } - else { - if (T1 <= uT){ - digitalWrite(REL1, HIGH); - stat1 = 0; - } - } - //Truhe 2 - if (T2 >= oT){ - digitalWrite(REL2, LOW); - stat2 = 1; - } - else { - if (T2 <= uT){ - digitalWrite(REL2, HIGH); - stat2 = 0; - } - } - } + 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(); + } + } + //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(); +} \ No newline at end of file