Hilfe Hühnerklappe - Code mag nicht wie ich will

Hi zusammen,

tendenziell bin ich eigentlich stiller Mitleser und versuche eigentlich immer selbst auf den richtigen Weg zu kommen. Ich hab mittlerweile auch schon die KI über meinen Code laufen lassen, hab auch ein paar Sachen verbessern und auch verstehen können.

Es ist mein erstes Projekt mit einen Arduino. Technisch bin ich denk ich schon gut dabei, elektrisch auch noch, Programmierung eher nicht soooo gut, habe aber Grundkenntnisse.

Zu meinen Projekt:

  • Hühnerklappe für die Hühner meiner Frau
  • Klappe soll manuell und über die Cloud bedienbar sein
  • Auf dem verbauten Display soll der Status und die Temps. sichtbar sein
  • 2 LEDs für offen und geschlossen sollen leuchten

Bauteile:

  • Arduino Uno R4 WiFi
  • Temp. Sensor DS18B20
  • Reed Schalter (im Moment simuliere ich die noch)
  • L298N Motortreiber
  • Motor 12V Gleichstrom
  • 2x Taster
  • 0,96 Zoll SSD1306 Display
  • StepDown LM2596

Problem:
Motor wird bei Betätigung der Schalter nicht angesteuert und der Status der Klappe bleibt auf "offen" auf den Display stehen.
Vorher hatte ich noch das Problem, dass die grüne LED (Klappe geschlossen) nicht ausgehen wollte, das hab ich mit einer seperaten Abfrage lösen können.
Ich bin mir auch durchaus bewusst, das der Code keinen Oscar gewinnt, aber ich hab mir echt Mühe gegeben... :slight_smile:

Hoffe ihr könnt mir helfen.
Vielen Dank schon mal im voraus.

#include <WiFiS3.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>
#include "thingProperties.h"
#include "Arduino_LED_Matrix.h"

// Pin-Definitionen
#define MOTOR_IN1 2              
#define MOTOR_IN2 3              
#define MOTOR_IN3 4              
#define MOTOR_IN4 5              
#define TEMP_SENSOR1 10          
#define TEMP_SENSOR2 11          
#define BUTTON1 9                
#define BUTTON2 8                
#define REED_SWITCH_OPEN 6       
#define REED_SWITCH_CLOSED 7     
#define LED_RED A0               
#define LED_GREEN A1             

// OLED Display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Temperatursensoren
OneWire oneWire1(TEMP_SENSOR1);         
OneWire oneWire2(TEMP_SENSOR2);         
DallasTemperature sensors1(&oneWire1);  
DallasTemperature sensors2(&oneWire2);  

// Zeitsteuerung
WiFiUDP ntpUDP;                       
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600);  

// LED-Matrix
ArduinoLEDMatrix matrix;               
const uint32_t heart[] = {              
  0x3184a444,
  0x44042081,
  0x100a0040
};

// Globale Variablen
unsigned long lastDisplayUpdate = 0;   
unsigned long lastWiFiCheck = 0;       
const unsigned long wifiCheckInterval = 60000;  
const unsigned long displayUpdateInterval = 1000;
int lastButtonState1 = HIGH;
int lastButtonState2 = HIGH;

// Türstatus
bool isDoorOpened = false;              
bool isDoorClosed = false; 
bool statusUnknown = true; // Flag für unbekannten Status

// Verzögerung Reed-Schalter nach Tastendruck
unsigned long buttonPressTime = 0;
bool ignoreReedSwitches = false;
const unsigned long ignoreDuration = 2000; // 2 Sekunden

// Funktionsprototypen
void connectToWiFi();                   
void updateDisplay();                   
void handleButtonPresses();             
void openDoor();                        
void closeDoor();                       
void blinkLED(int ledPin, int count, int interval); 
void updateNTP();                       // Neue Funktion zum NTP-Update
void stopMotor();                       // Funktion zum Stoppen des Motors

