Regelung der Temperatur

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

![image|690x93](upload://kblbzpSkc63DlQzhSL8eZSuwKtu.png)

Dann zeige doch bitte dein Schaltbild, wie du alles verdrahtet hast.
Deine Fehlerbeschreibung liest sich wie ein Hardwarefehler.
Poste bitte Links deiner verwendeten Teile: Arduino, Relais, Sensor usw.

Hallo
Schmeiße hier mal das return raus.


if (!bmp180.measureTemperature())  // Temperatur messen
  {
    Serial.println("could not start temperature measurement, is a measurement already running?");
    return;
  }

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

27 Sekunden in den Microcontroller nichts machen darf?
Edit: Ich finde den Code schwer leserlich. Man erkennt die geöffneten Blöcke nicht. Drücke mal STRG+T in der Arduino IDE. Dann rückt die automatische Formatierung die Blöcke geordnet ein.

Hallo zusammen,
Stichpunkt 'Hardwarefehler'. Ich lasse erstmal die Relais über eine externe Stromversorgung laufen. Mal schauen, ob es was bringt ich melde mich.

Und wie sollen wir helfen, wenn du uns die nötigen Infos nicht lieferst, oder sind die geheim ?

Kein Geheimnis :slight_smile: Ich habe die Verdrahtung skizziert. Die Relais werden jetzt über eine externe Stromquelle (Netzteil) versorgt.

"Keine Änderung für automatische Formatierung nötig" wird angezeigt wenn ich die Tastenkombination benutze (STRG+T)

delay (27000); --> kann schon was machen, habe die Zahl frei gewählt, ist es schlimm..???

Schaltverhalten:

Ist GND der externen Quelle des Relais mit GND des Arduino verbunden?

Wenn Du da ne SD-Karte dran hast, dann schreib doch mit, was Du machst!

Hallo,
wenn da ein Problem auf dem Bus besteht hängt er in der schleife fest.
Heinz

Wolltest Du nicht Couch? :wink:

Das ist schon vorher krude:

Da kommt er nicht mal bis zum do....

Hallo
@my_xy_projekt stimmt , ich ja hatte jetzt erst mal grob nach den üblichen Kandidaten
While, do oder sonstigen unsinnigen Schleifen gesucht
Heinz

Hallo,
Das Relais ist wieder eingefroren, die externe Stromversorgung hat keine Abhilfe gebracht.
Schaltverhalten für heute:

Ist GND der externen Quelle des Relais mit GND des Arduino verbunden? --> nein, habe ich nicht, galvanische Trennung.
Bild_2022-02-18_103713

Ich habe jetzt den Sensor BMP180 auskommentiert. Die Steuerung läuft über DHT22

und hier ist die Gesamtcode, in der Form habe ich jetzt hochgeladen um wieder zu testen (ohne BMP180):

#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;

File Textdatei1;

boolean heating;
boolean cooling;
boolean heatingN;
boolean coolingN;

int RelayW = 8; //Relay wärme
int RelayL = 2; //Relay Licht

const int OnHourL = 18; //zeitschaltuhr Licht
const int OnMinL = 12;
const int OffHourL = 10;
const int OffMinL = 12;

const int HourT = 18; //Tag/Nacht für Heizen
const int MinT = 10;
const int HourN = 10;
const int MinN = 10;

const int timemin1 = 15;
const int timemin2 = 45;
const int timemin3 = 30;
const int timemin4 = 59;

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?");
  // }

  //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.minute() == timemin1 || now.minute() == timemin2 || now.minute() == timemin3 || now.minute() == timemin4)
  {
    Textdatei1 = SD.open ("test1.csv", FILE_WRITE);
    Textdatei1.print(now.year(), DEC);
    Textdatei1.print('/');
    Textdatei1.print(now.month(), DEC);
    Textdatei1.print('/');
    Textdatei1.print(now.day(), DEC);
    Textdatei1.print(';');
    Textdatei1.print(now.hour(), DEC);
    Textdatei1.print(':');
    Textdatei1.print(now.minute(), DEC);
    Textdatei1.print(':');
    Textdatei1.print(now.second(), DEC);
    Textdatei1.print(';');

    Textdatei1.print(rtc.getTemperature());
    Textdatei1.print(';');

    //Textdatei1.print(bmp180.getTemperature());
    //Textdatei1.print(';');

    Textdatei1.print(humidity);//ext Sensor
    Textdatei1.print(';');
    Textdatei1.print(temp_int);//ext Sensor
    Textdatei1.println();
    Textdatei1.close();
  }

  //if(now.hour() >= HourT && now.minute() >= MinT) //Temperatur Tagbedingung
  if (now.hour() >= HourT) //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
  else if (now.hour() >= HourN) // 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)
  else if (now.hour() >= HourN)
  {
    digitalWrite(RelayL, LOW);
  }

  delay(5000);
}

Bei dem BMP fehlt Level Shifter 3.3V auf 5V am SCL, SDA deshalb friert der BUS ein :wink:

nur kurz: du hast doch optokoppler drauf auf der karte . Aber das mit Relais zu machen ist mist . das geht für das fenster oben . Aber bei mir hat es die Relais immer verklebt durch die heizung im winter :frowning: mosfet als schalter ist hier besser . so als tipp nebenbei .

Wir wissen nicht mit welscher Spannung er heizt das kommt noch dazu.

eben . aber selbst die wasserpumpe hat bissel was . das geht ... nur wie lange . eine Brunnenpumpe oder hauswasserwerk watt ... die verklebt es und da ist das als tipp besser . Zumal es das fertig zu kaufen gibt " mosfet schalter 220volt" ist nur guter rat von mir

Hallo zusammen,
Bei dem BMP fehlt Level Shifter 3.3V auf 5V am SCL, SDA deshalb friert der BUS ein -->muss ich recherchieren was es ist.
Mir ist bekannt, dass es mit MOSFET besser und sauberer funktioniert. Muss ich mir erstmal zulegen.

Zur Zeit besteht mein "Gewächshaus" aus einem Eimer und 30 Watt (220V)Glühbirne.
Schaltverhalten für heute:

Wenn man sich die letzten zwei Diagramme anschaut, es wird der Übergang 23:59 zu 00:00 nicht verkraftet. Nur Zufall?
Ich habe jetzt den BMP-Sensor auch physisch abgeklemmt und nutze das andere Relais auf dem Board.
PS: Heute früh hat Arduino keine Reaktion auf die Reset-Taste gezeigt (also Neustart wurde durchgeführt aber nicht geregelt auch nach dem ich kurzzeitig den Strom abgezogen habe) Nach dem ich Einkaufen war und mir die Sache noch einmal vorgenommen habe (ca. 1 Stunde war das Board stromlos) ist wieder alles in Ordnung. Ich lasse es wieder laufen.....

Speicher oder Register auf dem Arduino der sich vollläuft?

Erkläre mal, wie das gehen soll.

Gruß Tommy