Zeit Steuerung für ein Terrarium

Hallo an Alle.
ich bin neu in der Arduino Welt, und Programmiere mir grade für mein Terrarium eine Steuerung
sie ist zwar noch nicht 100% fertig aber das Grundgerüst steht schon mal.

So jetzt zu meiner Frage, ich würde Für die Zeit Steuerung gerne die untere Zeit form Nehmen
um genauer zu schalten leider Bekomme ich das nicht so hin wie ich es Gerne hätte,
Laufen tut es grade mit dem Code 1, der nachteil bei einem Strom Ausfall oder Neustart bleibt das Licht bis zum nähsten morgen aus, Gewollt währe der Code 2 nur leider Schaltet er dann alle 60 min und 60 Sec kurz das Licht aus und wider ein.

Gibt es eine Möglichkeit den Code 2 zu nutzen ohne das er alle 60 min und 60 Sec schaltet ?
ach so Benutz wird für die Zeit ein DS3231

danke schon mal für eure Hilfe.

Code 1
//Zeit Steuerung,

#define ZeitEin (t.hour == 7 && t.min == 00 && t.sec == 00)
#define ZeitAus (t.hour == 18 && t.min == 00 && t.sec == 00)

	
//Licht Tag/Nacht Steuerung:

	if (ZeitEin)
	{
		digitalWrite(relaisPin11, LOW);
	}

	if (ZeitAus)
	{
		digitalWrite(relaisPin11, HIGH);
	}

 

Code 2


//Zeit Steuerung,

#define ZeitEin (t.hour == 7 && t.min == 00 && t.sec == 00)
#define ZeitAus (t.hour == 18 && t.min == 00 && t.sec == 00)
#define Uhr (t.hour && t.min && t.sec)

	
//Licht Tag/Nacht Steuerung:

	if (Uhr >= ZeitEin && Uhr <= ZeitAus)
	{
		digitalWrite(relaisPin11, LOW);
	}

	else
	{
		digitalWrite(relaisPin11, HIGH);
	}

[/ CODE]

Kein Wunder, dass dein Sketch nicht funktioniert.
Da fehlen die Definitionen, das Setup und die Loop.
So kann es nicht funktionieren.
Eine RTC sehe ich im Sketch auch nicht.
Wie sollen wir bei einem unfertigen Sketch helfen ?

der ganze Code sind so aus sry

// Einbetten der Bibliothekn

//#include <config.h>
#include <DS3231.h>
#include <Wire.h>
#include <UTFT_Buttons.h>
#include <URTouch.h>
#include <DHT.h>
#include <UTFT.h>


//Bitmaps Einbette
//extern imagedatatype Lampe[];



// Initialieren des TFT Displays mit den PINS
UTFT    myGLCD(ITDB32S, 38, 39, 40, 41);
URTouch  myTouch(6, 5, 4, 3, 2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);

//Schriftarten:
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t Dingbats1_XL[];

// Initialisieren des Temperatur und Luftfeuchtigkeit Messer
#define DHT1PIN 8       // Hier die Pin Nummer eintragen wo der Sensor angeschlossen ist
#define DHT2PIN 9       // Hier die Pin Nummer eintragen wo der Sensor angeschlossen ist
#define DHTTYPE DHT22     // Hier wird definiert was für ein Sensor ausgelesen wird.
DHT dht1(DHT1PIN, DHTTYPE); // Initialisiere den Temperatur- und Feuchtigkeitssensor
DHT dht2(DHT2PIN, DHTTYPE); // Initialisiere den Temperatur- und Feuchtigkeitssensor

							// Datum und Uhrzeit mit einem DS3231 RTC,
DS3231  rtc(SDA, SCL);      // Initiiere den DS3231 über die Hardware-Schnittstelle
Time t;

//Zeit Steuerung,
#define ZeitEin (t.hour == 11 && t.min == 45 && t.sec == 00)
#define ZeitAus (t.hour == 18 && t.min == 00 && t.sec == 00)
//#define Uhr (t.hour && t.min && t.sec)
//#define ZeitEin (t.hour == 7)
//#define ZeitAus (t.hour == 18)



// Relais Steuerpin´s an Arduino
const int relaisPin10 = 10;        // Hier die Pin Nummer eintragen wo die Relais angeschlossen sind
const int relaisPin11 = 11;        // Hier die Pin Nummer eintragen wo die Relais angeschlossen sind
const int relaisPin12 = 12;        // Hier die Pin Nummer eintragen wo die Relais angeschlossen sind
const int relaisPin13 = 13;        // Hier die Pin Nummer eintragen wo die Relais angeschlossen sind


