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:
parent
2632278569
commit
fd8bdfb967
@ -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);
|
|
||||||
|
|
||||||
|
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
|
||||||
lcd.begin(16, 2); //Starten des LCD, 16 Zeichen, 2 Zeilen
|
lcd.begin(16, 2); //Starten des LCD, 16 Zeichen, 2 Zeilen
|
||||||
lcd.backlight(); //Beleuchtung des Displays einschalten
|
lcd.backlight(); //Beleuchtung des Displays einschalten
|
||||||
delay(1000);
|
lcd.blink();
|
||||||
|
lcd.clear();
|
||||||
//Initialsierugn SD
|
|
||||||
lcd.setCursor(0, 0); //...(Zeichen,Zeile);
|
lcd.setCursor(0, 0); //...(Zeichen,Zeile);
|
||||||
lcd.print("Initialisierung");
|
lcd.print("Init LCD");
|
||||||
delay(2000);
|
|
||||||
if (!SD.begin(4)) { //Initialisiere SD_Karte mit CS auf Pin D4
|
|
||||||
lcd.setCursor(0, 1);
|
lcd.setCursor(0, 1);
|
||||||
lcd.print("fehlgeschlagen!");
|
lcd.print("abgeschlossen!");
|
||||||
delay(1000);
|
Serial.println("Init LCD abgeschlossen!");
|
||||||
return;
|
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() {
|
||||||
|
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();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user