void setup() {
  Serial.begin(115200);                 

  // Initialisierung OLED Display
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed")); 
    for (;;);
  }
  display.display();                    
  delay(2000);                          
  display.clearDisplay(); 

  // Startwert - Motorpins auf LOW
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
  digitalWrite(MOTOR_IN3, LOW);
  digitalWrite(MOTOR_IN4, LOW);

  // Initialisiere Temperatursensoren
  sensors1.begin();                     
  sensors2.begin();                     

  // Initialisiere Motor- und Sensor-Pins
  pinMode(MOTOR_IN1, OUTPUT);          
  pinMode(MOTOR_IN2, OUTPUT);          
  pinMode(MOTOR_IN3, OUTPUT);          
  pinMode(MOTOR_IN4, OUTPUT);          
  pinMode(BUTTON1, INPUT_PULLUP);     
  pinMode(BUTTON2, INPUT_PULLUP);     
  pinMode(REED_SWITCH_OPEN, INPUT_PULLUP); 
  pinMode(REED_SWITCH_CLOSED, INPUT_PULLUP); 
  pinMode(LED_RED, OUTPUT);            
  pinMode(LED_GREEN, OUTPUT);          

  // Verbindung mit WLAN
  connectToWiFi();

  // Initialisiere Zeitsteuerung
  timeClient.begin();                  
  timeClient.update();    

  // Initialzustand der LEDs
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_GREEN, LOW);

  // Initialisiere Arduino Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection); 
  setDebugMessageLevel(2);             
  ArduinoCloud.printDebugInfo();       

  // Initialisiere LED-Matrix
  matrix.begin();                      

    // Cloud-Callback-Funktionen
  initProperties(); // Moved initialization to a separate function
}

void loop() {
  if (millis() - lastWiFiCheck > wifiCheckInterval) {
    lastWiFiCheck = millis();
    if (WiFi.status() != WL_CONNECTED) {
      connectToWiFi(); 
    }
  }

  ArduinoCloud.update();                
  updateNTP(); // Update NTP in each loop

  // Aktuelle Temperaturwerte lesen
  sensors1.requestTemperatures();      
  sensors2.requestTemperatures();      
  outsideTemperature = sensors1.getTempCByIndex(0); 
  insideTemperature = sensors2.getTempCByIndex(0);  

  // Können die Reed-Schalter ignoriert werden?
   if (ignoreReedSwitches && millis() - buttonPressTime > ignoreDuration) {
    ignoreReedSwitches = false;  // Ignorieren beenden
  }

  if (!ignoreReedSwitches) {
    // Status der Reed-Schalter
    bool reedOpen = digitalRead(REED_SWITCH_OPEN) == LOW;
    bool reedClosed = digitalRead(REED_SWITCH_CLOSED) == LOW;

    // Debug-Ausgaben
    Serial.print("Reed Open: ");
    Serial.print(reedOpen);
    Serial.print(" | Reed Closed: ");
    Serial.println(reedClosed);

    // Türstatus aktualisieren
    if (reedClosed) {
        stopMotor();
        if (!isDoorClosed) {
            isDoorClosed = true;
            isDoorOpened = false;
            statusUnknown = false;
            CloudSwitch_doorStatus = false;
            Serial.println("Tür ist jetzt geschlossen.");
        }
    } else if (reedOpen) {
        stopMotor();
        if (!isDoorOpened) {
            isDoorOpened = true;
            isDoorClosed = false;
            statusUnknown = false;
            CloudSwitch_doorStatus = true;
            Serial.println("Tür ist jetzt geöffnet.");
        }
    } else {
        // Logik für unbekannten Status
        if (!statusUnknown) {
            statusUnknown = true; // Status unbekannt
            isDoorOpened = false;
            isDoorClosed = false;
            CloudSwitch_doorStatus = false;  // Cloud nicht mit falschem Status aktualisieren
            Serial.println("Türstatus ist unbekannt.");
        }
    }
}

  // Automatische Klappenöffnung zur eingestellten Zeit
  if (timeClient.getEpochTime() >= cloudTime_open && !isDoorOpened) {
    openDoor(); 
  }

  // Automatisches Klappenschließen zur eingestellten Zeit
  if (timeClient.getEpochTime() >= cloudTime_close && !isDoorClosed) {
    closeDoor(); 
  }

  handleButtonPresses(); 

  updateLEDs();

   // Display-Update
  if (millis() - lastDisplayUpdate > displayUpdateInterval) {
    updateDisplay();        
    lastDisplayUpdate = millis(); 
  }

  // Herz-Frame auf die LED-Matrix
  matrix.loadFrame(heart); 
  delay(500);
}

