Danke für die vielen super Ratschläge.
Zunächst verstehe ich nicht was an
if ((timer + LCDzeit * 1000) < millis()) {
timer = millis(); />
verkehrt ist, da die Funktion das tut was sie soll..?
tatsächlich finde ich die steaming.h lib nicht
also ich finde sie nur in githup als Teil der glcd Libary die ich jedoch, obwohl ich mich angemelded habe nicht downloaden kann. Reicht die Freeversion dafür nicht?
Hier nochmal der Komplette Code:
#include <dht.h>
#include <Bounce2.h>
#include <RTClib.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <MQ135.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//=============================================================================
#define DHT1_PIN 7
#define DHT2_PIN 8
#define DHT3_PIN 9
#define MQ135_PIN A1
#define RelaisTemp_PIN 6
#define RelaisHumidity_PIN 5
#define RelaisLuft_PIN 3
#define RelaisMagnetventil_PIN 4
#define startTemp 20
#define DHT_min_Temp 20
#define DHT_max_Temp 35
#define startHumidity 70
#define DHT_min_Humidity 70
#define DHT_max_Humidity 95
#define startMaxTemp 25
#define maxMaxTemp 35
#define knopfHumidity 2
#define knopfTemp 18
#define knopfFan 17
#define pinup 16
//=============================================================================
dht DHT1;
dht DHT2;
dht DHT3;
int soll_Temp, soll_Humidity, max_Temp, GasLevel = 0, messwertBoden = 0, count = 1;
unsigned long Luft_Zeit, timer, altzeit, LCDzeit = 10, sdzeit = 5, relaisZeit = 30;
const int chipSelect = 10, RelaisLuftStatus = LOW, BodenfeuchteLevelLow = 832, BodenfeuchteLevelHigh = 382, GasLevelLow = 50, GasLevelHigh = 500;
String timestring, mvalue1, mvalue2, mvalue3, mvalue4, mvalue5, mvalue6, mvalue7, mvalue8, mvalue9, mvalue10;
int prozentG = map(GasLevel, GasLevelHigh, GasLevelLow, 100, 0);
int prozentB = map(messwertBoden, BodenfeuchteLevelHigh, BodenfeuchteLevelLow, 100, 0);
Bounce bHumidity = Bounce();
Bounce bTemp = Bounce();
Bounce bFan = Bounce();
Bounce b = Bounce();
RTC_DS1307 rtc;
MQ135 mq135_sensor(MQ135_PIN);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
Serial.println(F("Initializing SD card..."));
if (!SD.begin(chipSelect)) {
Serial.println(F("SD Card error"));
return;
}
Serial.println(F("card initialized"));
if (! rtc.begin()) {
Serial.println(F("No RTC found"));
} else {
Serial.println(F("RTC clock found"));
}
if (! rtc.isrunning()) {
Serial.println(F("RTC is not configured"));
}
bHumidity.attach(knopfHumidity, INPUT_PULLUP);
bHumidity.interval(5);
bTemp.attach(knopfTemp, INPUT_PULLUP);
bTemp.interval(5);
bFan.attach(knopfFan, INPUT_PULLUP);
bFan.interval(5);
b.attach(pinup, INPUT_PULLUP);
b.interval(5);
pinMode(RelaisTemp_PIN, OUTPUT);
digitalWrite(RelaisTemp_PIN, HIGH);
pinMode(RelaisHumidity_PIN, OUTPUT);
digitalWrite(RelaisHumidity_PIN, HIGH);
pinMode(RelaisLuft_PIN, OUTPUT);
digitalWrite(RelaisLuft_PIN, HIGH);
pinMode(RelaisMagnetventil_PIN, OUTPUT);
digitalWrite(RelaisMagnetventil_PIN, HIGH);
}
void loop() {
DHT1.read22(DHT1_PIN);
DHT2.read22(DHT2_PIN);
DHT3.read22(DHT3_PIN);
if (soll_Humidity == 0) {
soll_Humidity = startHumidity;
}
if (soll_Temp == 0) {
soll_Temp = startTemp;
}
bHumidity.update();
if (bHumidity.fell()) {
soll_Humidity = soll_Humidity + 5;
}
if (soll_Humidity > DHT_max_Humidity) {
soll_Humidity = DHT_min_Humidity;
}
bTemp.update();
if (bTemp.fell()) {
soll_Temp = soll_Temp + 1;
}
if (soll_Temp > DHT_max_Temp) {
soll_Temp = DHT_min_Temp;
}
if (millis() - Luft_Zeit > 900000 ) {
digitalWrite(RelaisLuft_PIN , LOW);
Luft_Zeit = millis();
}
else {
if (millis() - Luft_Zeit > 60000 ) {
digitalWrite(RelaisLuft_PIN, HIGH);
}
}
if ((timer + relaisZeit * 1000) < millis()) {
timer = millis();
if ((DHT1.temperature) > soll_Temp) {
digitalWrite(RelaisTemp_PIN, HIGH);
}
else {
digitalWrite(RelaisTemp_PIN, LOW);
}
if ((DHT1.humidity) > soll_Humidity) {
digitalWrite(RelaisHumidity_PIN, HIGH);
}
else {
digitalWrite(RelaisHumidity_PIN, LOW);
}
if ((DHT1.humidity) > soll_Humidity) {
digitalWrite(RelaisMagnetventil_PIN, HIGH);
}
else {
digitalWrite(RelaisMagnetventil_PIN, LOW);
}
}
b.update();
if (b.fell()) {
count++;
if (count > 2) count = 1;
altzeit = 0;
}
if ((timer + LCDzeit * 1000) < millis()) {
timer = millis();
switch (count) {
case 1:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Temperatur:"));
lcd.print(DHT1.temperature);
lcd.print(F("\337C "));
lcd.setCursor(1, 0);
lcd.print(F("Soll:"));
lcd.print(soll_Temp);
lcd.print(F("\337C "));
lcd.setCursor(0, 1);
lcd.print(F("Luftfeuchte:"));
lcd.print(DHT1.humidity);
lcd.print(F("\%"));
lcd.setCursor(1, 1);
lcd.print(F("Soll:"));
lcd.print(soll_Humidity);
lcd.print(F("\%"));
lcd.setCursor(0, 2);
lcd.print(F("Substratfeuchte:"));
messwertBoden = analogRead(A0);
lcd.print(prozentB);
lcd.print(F("\%"));
lcd.setCursor(0, 3);
lcd.print(F("CO2-Level:"));
GasLevel = analogRead(A2);
lcd.print(prozentG);
lcd.print(F("\%"));
break;
case 2:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Temperatur:"));
lcd.print(DHT2.temperature);
lcd.print(F("\337C "));
lcd.setCursor(1, 0);
lcd.print(F("Soll:"));
lcd.print(soll_Temp);
lcd.print(F("\337C "));
lcd.setCursor(0, 1);
lcd.print(F("Luftfeuchte:"));
lcd.print(DHT2.humidity);
lcd.print(F("\%"));
lcd.setCursor(1, 1);
lcd.print(F("Soll:"));
lcd.print(soll_Humidity);
lcd.print(F("\%"));
lcd.setCursor(0,2);
lcd.print(F("Draußen:"));
lcd.print(DHT3.temperature);
lcd.print(F("\337C "));
lcd.print(DHT3.humidity);
lcd.print(F("\%"));
lcd.setCursor(0,3);
lcd.print(F("MaxTemp:"));
lcd.print(max_Temp);
}
}
if ((timer + sdzeit * 1000) < millis()) {
timer = millis();
get_logvalue();
get_time();
write_data();
}
}
void get_logvalue() {
mvalue1 = (DHT1.temperature);
mvalue2 = (DHT1.humidity);
mvalue3 = (DHT2.temperature);
mvalue4 = (DHT2.humidity);
mvalue5 = (prozentB);
mvalue6 = (prozentG);
mvalue7 = (DHT3.temperature);
mvalue8 = (DHT3.humidity);
mvalue9 = soll_Temp;
mvalue10 = soll_Humidity;
}
void get_time() { //Read Time from RTC
DateTime now = rtc.now();
timestring = now.day();
timestring += "-";
timestring += now.month();
timestring += "-";
timestring += now.year();
timestring += " ";
timestring += now.hour();
timestring += ":";
timestring += now.minute();
timestring += ":";
timestring += now.second();
Serial.println(timestring);
}
void write_data() { //Write to SD card
String dataString = "SollTemp:" + mvalue9 + " SollHumidity: " + mvalue10 + " " + "Klima links: " + mvalue1 + " " + mvalue2 + " " + "Klima rechts: " + mvalue3 + " " + mvalue4 + " " + "KlimaAußen: " + mvalue7 + " " + mvalue8 + " " + "Bodenfeuchte: " + mvalue5 + " " + "CO2-Level: " + mvalue6;
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(timestring);
dataFile.println(dataString);
dataFile.close();
Serial.println(timestring);
Serial.println(dataString);
}
else {
Serial.println(F("error writing datalog.txt"));
}
}