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...
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
}