void connectToWiFi() {
  unsigned long startAttemptTime = millis(); 
  int attemptCount = 0;                       
  while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000 && attemptCount < 5) {
    WiFi.begin(SSID, PASS);                  
    delay(1000);                             
    Serial.println("Verbindung mit WLAN..."); 
    attemptCount++;                          
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("WLAN verbunden");     
  } else {
    Serial.println("WLAN Verbindung fehlgeschlagen"); 
    blinkLED(LED_RED, 10, 500);               
  }
}

void handleButtonPresses() {
  if (digitalRead(BUTTON1) == LOW) {
    if (!isDoorClosed) {
      closeDoor();
      buttonPressTime = millis();
      ignoreReedSwitches = true;
    }
  }

  if (digitalRead(BUTTON2) == LOW) {
    if (!isDoorOpened) {
      openDoor();
      buttonPressTime = millis();
      ignoreReedSwitches = true;
    }
  }
}

void updateLEDs() {
    if (isDoorOpened) {
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, HIGH);
    } else if (isDoorClosed) {
        digitalWrite(LED_RED, LOW);
        digitalWrite(LED_GREEN, HIGH);
    } else {
        digitalWrite(LED_RED, LOW);
        digitalWrite(LED_GREEN, LOW); // LEDs aus
    }
}


// Display-Aktualisierung
void updateDisplay() {
  display.clearDisplay();                     
  display.setTextSize(1);                     
  display.setTextColor(SSD1306_WHITE);       
  display.setCursor(0, 0);                    
  display.print("Aussen: ");            
  display.print(outsideTemperature);          
  display.print(" C");                        
  display.setCursor(0, 10);                   
  display.print("Stall: ");             
  display.print(insideTemperature);           
  display.print(" C");                        
  display.setCursor(0, 20);                   
  if (statusUnknown) {
    display.print("Klappe: Unbekannt"); 
  } else {
    display.print(isDoorClosed ? "Klappe: Geschlossen" : "Klappe: Offen");
  }
  display.setCursor(0, 30);                   
  display.print(WiFi.status() == WL_CONNECTED ? "WiFi: Passt" : "WiFi: Passt net"); 
  display.display();                           
}


// Callback-Funktion für Cloud-Türstatus
void onDoorStatusChange() {
  if (CloudSwitch_doorStatus) {
    openDoor(); 
  } else {
    closeDoor(); 
  }
}

// Callback-Funktionen für Zeitänderungen
void onCloudTimeOpenChange() {
  Serial.print("Öffnungszeit wurde geändert: ");
  Serial.println(cloudTime_open);
}

void onCloudTimeCloseChange() {
  Serial.print("Schließzeit wurde geändert: ");
  Serial.println(cloudTime_close);
}

// Klappe öffnen
void openDoor() {
  if (!isDoorOpened) {
    digitalWrite(MOTOR_IN1, HIGH);
    digitalWrite(MOTOR_IN2, LOW);
    digitalWrite(MOTOR_IN3, HIGH);
    digitalWrite(MOTOR_IN4, LOW);
    
    isDoorOpened = true;
    isDoorClosed = false;
    statusUnknown = false;
    CloudSwitch_doorStatus = true;
    Serial.println("Tür wird geöffnet...");
    
    digitalWrite(LED_GREEN, LOW);
    digitalWrite(LED_RED, HIGH);
  }
}


