Ups, Zahlendreher drin. Der Spannungsteiler besteht aus einem 510k und einem 51k Ohm Widerstand. Wäre der Fehler hier gewesen hätte ich das auch viel eher bemerkt, habe ja selbst nachgemessen was anliegt und ausgeben lassen, was der Arduino misst.
Die Relais haben Schutzdioden, ja.
Der LED habe ich keinen Vorwiderstand verpasst, dass muss ich natürlich noch nachholen. Aber kann das die Ursache gewesen sein?
Den Code kann ich natürlich aus so posten, wenn Euch das lieber ist:
//Programm zur Steuerung einer Klappe am Hühnerstall
//geschrieben von Carsten Lehmann (DerLehmi)
#include <Bounce2.h>
int ledG=2;
int ledR=3;
int tasterO=11;
int tasterU=12;
int relaisA=5; //Klappe runterfahren
int relaisB=4; //Klappe hochfahren
int eingang=A4;
bool Eingangmerker=false;
bool flanke=false;
bool beheben=false;
Bounce TasterO=Bounce();
Bounce TasterU=Bounce();
int status=0;
unsigned long zeitspeicher_notAus=0;
unsigned long zeitspeicher_signal=4294787295;
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(relaisA, OUTPUT);
pinMode(relaisB, OUTPUT);
digitalWrite(relaisA, HIGH);
digitalWrite(relaisB, LOW);
delay(200);
digitalWrite(relaisB, HIGH);
pinMode(tasterO, INPUT);
digitalWrite(tasterO, HIGH);
TasterO.attach(tasterO);
TasterO.interval(10);
pinMode(tasterU, INPUT);
digitalWrite(tasterU, HIGH);
TasterU.attach(tasterU);
TasterU.interval(10);
pinMode(eingang, INPUT);
Serial.begin(9600);
TasterO.update();
TasterU.update();
Tasterabfrage();
if(status!=3){
if(TasterO.read()){
digitalWrite(ledR, HIGH); //Klappe unten (Rot)
Serial.println("Klappe unten");
}else{
digitalWrite(ledG, HIGH); //Klappe oben (Grün)
Serial.println("Klappe oben");
}
}
}
void loop() {
if(status!=3){
if((millis()-zeitspeicher_signal)>20000){
if(!Eingangmerker && digitalRead(eingang)){
flanke=true;
Eingangmerker=true;
Serial.println("Merker auf true, Flanke erkannt: ");
int wert=analogRead(eingang);
Serial.println(wert);
zeitspeicher_signal=millis();
}else if(Eingangmerker){
Eingangmerker=false;
Serial.println("Merker auf false");
zeitspeicher_signal=millis()-15000;
digitalWrite(relaisA, LOW);
delay(200);
digitalWrite(relaisA, HIGH);
}
}
}
if(status==0 && !flanke){
if(digitalRead(relaisA)!=digitalRead(relaisB)){ //Motor stoppen
digitalWrite(relaisB, HIGH);
digitalWrite(relaisA, HIGH);
}
}else if(status==0 && flanke){ //wenn Wartestatus und Eingangssignal
Tasterabfrage();
flanke=false;
zeitspeicher_notAus=millis();
if(status!=3){
if(!TasterO.read()){
digitalWrite(relaisA, LOW); //Klappe runterfahren
digitalWrite(ledR, HIGH); //in Betrieb: LED Gelb
Serial.println("Klappe runter");
}else{
digitalWrite(relaisB, LOW); //Klappe hochfahren
digitalWrite(ledG, HIGH); //in Betrieb: LED Gelb
Serial.println("Klappe hoch");
}
status=1; //Schlitten in Betrieb
}
}
if(status==1){ //Betriebsstatus
if(digitalRead(relaisB)){
Serial.println("Teste unteren Taster");
if(TasterU.fell()){ //Zielposition (unten) erreicht
status=0;
digitalWrite(ledG, LOW);
Serial.println("Ziel unten erreicht");
}
}else{
Serial.println("Teste oberen Taster");
if(TasterO.fell()){ //Zielposition (oben) erreicht
status=0;
digitalWrite(ledR, LOW);
Serial.println("Ziel oben erreicht");
}
}
if((millis()-zeitspeicher_notAus)>5000) //wenn Schlitten durch irgendwas blockiert
status=3;
}
if(status==3){ //Fehlerstatus
if(TasterO.fell() || TasterU.fell())
beheben=true;
if(!beheben){
if(digitalRead(relaisA)!=digitalRead(relaisB)){ //Motor stoppen
digitalWrite(relaisA, HIGH);
digitalWrite(relaisB, HIGH);
}
if(digitalRead(ledG))
digitalWrite(ledG, LOW);
if((millis()-zeitspeicher_notAus)>300){ //LED blinkt rot
digitalWrite(ledR, !digitalRead(ledR));
zeitspeicher_notAus=millis();
}
}else if(TasterO.fell() && digitalRead(relaisB)){ //Zielposition oben anfahren
digitalWrite(relaisB, LOW);
}else if(TasterU.fell() && digitalRead(relaisA)){ //Zielposition unten anfahren
digitalWrite(relaisA, LOW);
}else if(TasterO.fell() && !digitalRead(relaisA)){ //Zielposition oben erreicht
digitalWrite(relaisB, HIGH);
status=0;
beheben=false;
if(digitalRead(ledR))
digitalWrite(ledR, LOW);
digitalWrite(ledG, HIGH);
}else if(TasterU.fell() && !digitalRead(relaisA)){ //Zielposition unten erreicht
digitalWrite(relaisA, HIGH);
status=0;
beheben=false;
digitalWrite(ledR, HIGH);
}
}
TasterO.update();
TasterU.update();
delay(50);
}
void Tasterabfrage(){
Serial.println("Fehlertest");
if(!TasterO.read())
Serial.println("Oberer Taster gedrückt");
if(!TasterU.read())
Serial.println("Unterer Taster gedrückt");
if(TasterO.read()==TasterU.read()){ //Test, ob Schlitten eindeutige Lage hat
status=3; //Fehlerstatus
Serial.println("Fehler erkannt");
}
}