Treibhaus Fenster öffnen mit einem Getriebemotor (L298N)

Hallo Zusammen

Ich habe eine Treibhaussteuerung gemacht soweit funktioniert alles
Nun möchte ich anhand der Temp das Fester des Treibhauses öffnen (über einen Seilzug)

Anbei mein Test Code:

const int IN3 = 4;
const int IN4 = 5;

const int ENA = 9;

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);


int tempservoein = 28, tempservoaus = 26; //Dach öffnen


void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();

  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (ENA, OUTPUT);
}

void loop() {

  //delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");




  if ((t) >= tempservoein   )//Fenster öffnen
  {

    analogWrite(ENA, 255);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    delay (5000);

    analogWrite(ENA, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
  }

  if ((t) <=  tempservoaus   )//Fenster schliessen
  {

    analogWrite(ENA, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    delay (5000);

    analogWrite(ENA, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
  }

}

leider dreht der Motor bei jedem Programmdurchlauf erneut. ich möchte nur dass der Motor einmal dreht wenn die Temp überschritten wird und wieder retour dreht wenn die Temp unterschritten wird.
Wie kann ich das machen ?

Besten Dank für Eure Tipps

Gruss MABA

Du solltest Deinen Variablen sprechendere Namen geben. IN3 für OUTPUT ist z.B. verwirrend.
Du mußt dir merken, wenn das Fenster offen ist und nur wenn es nicht offen ist, dann öffnen und umgekehrt nur schließen, wenn es offen ist.

Teile aus dem kopierten Code, die Du nicht brauchst (wie Fahrenheit) solltest Du löschen, das erhöht die Übersichtlichkeit.

Gruß Tommy

Hallo Tommy
Danke für die Tpps

Leider stehe ich genau an diesem Punkt an:

Du mußt dir merken, wenn das Fenster offen ist und nur wenn es nicht offen ist, dann öffnen und umgekehrt nur schließen, wenn es offen ist.

Gruss MABA

Ich empfehle dir: Endschalter

Mir fehlt eine "das Fenster ist offen" oder "das Fenster ist geschlossen" Rückmeldung. Wie hast Du das realisiert? Nur über die Zeit dürfte zu ungenau sein.

Tommy56:
Du solltest Deinen Variablen sprechendere Namen geben. IN3 für OUTPUT ist z.B. verwirrend.

Das sind total sprechende Namen, da sie so auf der Platine stehen. Für uns wäre allerdings eine Erläuterung wie "Eingang H-Brücke" eine Erleichterung für das Verständnis. Und im halben Jahr, wenn die Hardware verbaut und verstaubt ist, hat man einen wertvollen Hinweis.

z.B. eine boolsche Variable isOffen

const int IN3 = 4;
const int IN4 = 5;

const int ENA = 9;

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);


int tempservoein = 28, tempservoaus = 26; //Dach öffnen

boolean isOffen = false;

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();

  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (ENA, OUTPUT);
}

void loop() {

  //delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" *C ");




  if (!isOffen && t >= tempservoein   )//Fenster öffnen
  {
    isOffen = true;

    analogWrite(ENA, 255);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    delay (5000);

    analogWrite(ENA, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
  }

  if (isOffen && t <=  tempservoaus   )//Fenster schliessen
  {
    isOffen = false;
    analogWrite(ENA, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    delay (5000);

    analogWrite(ENA, 255);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
  }

}

Überdenke auch den Rat von combie.

Gruß Tommy

Danke Tommy

Im Test Code funktioniert es !!!!!

Ich versuche Deinen Vorschlag nun auch noch ein den restlichen Code zu integrieren

@agmue Im Moment erfolgt die Steuerung nur über die Zeit

Gruss MABA