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.
199 lines
5.5 KiB
C++
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();
|
|
} |