// Klappe schließen
void closeDoor() {
  if (!isDoorClosed) {
    digitalWrite(MOTOR_IN1, LOW);
    digitalWrite(MOTOR_IN2, HIGH);
    digitalWrite(MOTOR_IN3, LOW);
    digitalWrite(MOTOR_IN4, HIGH);
    
    isDoorOpened = false;
    isDoorClosed = true;
    statusUnknown = false;
    CloudSwitch_doorStatus = false;
    Serial.println("Tür wird geschlossen...");
    
    digitalWrite(LED_RED, LOW);
    digitalWrite(LED_GREEN, HIGH);
  }
}

// Stoppen des Motors
void stopMotor() {
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
  digitalWrite(MOTOR_IN3, LOW);
  digitalWrite(MOTOR_IN4, LOW);
}

// LED blinken
void blinkLED(int ledPin, int count, int interval) {
  for (int i = 0; i < count; i++) {
    digitalWrite(ledPin, HIGH); 
    delay(interval); 
    digitalWrite(ledPin, LOW);  
    delay(interval); 
  }
}

// Aktualisierung des NTP-Clients
void updateNTP() {
  static unsigned long lastNTPUpdate = 0;
  if (millis() - lastNTPUpdate > 60000) { // Update alle 60 Sekunden
    timeClient.update();
    lastNTPUpdate = millis();
  }
}

/*
  Since CloudSwitchDoorStatus is READ_WRITE variable, onCloudSwitchDoorStatusChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onCloudSwitchDoorStatusChange() {
  if (CloudSwitch_doorStatus && !isDoorOpened) {
    openDoor();  // Cloud sagt: Tür soll geöffnet werden
  } else if (!CloudSwitch_doorStatus && !isDoorClosed) {
    closeDoor(); // Cloud sagt: Tür soll geschlossen werden
  }
}

/*
  Since CloudButton1 is READ_WRITE variable, onCloudButton1Change() is
  executed every time a new value is received from IoT Cloud.
*/
void onCloudButton1Change()  {
  // Add your code here to act upon CloudButton1 change
}
/*
  Since CloudButton2 is READ_WRITE variable, onCloudButton2Change() is
  executed every time a new value is received from IoT Cloud.
*/
void onCloudButton2Change()  {
  // Add your code here to act upon CloudButton2 change
}

Das hat ja mit Wifi gar nichts, und mit deinem Display fast nichts zu tun (wenn du dich auf die zwei LED und ihre Anzeigemöglichkeit (AUF ZU UNDEF) beschränkst.
Wie wäre es mit einem entsprechend reduziertem Sketch?
Funktioniert der Motor da?

Hi michael_x,

wenn du mit reduziert sowas meinst:

const int motorPin1 = 2;  // IN1 am L298N
const int motorPin2 = 3;  // IN2 am L298N
const int motorPin3 = 4;  // IN3 am L298N
const int motorPin4 = 5;  // IN4 am L298N
const int taster1 = 8;    // Taster 1 für Vorwärts
const int taster2 = 9;    // Taster 2 für Rückwärts

void setup() {
  // Serial Monitor starten
  Serial.begin(9600);
  
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);

  pinMode(taster1, INPUT_PULLUP);
  pinMode(taster2, INPUT_PULLUP);
  
  Serial.println("Setup abgeschlossen. Warte auf Tastereingabe...");
}

void loop() {
  if (digitalRead(taster1) == LOW) {
    Serial.println("Taster 1 gedrückt - Motor vorwärts");
    motorVorwaerts();
    delay(2000);  // Motor 2 Sekunden vorwärts laufen lassen
    motorStop();
  }

  if (digitalRead(taster2) == LOW) {
    Serial.println("Taster 2 gedrückt - Motor rückwärts");
    motorRueckwaerts();
    delay(2000);  // Motor 2 Sekunden rückwärts laufen lassen
    motorStop();
  }
}

