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_U.h>
#define DHTPIN1 8
#define DHTPIN2 9
#define DHTTYPE DHT22
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
#include <avr/wdt.h>
#include <SD.h> //Setup SD SDK=D13, MOSI=D11, MISO=D12
@ -12,149 +7,196 @@ DHT dht2(DHTPIN2, DHTTYPE);
#include <LiquidCrystal_I2C.h>
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();
}