void setup()
{

	//  TFT
	Serial.begin(9600);
	myGLCD.InitLCD();
	myGLCD.clrScr();
	myGLCD.setFont(BigFont);
	myGLCD.setBackColor(0, 0, 0);



	//Relais Steuerung
	pinMode(relaisPin10, OUTPUT);    // Setzt die Relais Pin´s als Ausgang Lüfftersteuerung
	pinMode(relaisPin11, OUTPUT);    // Setzt die Relais Pin´s als Ausgang Licht Tag/Nacht
	pinMode(relaisPin12, OUTPUT);    // Setzt die Relais Pin´s als Ausgang Elzter
	pinMode(relaisPin13, OUTPUT);    // Setzt die Relais Pin´s als Ausgang Regen

	// TURN OFF
	digitalWrite(relaisPin10, HIGH);
	digitalWrite(relaisPin11, HIGH);
	digitalWrite(relaisPin12, HIGH);
	digitalWrite(relaisPin13, HIGH);

	//Temperatur und Luftfeuchtigkeit Messer
	dht1.begin();
	dht2.begin();

	// Datum und Uhrzeit
	Wire.begin();
	rtc.begin();

}


void loop()
{

	// Datum und Uhrzeit:
	t = rtc.getTime(); //Lesen der aktuelle Uhrzeit und das Datum

	// Temperatur und Lüfftersteuerung:
	int temp1 = (int)dht1.readTemperature();  // Erfassen von Temperatur 1
	int humi1 = (int)dht1.readHumidity();   // Erfassen von Luftfeuchtigkeit 1
	int temp2 = (int)dht2.readTemperature();  // Erfassen von Temperatur 2
	int humi2 = (int)dht2.readHumidity();   // Erfassen von Luftfeuchtigkeit 2

	//TFT Display Ausgabe:

	// Text und Ramen:

	myGLCD.setBackColor(0, 0, 0);
	myGLCD.setColor(255, 255, 255);
	myGLCD.setFont(BigFont);
	myGLCD.print("Terrarium Steuerung", CENTER, 5);
	// Oben 
	myGLCD.setColor(255, 255, 255);
	myGLCD.setColor(255, 0, 0);
	myGLCD.drawLine(0, 60, 319, 60);
	myGLCD.setBackColor(0, 0, 0);
	// Mitte
	myGLCD.setColor(255, 255, 255);
	myGLCD.setColor(255, 0, 0);
	myGLCD.drawLine(0, 120, 319, 120);
	myGLCD.setBackColor(0, 0, 0);
	// Unten
	myGLCD.setColor(255, 255, 255);
	myGLCD.setColor(255, 0, 0);
	myGLCD.drawLine(0, 175, 319, 175);
	myGLCD.setBackColor(0, 0, 0);

	// Datum und Uhrzeit:

	myGLCD.setColor(255, 255, 255);
	myGLCD.drawRoundRect(0, 55, 170, 25);
	myGLCD.setColor(0, 255, 0);
	myGLCD.setFont(BigFont);
	myGLCD.print(rtc.getDateStr(), 5, 33);
	myGLCD.setColor(255, 255, 255);
	myGLCD.drawRoundRect(185, 55, 319, 25);
	myGLCD.setColor(0, 255, 0);
	myGLCD.setFont(BigFont);
	myGLCD.print(rtc.getTimeStr(), 190, 33);

	// Temperatur:

	myGLCD.setColor(255, 255, 255);
	myGLCD.setFont(BigFont);
	myGLCD.print("Temperaturen:", CENTER, 65);
	// Mitte
	myGLCD.setColor(255, 255, 255);
	myGLCD.drawRoundRect(0, 90, 105, 115);
	myGLCD.setColor(0, 255, 0);
	myGLCD.setFont(BigFont);
	myGLCD.printNumF(dht1.readTemperature(), 2, 5, 95);
	myGLCD.print("C", 86, 95);
	// Stein
	myGLCD.setColor(255, 255, 255);
	myGLCD.drawRoundRect(215, 90, 319, 115);
	myGLCD.setColor(0, 255, 0);
	myGLCD.setFont(BigFont);
	myGLCD.printNumF(dht2.readTemperature(), 2, 220, 95);
	myGLCD.print("C", 300, 95);

	// Luftfeuchtigkeit:

	myGLCD.setColor(255, 255, 255);
	myGLCD.setFont(BigFont);
	myGLCD.print("Luftfeuchtigkeit:", CENTER, 125);
	myGLCD.setColor(255, 255, 255);
	myGLCD.drawRoundRect(115, 145, 225, 170);
	myGLCD.setColor(0, 255, 0);
	myGLCD.setFont(BigFont);
	myGLCD.printNumF(dht1.readHumidity(), 2, CENTER, 150);
	myGLCD.print("%", 205, 150);

	//Relais Steuerung Ein und Ausschalt Bedingungen:

	//Lüffter Steuerung:

	if (humi1 >=60)
	{
		digitalWrite(relaisPin10, LOW);
	}

	else 
	{
		digitalWrite(relaisPin10, HIGH);
	}

	//Licht Tag/Nacht Steuerung:

	if (ZeitEin)
	{
		digitalWrite(relaisPin11, LOW);
	}

	if (ZeitAus)
	{
		digitalWrite(relaisPin11, HIGH);
	}

	//Elzter Steuerung:

	if (temp2 <30) 
	{
		digitalWrite(relaisPin12, LOW);
	}

	else 
	{
		digitalWrite(relaisPin12, HIGH);
	}

	//Regen Steuerung:

	if (humi1 <50) 
	{
		digitalWrite(relaisPin13, LOW);
	}

	else {
		digitalWrite(relaisPin13, HIGH);
	}

}