void motorVorwaerts() {
  Serial.println("Motor dreht vorwärts...");
  
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  
  Serial.print("IN1: "); Serial.println(digitalRead(motorPin1));
  Serial.print("IN2: "); Serial.println(digitalRead(motorPin2));
  Serial.print("IN3: "); Serial.println(digitalRead(motorPin3));
  Serial.print("IN4: "); Serial.println(digitalRead(motorPin4));
}

void motorRueckwaerts() {
  Serial.println("Motor dreht rückwärts...");
  
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  
  Serial.print("IN1: "); Serial.println(digitalRead(motorPin1));
  Serial.print("IN2: "); Serial.println(digitalRead(motorPin2));
  Serial.print("IN3: "); Serial.println(digitalRead(motorPin3));
  Serial.print("IN4: "); Serial.println(digitalRead(motorPin4));
}

void motorStop() {
  Serial.println("Motor gestoppt.");
  
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  
  Serial.print("IN1: "); Serial.println(digitalRead(motorPin1));
  Serial.print("IN2: "); Serial.println(digitalRead(motorPin2));
  Serial.print("IN3: "); Serial.println(digitalRead(motorPin3));
  Serial.print("IN4: "); Serial.println(digitalRead(motorPin4));
}

... dann ja, aber auch erst nachdem ich den Jumper beim Motortreiber wieder gesetzt habe. Den hatte ich mal gezogen...jetzt ist das Problem bei meinen "großen" Code, das der Motor ständig läuft.

So, hab mir mal meine Schaltung ohne die Cloud gebastelt.
Funktioniert auch, wobei die Taster recht langsam reagieren. Gefühlt muss man die 2 Sekunden gedrückt halten, bis er merkt das ich die Klappe steuern will. Aber es funktioniert schon mal, was gerade echt viel Wert ist :slight_smile:

Wäre jetzt nur noch die Sache mit der Cloud - Einbindung.

Kann mir da jemand helfen?

Hatte mir vorgestellt die zwei Taster zum öffnen / schließen, der Status der Klappe (rot oder grüne Fläche), zwei Zeiteinstellungen (so dass die Klappe spätestens um z.B. 08:00 Uhr öffnet und spätestens um z.B. 22:00 Uhr schließt - wenn sie nicht schon bereits geöffnet oder geschlossen ist), Außen- und Innentemperatur im Dashboard angezeigt werden.

Hier der Code, ohne Cloud:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Arduino_LED_Matrix.h>

// Pin-Definitionen
#define TEMP_SENSOR1 10          
#define TEMP_SENSOR2 11          
#define BUTTON_OPEN 9                
#define BUTTON_CLOSE 8                
#define REED_SWITCH_OPEN 6       
#define REED_SWITCH_CLOSED 7     
#define LED_RED A0               
#define LED_GREEN A1             

// OLED Display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// LED-Matrix
ArduinoLEDMatrix matrix;               
const uint32_t heart[] = {              
  0x3184a444,
  0x44042081,
  0x100a0040
};

// Temperatursensoren
OneWire oneWire1(TEMP_SENSOR1);         
OneWire oneWire2(TEMP_SENSOR2);         
DallasTemperature sensors1(&oneWire1);  
DallasTemperature sensors2(&oneWire2);  

// Globale Variablen
bool isDoorOpened = false;              
bool isDoorClosed = false; 
bool ignoreReedSwitches = false;
unsigned long buttonPressTime = 0;
bool isMotorRunning = false;

// Motorsteuerung Pins
#define MOTOR_IN1 2              
#define MOTOR_IN2 3              
#define MOTOR_IN3 4              
#define MOTOR_IN4 5              

// Funktionsprototypen
void updateLEDs();
void updateDisplay();
void handleButtonPresses();
void openDoor(int speed);  
void closeDoor(int speed); 
void stopMotor();
void setMotorSpeed(int speed);

