Nach dem Zeltlager

Funktionierende Steuerung nach dem Zeltlager. Die DHT Lib die verwendet
wurde ist im Commit mit drin

Eine Truhe ist jetzt eine Klasse, welche u.a. den Pin des Sensors und des
Relay nimt. In dem Array können mehrere Truhen angelegt werden.
This commit is contained in:
Simon Zeyer 2020-07-14 23:57:12 +02:00
parent 2632278569
commit fd8bdfb967
2 changed files with 177 additions and 135 deletions

BIN
DHT.zip Normal file

Binary file not shown.

View File

@ -1,10 +1,5 @@
#include <DHT.h> //Setup Sensoren #include <DHT.h> //Setup Sensoren
#include <DHT_U.h> #include <avr/wdt.h>
#define DHTPIN1 8
#define DHTPIN2 9
#define DHTTYPE DHT22
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
#include <SD.h> //Setup SD SDK=D13, MOSI=D11, MISO=D12 #include <SD.h> //Setup SD SDK=D13, MOSI=D11, MISO=D12
@ -12,149 +7,196 @@ DHT dht2(DHTPIN2, DHTTYPE);
#include <LiquidCrystal_I2C.h> #include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x3F = Adresse des Displays LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x3F = Adresse des Displays
const int REL1 = 2; //Pin des Relais static unsigned long last_lcd_time = 0;
const int REL2 = 3; static unsigned long last_mess_time = 0;
int stat1 = 1; //Status-Variable static unsigned long last_schalt_time = 0;
int stat2 = 1;
float T1 = 0; //Temperatur-Variablen class Truhe {
float T2 = 0; 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; void mess() {
String logdata1 = ""; //Serial.println(String(_name) + " mess()");
String logdata2 = ""; //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** *// //* **EINSTELLUNGEN** *//
const int mess = 10; //Messintervall in s !!! muss >2 wegen Sensoren #define DHTTYPE DHT22
const int schalt = 15*60; //Schaltintervall in s #define SETUPTIMEOUT 500
const int uT = 0; //Abschalt-Temperatur in °C // 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 const int oT = 6; //Einschalt-Temperatur in °C
void setup() { Truhe truhen[] = {
//Serial.begin(9600); Truhe("Truhe 1", 2, 8, 0),
//Timer Setup: https://www.instructables.com/id/Arduino-Timer-Interrupts/ Truhe("Truhe 2", 3, 9, 0),
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 void setup_sd() {
lcd.begin(16,2); //Starten des LCD, 16 Zeichen, 2 Zeilen //Initialsierugn SD
lcd.backlight(); //Beleuchtung des Displays einschalten lcd.clear();
delay(1000); lcd.setCursor(0, 0); //...(Zeichen,Zeile);
lcd.print("Init SD");
//Initialsierugn SD if (!SD.begin(4)) { //Init SD_Karte mit CS auf Pin D4
lcd.setCursor(0,0); //...(Zeichen,Zeile); lcd.setCursor(0, 1);
lcd.print("Initialisierung");
delay(2000);
if (!SD.begin(4)) { //Initialisiere SD_Karte mit CS auf Pin D4
lcd.setCursor(0,1);
lcd.print("fehlgeschlagen!"); lcd.print("fehlgeschlagen!");
delay(1000); Serial.println("Init SD fehlgeschlagen!");
delay(SETUPTIMEOUT);
return; 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); void setup_lcd() {
pinMode(REL2, OUTPUT); //LCD
digitalWrite(REL1, HIGH); lcd.begin(16, 2); //Starten des LCD, 16 Zeichen, 2 Zeilen
digitalWrite(REL2, HIGH); lcd.backlight(); //Beleuchtung des Displays einschalten
delay(1000); lcd.blink();
digitalWrite(REL1, LOW); lcd.clear();
digitalWrite(REL2, LOW); 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 File logfile = SD.open("logTruhe.txt", FILE_WRITE); //Erstelle bzw. öffne log-Datei
logfile.println("t(min)\tTruhe\tT(°C)\tStatus"); logfile.println("t(min)\tTruhe\tT(°C)\tStatus");
logfile.close(); logfile.close();
} lcd.clear();
ISR(TIMER1_COMPA_vect){ //timer1 interrupt 1Hz wdt_enable(WDTO_5S); // Watchdog auf 1 s stellen
logsek++; Serial.println("Setup fi");
} }
void loop() { void loop() {
//Messung, LOG und LCD if(millis() - last_mess_time >= MESS_REFRESH_INTERVAL || last_mess_time == 0)
if (logsek%mess == 0){ {
T1 = dht1.readTemperature(); //MESSINTERVALL
logdata1 = String(logsek) + "\t1\t" + String(T1) + "\t" + String(stat1); last_mess_time = millis();
T2 = dht2.readTemperature(); for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) {
logdata2 = String(logsek) + "\t2\t" + String(T2) + "\t" + String(stat2); truhen[i].printName();
File logfile = SD.open("logTruhe.txt", FILE_WRITE); truhen[i].mess();
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 File logfile = SD.open("logTruhe.txt", FILE_WRITE);
if (logsek%schalt == 0){ truhen[i].log(logfile);
//Truhe 1 logfile.close();
if (T1 >= oT){
digitalWrite(REL1, LOW);
stat1 = 1;
}
else {
if (T1 <= uT){
digitalWrite(REL1, HIGH);
stat1 = 0;
} }
} }
//Truhe 2 //Serial.println("Schaltintervall: "+ String(millis() - last_schalt_time) + " " + String(SCHALT_REFRESH_INTERVAL));
if (T2 >= oT){ if(millis() - last_schalt_time >= SCHALT_REFRESH_INTERVAL || last_schalt_time == 0)
digitalWrite(REL2, LOW); {
stat2 = 1; //SCHALTINTERVALL
} Serial.println("SCHALTINTERVALL");
else { last_schalt_time = millis();
if (T2 <= uT){ for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) {
digitalWrite(REL2, HIGH); truhen[i].schalt(oT, uT);
stat2 = 0;
} }
} }
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();
} }