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_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();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user