void setup() {
    Serial.begin(115200);

    // Initialisiere Motorpins
    pinMode(MOTOR_IN1, OUTPUT);          
    pinMode(MOTOR_IN2, OUTPUT);          
    pinMode(MOTOR_IN3, OUTPUT);          
    pinMode(MOTOR_IN4, OUTPUT);          

    // Initialisiere Pins für Taster und Reed-Schalter
    pinMode(BUTTON_OPEN, INPUT_PULLUP);     
    pinMode(BUTTON_CLOSE, INPUT_PULLUP);     
    pinMode(REED_SWITCH_OPEN, INPUT_PULLUP); 
    pinMode(REED_SWITCH_CLOSED, INPUT_PULLUP); 
    pinMode(LED_RED, OUTPUT);            
    pinMode(LED_GREEN, OUTPUT);          

    // OLED Display Initialisierung
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
        Serial.println(F("SSD1306 allocation failed")); 
        for (;;);
    }

    display.clearDisplay(); 

    // Initialisiere Temperatursensoren
    sensors1.begin();                     
    sensors2.begin();                     

    // Initialisiere LED-Matrix
    matrix.begin();                      
}

void loop() {
    // Aktuelle Temperaturwerte lesen
    sensors1.requestTemperatures();      
    sensors2.requestTemperatures();      

    // Tastersteuerung
    handleButtonPresses(); 

    // LEDs aktualisieren
    updateLEDs();

    // Display aktualisieren
    updateDisplay();

    // Herz auf der LED-Matrix anzeigen
    matrix.loadFrame(heart); 
    delay(50);

    // Überprüfen der Reed-Schalter, nur wenn der Motor läuft
  if (isMotorRunning) {
        if (digitalRead(REED_SWITCH_CLOSED) == LOW) {
            Serial.println("Reed-Schalter für geschlossen aktiviert. Motor wird gestoppt.");
            stopMotor();
            isMotorRunning = false;
        }

        if (digitalRead(REED_SWITCH_OPEN) == LOW) {
            Serial.println("Reed-Schalter für offen aktiviert. Motor wird gestoppt.");
            stopMotor();
            isMotorRunning = false;
        }
    }
}

// Tastersteuerung
void handleButtonPresses() {
    static unsigned long lastDebounceTimeOpen = 0;
    static unsigned long lastDebounceTimeClose = 0;
    const unsigned long debounceDelay = 50; 

    int buttonStateOpen = digitalRead(BUTTON_OPEN);
    int buttonStateClose = digitalRead(BUTTON_CLOSE);
    
    // Ignoriere Reed-Schalter für 2 Sekunden nach Tasterdruck
    if (ignoreReedSwitches && (millis() - buttonPressTime > 2000)) {
        ignoreReedSwitches = false;
    }

    // Taster "Open" (Klappe öffnen)
    if (buttonStateOpen == LOW && !ignoreReedSwitches) {
        if (millis() - lastDebounceTimeOpen > debounceDelay) {
            Serial.println("Taster zum Öffnen gedrückt - Klappe wird geöffnet.");
            ignoreReedSwitches = true; 
            buttonPressTime = millis(); 
            openDoor(80); 
            lastDebounceTimeOpen = millis(); 
        }
    }

    // Taster "Close" (Klappe schließen)
    if (buttonStateClose == LOW && !ignoreReedSwitches) {
        if (millis() - lastDebounceTimeClose > debounceDelay) {
            Serial.println("Taster zum Schließen gedrückt - Klappe wird geschlossen.");
            ignoreReedSwitches = true;
            buttonPressTime = millis();
            closeDoor(40);
            lastDebounceTimeClose = millis();
        }
    }

    // Eingänge und Ausgänge im Serial Monitor anzeigen
    Serial.print("Button Open: ");
    Serial.println(buttonStateOpen);
    Serial.print("Button Close: ");
    Serial.println(buttonStateClose);
    Serial.print("Reed Open: ");
    Serial.println(digitalRead(REED_SWITCH_OPEN) == LOW);
    Serial.print("Reed Closed: ");
    Serial.println(digitalRead(REED_SWITCH_CLOSED) == LOW);
}