Hi

Wenn Du das Licht NUR schaltest, wenn Es geschaltet werden MUSS, kannst Du auf das Zeitfenster abfragen.
(wobei wohl die Abfrage, ob das Licht gerade AN ist, mehr Zeit braucht, als das Licht sturr AN zu schalten, wenn's AN sein soll).

Du suchst nach einer Lösung, die 'letzte Schaltzeit' auszuwerten, damit Deine Beleuchtung genau Das tut, was die Uhr 'gesagt hätte, wenn der Strom angeblieben wäre'.

Wie würdest Du Das angehen?
-> Das ist Dein Lösungsweg.

MfG

ok Danke,

ich würde sagen du meinst es in etwa So oder ?

//Zeit Steuerung,
#define ZeitEin (t.hour == 7 && t.min == 00 && t.sec == 00)
#define ZeitAus (t.hour == 20 && t.min == 00 && t.sec == 00)
#define Uhr (t.hour && t.min && t.sec)



//Licht Tag/Nacht Steuerung:

	if (Uhr >= ZeitEin && (relaisPin11, HIGH) && Uhr >= ZeitAus )
	{
		digitalWrite(relaisPin11, LOW);
	}

	else
	{
		digitalWrite(relaisPin11, HIGH);
	}

Deine #define als Bedingungskonstrukte sind etwas merkwürdig.
z.B.

#define Uhr (t.hour && t.min && t.sec)

das ist (0 = false), sobald einer der Werte 0 ist. Das ist mit Sicherheit nicht das was Du willst.

Gruß Tommy

Ne eigentlich nicht, nur weiß ich grade nicht Genau wie ich die Uhr auslesen soll wie zum beispiel

hier

int humi1 = (int)dht1.readHumidity(); 



 //Lüffter Steuerung:

 if (humi1 >=60)
 {
 digitalWrite(relaisPin10, LOW);
 }

 else 
 {
 digitalWrite(relaisPin10, HIGH);
 }

Was hat Luftfeuchte mit der Uhr zu tun?

Gruß Tommy

Garnichts, es wahr nur ein Beispiel wie ich mir die werte hole für die Lüfter die bei einen Wert ab 60% angesteuert werden.

und sowas suche ich halt für die Uhrzeit da mit ich z.B. ZeitEin und ZeitAus mit der Aktuellen uhrzeit vergleichen kann.

wenn ich es So mache, geht es ja auch ist mir nur leider nicht Genau genug ::slight_smile:

#define ZeitEin (t.hour == 7)
#define ZeitAus (t.hour == 20)

	if (t.hour >= ZeitEin && ZeitAus >= t.hour  )
	{
		digitalWrite(relaisPin11, LOW);
	}

	else
	{
		digitalWrite(relaisPin11, HIGH);
	}

Lass die Defines weg und schreibe ordentliche Bedingungen.

Noch besserer Weg: Rechne die Zeit in Minuten des Tages um und nimm diese Zahl als Vergleich.

Gruß Tommy

Tommy56:
Noch besserer Weg: Rechne die Zeit in Minuten des Tages um und nimm diese Zahl als Vergleich.

das List sich gut, nur weiß ich leider nicht wie ich so was genau machen könnte.

Na dann gehen wir doch mal gedanklich in die Grundschulzeit zurück.

Wieviele Minuten nach Mitternacht ist 7 Uhr?

Wieviele Minuten hat eine Stunde? --> 60 für den, der es nicht (mehr) drauf hat

Also 7 * 60 = 420.

Aktuelle Uhrzeit in Minuten = Stunden * 60 + Minuten

War das jetzt so schwer oder tut selbst denken weh?

Gruß Tommy

Danke für den unterricht aber an der Mathematik wird es nicht hapern :wink: ,

mir geht es um den Code dafür, er müsste ja wiesen was ich z.B. Mit 420 oder 1200 meine

Wenn das für Dich ein Problem ist, solltest Du Dein Thema zurückstellen, da es für Dich zu kompliziert ist.
Anstelle dessen solltest Du anfangen die Grundlagen zu lernen. Danach kannst Du solche Vergleiche problemlos umsetzen.

Gruß Tommy

Hi

zielzeit_minuten=1860+43; //18:43h ... irgendwo, wo die Zeit festgelegt wird
aktzeit_minuten=Stunden
60+Minuten // dort, wo die aktuelle Zeit ausgelesen wird

Die IF-Abfrage überlasse ich wieder Dir ...

MfG

Danke ich werde es Ausprobieren.