truhensteuerung/Steuerung_Truhen.ino
Simon Zeyer 456542514a Use DHT library from arduino repo (DHT_sensor_library)
in order to use the DHT_sensor_library the setup of the Truhen is moved
into the setup routine.

The log, updateLCD and printName funtions are removed, logic is handled
in the loop with help of new getter and setter methods.
2020-09-19 11:28:01 +02:00

199 lines
5.5 KiB
C++

#include <DHT.h> //Setup Sensoren
#include <avr/wdt.h>
#include <SD.h> //Setup SD SDK=D13, MOSI=D11, MISO=D12
#include <Wire.h> //Setup LCD
#include <LiquidCrystal_I2C.h>
#include "Truhe.h"
#include "Settings.h"
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 = "";
uint8_t _dhtpin;
public:
Truhe(String name, int relay, uint8_t dhtpin): _dht(dhtpin, DHT22) {
_name = name;
_relay = relay;
_dhtpin = dhtpin;
};
void setup() {
Serial.println("Setup " + _name);
Serial.println(_dhtpin);
pinMode(_relay, OUTPUT);
digitalWrite(_relay, HIGH);
pinMode(_dhtpin, INPUT);
_dht.begin();
delay(2000);
}
void mess() {
Serial.println(String(_name) + " mess()");
//Serial.print("Minimum Sampling Period: ");
//delay(_dht.getMinimumSamplingPeriod());
_cur_temp = _dht.readTemperature();
Serial.println(String(_name) + "\t\t" + String((int)_cur_temp) + " grad gelesen");
};
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));
}
}
int getUpdLcd(){ return _updlcd;};
void setUpdLcd(int updlcd){ _updlcd = updlcd;};
int getRelay(){ return _relay;};
int getDhtPin(){return _dhtpin;};
int getStat(){return _stat;};
float getCurTemp(){return _cur_temp;};
String getName(){return _name;};
};
Truhe truhen[] = {
Truhe("Truhe 1", 2, 8),
Truhe("Truhe 2", 3, 9),
};
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();
for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) {
truhen[i].setup();
}
wdt_enable(WDTO_4S); // Watchdog auf 1 s stellen
delay(3000);
Serial.println("Setup fi");
}
void loop() {
if(millis() - last_mess_time >= MESS_REFRESH_INTERVAL || last_mess_time == 0)
{
//MESSINTERVALL
last_mess_time = millis();
File logfile = SD.open("logTruhe.txt", FILE_WRITE);
for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) {
truhen[i].mess();
//Serial.println(String(_name) + " log()");
String logdata = String(0) + "\t\t" + String(truhen[i].getCurTemp()) + "\t" + String(truhen[i].getStat());
logfile.println(logdata);
}
logfile.println();
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++) {
//LCD-Anzeige
lcd.setCursor(0, i); //...(Zeichen,Zeile);
lcd.print(truhen[i].getName() + " " + String(truhen[i].getUpdLcd()));
lcd.setCursor(8, i);
lcd.print(" ");
//Serial.println(sizeof(String(truhen[i].getCurTemp()))/2);
lcd.setCursor(11 - sizeof(String(truhen[i].getCurTemp()))/2, i);
lcd.setCursor(8, i);
lcd.print(String(truhen[i].getCurTemp()));
lcd.setCursor(11, i);
lcd.print("\337");
lcd.setCursor(13, i);
if (truhen[i].getStat() == -1) {
lcd.print("-");
}
else if (truhen[i].getStat() == 1) {
lcd.print("I");
}
else if (truhen[i].getStat() == 0) {
lcd.print("O");
}
if(truhen[i].getUpdLcd() == 0){
lcd.setCursor(15, i);
lcd.print(String("|"));
//Serial.println(String(truhen[i]._name) + " updateLCD("+String(i)+") .");
truhen[i].setUpdLcd(1);
}else{
lcd.setCursor(15, i);
lcd.print(String("-"));
//Serial.println(String(truhen[i]._name) + " updateLCD("+String(i)+") ");
truhen[i].setUpdLcd(0);
}
}
}
wdt_reset();
}