Hallo zusammen,
ich habe einen Arduino Pro Mini zur Hühnerstallsteuerung programmiert und komme leider nicht weiter.
Schaltungsaufbau:
Stromversorgung erfolgt über ein 12V Solarpanel und einer Autobatterie.
Motor und Licht werden mit 12V betrieben und über ein Relais geschaltet.
Der Motor kann über Taster manuell bedient werden.
RTC ist ein DS1307.
Als Endschalter sind Reed-Relais verbaut.
Die Steuerung hat folgenden Ablauf:
7:00 Uhr - Licht an
9:15 Uhr - Licht aus und Klappe auf
20:00 Uhr - Licht an
20:55 Uhr - Licht aus
21:00 Uhr - Klappe zu
Die Steuerung hat auch einige Zeit gut funktioniert. Dann setzt die Klappensteuerung aus, allerdings entweder morgens ODER abends. Manuell lässt sich die Klappe über Taster IMMER bedienen.
Nach erneutem Flashen des Arduino, funktionierte dieser wieder ein paar Tage.
Ich kann mir das Fehlverhalten nicht erklären. Vllt stehe ich auch einfach auf dem Schlauch.
Die Steuerung wurde bereits auf ein Minimum reduziert.
// Zeitschaltung/RTC und Tasterbedienung //
// Include the libraries:
#include <OneWire.h>
#include <Wire.h>
#include "RTClib.h"
// millis
unsigned long previousMillis = 0;
const long interval = 1000;
// Set RTC ---------------------------------------------------------------------------------------------------
RTC_DS1307 rtc; // SDA A4 - SCL A5
char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
int counterMorgens = 0; // 0 -> Tür geschlossen , 1 -> Tür geöffnet
int counterAbends = 0; // 0 -> Tür geöffnet , 1 -> Tür geschlossen
int hh_LichtAnM = 7; // 7:xx Uhr
int mm_LichtAnM = 0; // x:00 Uhr
int hh_TuerAuf = 9; // 9:xx Uhr
int mm_TuerAuf = 15; // x:15 Uhr
int hh_CounterM = hh_TuerAuf + 1;
int hh_LichtAnA = 20; // 20:xx Uhr
int mm_LichtAnA = 0; // x:00 Uhr
int hh_LichtAusA = 20; // 20:xx Uhr
int mm_LichtAusA = 55; // x:55 Uhr
int hh_TuerZu = 21; // 21:xx Uhr
int mm_TuerZu = 0; // x:00 Uhr
int hh_CounterA = hh_TuerZu + 1;
int aktuelleStunde = 0;
int aktuelleMinute = 0;
// LDR --------------------------------------------------------------------------------------------------------
int LDRin = A0; // PullDown 2k2
int LDRvalue = 0;
// Relay-Karte ------------------------------------------------------------------------------------------------
int relais1pin = 5;
int relais2pin = 6;
int lichtpin = 4;
int counterLicht = 0;
// Endschalter ------------------------------------------------------------------------------------------------
int SchalterObenPin = 7; // PullDown 2k2
int SchalterUntenPin = 8; // PullDown 2k2
int counterOben = 0; // Rechts
int counterUnten = 0; // Links
// Taster // PullDown 2k2 ------------------------------------------------------------------------------------
int hochpin = 10; // PullDown 2k2
int runterpin = 11; // PullDown 2k2
void initRTC() {
if (! rtc.begin()) { // Keine Uhr entdeckt
Serial.println(F("Echtzeituhr fehlt"));
// Fehlerbehandlung
while (1); // Fehlerschleife
}
if (! rtc.isrunning()) { // Uhr schon gesetzt?
Serial.println(F("RTC bisher noch nicht gesetzt!"));
// => Initialisiere Zeit und Datum auf Datum/Zeit des Host-PCs
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Datum und Uhrzeit manuell eingeben (Jahr, Monat, Tag, Stunde, Minute, Sekunde)
//rtc.adjust(DateTime(2020, 6, 5, 11, 28, 0));
}
else Serial.println(F("Echtzeituhr laeuft bereits."));
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void rechtslauf() {
digitalWrite(relais1pin, HIGH);
digitalWrite(relais2pin, LOW);
}
void linkslauf() {
digitalWrite(relais1pin, LOW);
digitalWrite(relais2pin, HIGH);
}
void keineBewegungHIGH() {
digitalWrite(relais1pin, HIGH);
digitalWrite(relais2pin, HIGH);
}
void LichtAn() {
digitalWrite(lichtpin, LOW);
}
void LichtAus() {
digitalWrite(lichtpin, HIGH);
}
void MotorRechtsBisEndschalter() {
//counterUnten = digitalRead(SchalterUntenPin);
counterUnten = 1; // untere Endschalter überbrückt
if (counterUnten == 1) {
Serial.println(F("HOCH SCHLEIFE"));
rechtslauf();
int counter15sec = 0;
do {
delay(10);
counter15sec++;
if (counter15sec > 1250) {
goto KeinEndschalterRechts;
}
} while (digitalRead(SchalterObenPin) != 1);
}
KeinEndschalterRechts:
keineBewegungHIGH();
delay(100);
}
void MotorLinksBisEndschalter() {
//counterOben = digitalRead(SchalterObenPin);
counterOben = 1;
if (counterOben == 1) {
Serial.println(F("RUNTER SCHLEIFE"));
int counter15sec = 0;
do {
delay(10);
counter15sec++;
if (counter15sec > 1250) {
goto KeinEndschalterLinks;
}
} while (digitalRead(SchalterUntenPin) != 1);
}
KeinEndschalterLinks:
keineBewegungHIGH();
delay(100);
}
void MotorRechtslauf05Sek() {
Serial.println(F("HOCH 0,5 Sekunden"));
rechtslauf();
delay(500);
keineBewegungHIGH();
}
void MotorLinkslauf05Sek() {
Serial.println(F("RUNTER 0,5 Sekunden"));
linkslauf();
delay(500);
keineBewegungHIGH();
}
void setup() {
Serial.begin(9600);
while (!Serial);
// RTC
initRTC();
delay(100);
DateTime now = rtc.now();
delay(100);
// Relay
digitalWrite(relais1pin, HIGH);
digitalWrite(relais2pin, HIGH);
digitalWrite(lichtpin, HIGH);
delay(500);
pinMode(relais1pin, OUTPUT);
pinMode(relais2pin, OUTPUT);
pinMode(lichtpin, OUTPUT);
pinMode(SchalterObenPin, INPUT);
pinMode(SchalterUntenPin, INPUT);
pinMode(hochpin, INPUT);
pinMode(runterpin, INPUT);
pinMode(LDRin, INPUT);
delay(500);
// LED
pinMode(LED_BUILTIN, OUTPUT);
delay(250);
// Abschlussblinken des Setups
int i = 0;
while (i < 10) {
digitalWrite(LED_BUILTIN, HIGH);
delay(250);
digitalWrite(LED_BUILTIN, LOW);
delay(250);
i++;
}
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
DateTime now = rtc.now();
Serial.print(F("Aktuelle Uhrzeit: "));
Serial.print(now.hour(), DEC);
Serial.print(F(":"));
Serial.print(now.minute(), DEC);
Serial.print(F(":"));
Serial.print(now.second(), DEC);
Serial.println();
aktuelleStunde = now.hour();
aktuelleMinute = now.minute();
delay(1);
}
// Morgens Automatik
// Licht Automatik
if ((aktuelleStunde == hh_LichtAnM) && (aktuelleMinute == mm_LichtAnM)) {
LDRvalue = 0;
if ((counterLicht == 0) && (LDRvalue == 0)) {
LichtAn();
counterLicht = 1;
Serial.println(F("Auto: Licht an"));
delay(1000);
}
}
// Tür Automatik Auf und Licht aus
if ((aktuelleStunde == hh_TuerAuf) && (aktuelleMinute == mm_TuerAuf)) {
if (counterMorgens == 0) {
MotorRechtsBisEndschalter();
counterMorgens = 1;
Serial.println(F("AUTO: HOCH"));
delay(1000);
if (counterLicht == 1) {
LichtAus();
counterLicht = 0;
Serial.println(F("Auto: Licht aus"));
delay(1000);
}
}
}
if ((aktuelleStunde >= hh_CounterM) && (counterMorgens == 1)) { // RST des counters
Serial.println(F("CounterMorgens auf 0."));
counterMorgens = 0;
delay(10);
}
// Abends Automatik
// Licht Automatik An
if ((aktuelleStunde == hh_LichtAnA) && (aktuelleMinute == mm_LichtAnA)) {
//LDRvalue = digitalRead(LDRin);
if (counterLicht == 0) {
LichtAn();
counterLicht = 1;
Serial.println(F("Auto: Licht an"));
delay(1000);
}
}
// Licht Automatik Aus
if ((aktuelleStunde == hh_LichtAusA) && (aktuelleMinute == mm_LichtAusA)) {
if (counterLicht == 1) {
LichtAus();
counterLicht = 0;
Serial.println(F("Auto: Licht aus"));
delay(1000);
}
}
// Tür Automatik Zu
if ((aktuelleStunde == hh_TuerZu) && (aktuelleMinute == mm_TuerZu)) {
if (counterAbends == 0) {
MotorLinksBisEndschalter();
counterAbends = 1;
Serial.println(F("AUTO: RUNTER"));
delay(1000);
}
}
if ((aktuelleStunde >= hh_CounterA) && (counterAbends == 1)) { // RST des counters
Serial.println(F("CounterAbends auf 0."));
counterAbends = 0;
delay(10);
}
int hoch = digitalRead(hochpin);
if (hoch == 1) {
Serial.println(F("HOCH"));
//MotorRechtsBisEndschalter();
MotorRechtslauf05Sek();
}
int runter = digitalRead(runterpin);
if (runter == 1) {
Serial.println(F("RUNTER"));
//MotorLinksBisEndschalter();
MotorLinkslauf05Sek();
}
}