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.
202 lines
5.8 KiB
C++
202 lines
5.8 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>
|
|
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x3F = Adresse des Displays
|
|
|
|
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 = "";
|
|
public:
|
|
Truhe(String name, int relay, int dhtpin, int dhttype) {
|
|
_name = name;
|
|
_relay = relay;
|
|
_dht.setup(dhtpin);
|
|
pinMode(_relay, OUTPUT);
|
|
};
|
|
|
|
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** *//
|
|
#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
|
|
|
|
Truhe truhen[] = {
|
|
Truhe("Truhe 1", 2, 8, 0),
|
|
Truhe("Truhe 2", 3, 9, 0),
|
|
};
|
|
|
|
|
|
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();
|
|
|
|
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();
|
|
} |