// Geschwindigkeit des Motors einstellen
void setMotorSpeed(int speed) {

    speed = constrain(speed, 0, 255);
    
    // Motorsteuerung mit PWM
    analogWrite(MOTOR_IN1, speed);
    analogWrite(MOTOR_IN2, 0); 
    analogWrite(MOTOR_IN3, 0); 
    analogWrite(MOTOR_IN4, speed);
}

// Klappe öffnen mit Geschwindigkeitsparameter
void openDoor(int speed) {  
    Serial.println("Motor wird gestartet, um die Klappe zu öffnen...");
    setMotorSpeed(speed); 
    isMotorRunning = true;

    // Stoppe den Motor, wenn der Reed-Schalter für offen aktiviert wird
    while (digitalRead(REED_SWITCH_OPEN) != LOW) {
        // Nichts tun, einfach warten
    }

    stopMotor(); // Motor anhalten
}

// Klappe schließen mit Geschwindigkeitsparameter
void closeDoor(int speed) {
    Serial.println("Motor wird gestartet, um die Klappe zu schließen...");
    setMotorSpeed(speed); 
    isMotorRunning = true; 

    // Stoppe den Motor, wenn der Reed-Schalter für geschlossen wird
    while (digitalRead(REED_SWITCH_CLOSED) != LOW) {
        // Nichts tun, einfach warten
    }

    stopMotor(); // Motor anhalten
}

// Stoppen des Motors
void stopMotor() {
    Serial.println("Motor wird gestoppt.");
    analogWrite(MOTOR_IN1, 0);
    analogWrite(MOTOR_IN2, 0);
    analogWrite(MOTOR_IN3, 0);
    analogWrite(MOTOR_IN4, 0);
}

// LEDs aktualisieren
void updateLEDs() {
    // Zustand der Reed-Schalter überprüfen
    bool reedOpen = digitalRead(REED_SWITCH_OPEN) == LOW;
    bool reedClosed = digitalRead(REED_SWITCH_CLOSED) == LOW;

    // LEDs entsprechend dem Zustand der Klappe setzen
    if (reedOpen) {
        digitalWrite(LED_RED, HIGH); 
        digitalWrite(LED_GREEN, LOW); 
        isDoorOpened = true;
        isDoorClosed = false;
    } 
    else if (reedClosed) {
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_RED, LOW); 
        isDoorClosed = true;
        isDoorOpened = false;
    } 
    else {
        digitalWrite(LED_RED, LOW);  
        digitalWrite(LED_GREEN, LOW);
        isDoorOpened = false;
        isDoorClosed = false;
    }
}

// Display aktualisieren
void updateDisplay() {
    display.clearDisplay();                     
    display.setTextSize(1);                     
    display.setTextColor(SSD1306_WHITE);       
    display.setCursor(0, 0);                    
    display.print("Aussen: ");            
    display.print(sensors1.getTempCByIndex(0));          
    display.print(" C");                        
    display.setCursor(0, 10);                   
    display.print("Stall: ");             
    display.print(sensors2.getTempCByIndex(0));           
    display.print(" C");                        
    display.setCursor(0, 30);                   
    display.print(isDoorClosed ? "Klappe: Geschlossen" : (isDoorOpened ? "Klappe: Offen" : "Klappe: Unbekannt"));
    display.display();                           
}

Kann ins setup

Das blockiert alles! Baue dir eine statemaschiene.

Bleibe auf Teufel komm raus in der while-Schleife drin (wenn sein muss Jahrtausende lang)
so lange die Bedingung
(REED_SWITCH_CLOSED) != LOW) erfüllt ist.

Da muss mindestens eine Zeit-Abbruch-Bedingung mit rein.

Was für ein Machertyp bist du?
billich-Baumarkt
oder
"muss gut werden"

Du kannst jetzt mit zusammengestupftem Code Tage und Wochen herumprobieren bis es (eher zufällig) läuft
oder nach und nach mit Hilfe des Forums vernünftig programmieren lernen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.