From 26322785690eb2dacf0a1f3f7a8ced83d2f78c90 Mon Sep 17 00:00:00 2001 From: Simon Zeyer Date: Tue, 14 Jul 2020 22:35:44 +0200 Subject: [PATCH] Versuch mit Interrupt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit der Interrupt soll die Sekunden hochzählen, problem ist halt, dass der loop in einer Sekunde mehrmals durchlaufen kann. hätte aber auch ein einfache boolean geregelt. EEEglaaal --- Steuerung_Truhen.ino | 154 +++++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 73 deletions(-) diff --git a/Steuerung_Truhen.ino b/Steuerung_Truhen.ino index a656ae7..bae4ece 100644 --- a/Steuerung_Truhen.ino +++ b/Steuerung_Truhen.ino @@ -14,139 +14,147 @@ LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x3F = Adresse const int REL1 = 2; //Pin des Relais const int REL2 = 3; -int stat1 = 0; //Status-Variable -int stat2 = 0; +int stat1 = 1; //Status-Variable +int stat2 = 1; float T1 = 0; //Temperatur-Variablen float T2 = 0; -unsigned long zeit1 = 0; //Zeitstempel für Relais -unsigned long zeit2 = 0; -int uptime = 0; //Zeitstempel für log in min -int logmin = 0; -int logsek = 0; +long logsek = 0; String logdata1 = ""; String logdata2 = ""; //* **EINSTELLUNGEN** *// -const int mess = 5; //Messintervall in s !!! muss >2 wegen Sensoren -const int truhe = 30; //Schaltintervall in min +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 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 + +//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(2000); + 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); lcd.print("fehlgeschlagen!"); - delay(2000); + delay(1000); return; } lcd.setCursor(0,1); lcd.print("abgeschlossen"); - delay(2000); - + delay(1000); + pinMode(REL1, OUTPUT); pinMode(REL2, OUTPUT); digitalWrite(REL1, HIGH); digitalWrite(REL2, HIGH); + delay(1000); + digitalWrite(REL1, LOW); + digitalWrite(REL2, LOW); 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++; +} + void loop() { -//Messung und log - T1 = dht1.readTemperature(); - logdata1 = String(logmin) + ":" + String(logsek) + "\t1\t" + String(T1) + "\t" + String(stat1); - T2 = dht2.readTemperature(); - logdata2 = String(logmin) + ":" + 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"); +//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 Truhe 1 - if (millis() >= zeit1){ +//Schaltung + if (logsek%schalt == 0){ + //Truhe 1 if (T1 >= oT){ digitalWrite(REL1, LOW); stat1 = 1; - zeit1 = millis()+(truhe*60*1000); } else { if (T1 <= uT){ digitalWrite(REL1, HIGH); stat1 = 0; - zeit1 = millis()+(truhe*60*1000); } } - } - else{ - } -//Schaltung Truhe 2 - if (millis() >= zeit2){ + //Truhe 2 if (T2 >= oT){ digitalWrite(REL2, LOW); stat2 = 1; - zeit2 = millis()+(truhe*60*1000); } else { if (T2 <= uT){ digitalWrite(REL2, HIGH); stat2 = 0; - zeit2 = millis()+(truhe*60*1000); } } } - else{ - } -//Serial.println("Schaltung"); - -//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(mess*1000); -uptime += mess; -logmin = uptime/60; -logsek = uptime%60; -//Serial.println("LCD"); }