Hallo zusammen,
als Einstieg in die Programmierung habe ich mir vorgenommen das Gewächshaus zu automatisieren. Leider scheitern sich die Praxisversuche an der Temperaturregelung. Die Regelung zeigt nach gewisser Zeit die Aussetze oder startet nicht (also das Relais löst nicht aus/"friert ein").
Kann jemand bitte den Code überprüfen?
Programmcode:
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
//#include "DS3231.h"
#include <SPI.h>
#include <SD.h>
#include <BMP180I2C.h>
#define I2C_ADDRESS 0x77
BMP180I2C bmp180(I2C_ADDRESS);
#include "RTClib.h" //rtc biblio
RTC_DS3231 rtc;
#include <DHT.h> // ext Sensor
#define DHTTYPE DHT22
#define PIN_DHT22 4
DHT dht(PIN_DHT22, DHTTYPE);
float humidity, temp_int;
boolean heating;
boolean cooling;
boolean heatingN;
boolean coolingN;
int RelayW = 8; //Relay wärme
int RelayL = 2; //Relay Licht
const int OnHourL = 10; //zeitschaltuhr Licht Tag/Nacht
const int OnMinL = 12;
const int OffHourL = 18;
const int OffMinL = 12;
const int HourT = 8; //Tag/Nacht Temperatur
const int MinT =10;
const int HourN = 18;
const int MinN = 10;
void setup ()
{
pinMode(RelayW,OUTPUT); //Relay Wärme
pinMode(RelayL,OUTPUT); //Relay Licht
Serial.begin(9600);
dht.begin();
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (!bmp180.begin())
{
Serial.println("begin() failed. check your BMP180 Interface and I2C Address.");
}
//reset sensor to default parameters.
bmp180.resetToDefaults();
//enable ultra high resolution mode for pressure measurements
bmp180.setSamplingMode(BMP180MI::MODE_UHR);
if (!SD.begin(5)) { // Wenn die SD-Karte nicht (!SD.begin) gefunden werden kann, ...
Serial.println("Initialisierung fehlgeschlagen!"); // ... soll eine Fehlermeldung ausgegeben werden. ....
return;
}
Serial.println("Initialisierung abgeschlossen"); // ... Ansonsten soll die Meldung "Initialisierung abgeschlossen." ausgegeben werden.
}
void loop () {
humidity = dht.readHumidity();
temp_int = dht.readTemperature();
DateTime now = rtc.now();
Serial.println();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.println();
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print("Temp_board: ");
Serial.print(rtc.getTemperature());//board_temp
Serial.print(" C");
Serial.println();
Serial.print("Feucht: ");
Serial.print(humidity); //ext Sensor feuchtigkeit
Serial.print("%");
Serial.println();
Serial.print("Temp_intd: ");
Serial.print(temp_int);// ext Sensor temperatur
Serial.print(" C");
Serial.println();
if (!bmp180.measureTemperature()) // Temperatur messen
{
Serial.println("could not start temperature measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true.
do
{
delay(100);
} while (!bmp180.hasValue());
Serial.print("Temp_ext: ");
Serial.print(bmp180.getTemperature());
Serial.println(" C");
Serial.print("Pressure: ");
Serial.print(bmp180.getPressure());
Serial.println(" Pa");
if(now.hour() >= HourT && now.minute() >= MinT) //Temperatur Tagbedingung
{
if ( temp_int <=23) //hysterese heizung
heating = true;
if (temp_int <=23)
cooling = false;
if (temp_int >=25)
heating = false;
if (temp_int >=25)
cooling = true;
if (heating)
{
digitalWrite(RelayW,HIGH);
//digitalWrite(lufter,LOW);
//digitalWrite(redled,LOW);
}
if (cooling)
{
digitalWrite(RelayW,LOW);
//digitalWrite(lufter,HIGH);
//digitalWrite(redled,HIGH);
}
if (!heating && !cooling)
{
digitalWrite(RelayW,LOW);
// digitalWrite(lufter,LOW);
//digitalWrite(redled,LOW);
}
}
else if(now.hour() >= HourN && now.minute() >= MinN) // Temperatur Nachtbedingung
{
if ( temp_int <=19) //hysterese heizung
heatingN = true;
if (temp_int <=19)
coolingN = false;
if (temp_int >=21)
heatingN = false;
if (temp_int >=21)
coolingN = true;
if (heatingN)
{
digitalWrite(RelayW,HIGH);
//digitalWrite(lufter,LOW);
//digitalWrite(redled,LOW);
}
if (coolingN)
{
digitalWrite(RelayW,LOW);
//digitalWrite(lufter,HIGH);
//digitalWrite(redled,HIGH);
}
if (!heatingN && !coolingN)
{
digitalWrite(RelayW,LOW);
//digitalWrite(lufter,LOW);
//digitalWrite(redled,LOW);
}
}
//if(now.hour() >= OnHourL && now.minute() >= OnMinL) //Licht-Relay einschalten
if(now.hour() >= HourT) //Licht-Relay einschalten
{
digitalWrite(RelayL,HIGH);
}
else if(now.hour() >= OffHourL && now.minute() >= OffMinL)
{
digitalWrite(RelayL,LOW);
}
delay(27000);
}
Stellenweise wenn das Licht an oder aus geht (Relais fürs Licht löst aus) fängt es wieder zu regeln
