Hallo beisammen
Es geht um folgendes Problem: Der Hebearm einer Seifenblasenmaschine fährt zwischen einem Seifenlaugenbehälter und einem Ventilator hin- unf her. Das ganze soll über zwei Gabellichtschranken gesteuert werden.
PAP:
Der Hebearm soll kurz (2-3sec) in die Lauge tunken
dann nach oben fahren bis zur oberen Lichtschranke am Ventilator
vor dem Ventilator kurz warten (3sec), damit Seifenblasen gepustet werden
dann wieder nach unten fahren zur unteren Lichtschranke am Behälter
das ganze dann wieder von vorne
ich habs mit zwei Codes probiert:
Code mit Interrupt: der Hebearm fährt gut zwischen den Lichtschranken hin- und her, macht aber keine Pause. Sowohl delay als auch millis für Pause funktioniert nicht (geht nicht mit interrupt)
const int LS1 = 2; // Lichtschranke 1 (LS1) unten
const int LS2 = 3; // Lichtschranke 2 (LS2) oben
const int in1 = 9 ; // Die beiden Motorpins an der Motorwendeplatine L298N
const int in2 = 10 ;
const int enA = 11;
volatile int LS1Status = 0; //Vektoren für die Lichtschranken werden definiert
volatile int LS2Status = 1;
void setup() {
pinMode(in1, OUTPUT); //in1 HIGH fährt nach unten
pinMode(in2, OUTPUT); //in2 HIGH fährt nach oben
pinMode(enA, OUTPUT);
pinMode(LS1, INPUT); //Lichtschranke offen = 0 Lichtschranke zu =1
pinMode(LS2, INPUT);
attachInterrupt(0,LS1gehtzu, RISING) ; //LS1 von 0 nach 1
attachInterrupt(1,LS2gehtzu, FALLING) ; //LS2 von 0 nach 1
}
void loop() { //loop bleibt leer
}
void LS1gehtzu(){ //LS1 unten von 0 nach 1
digitalWrite (in2,HIGH); //soll in2 HIGH sein => Motor dreht sich wieder und fährt Hebearm aus LS1 nach oben
digitalWrite (in1,LOW);
analogWrite (enA,50);
}
void LS2gehtzu() { //LS2 oben von 0 nach 1
digitalWrite (in1,HIGH); //soll in1 HIGH sein => Motor dreht sich wieder und fährt Hebearm aus LS2 nach unten
digitalWrite (in2,LOW);
analogWrite (enA,50);
}
Code mit switch case: Der Motor fährt aus der Lichtschranke raus, zwischen den Lichtschranken gibt der Motor aber nur ein hohes Summen ab, es passiert nichts. Wahrscheinlich ist der Zustand beide Lichtschranken 0 nicht eindeutig.
const int LS1 = 2; // Lichtschranke 1 unten
const int LS2 = 3; // Lichtschranke 2 oben
int in1 = 9;
int in2 = 10;
int statusLS1 = 0;
int statusLS2 = 0;
const byte start = 0;
const byte fahrt_nach_oben = 1;
const byte dispenser_oben = 2;
const byte fahrt_nach_unten =3;
const byte dispenser_unten =4;
const long wartezeit = 3000;
unsigned long previousMillis = 0;
int state = start;
void setup() {
pinMode (LS1, INPUT); //LS offen ==0 LS geschlossen==1
pinMode (LS2, INPUT); //LS offen ==0 LS geschlossen==1
pinMode (in1, OUTPUT); //in1 HIGH fährt nach unten
pinMode (in2, OUTPUT); //in2 HIGH fährt nach oben
}
void loop() {
statusLS1 = digitalRead (LS1);
statusLS2 = digitalRead (LS2);
unsigned long currentMillis = millis();
switch (state) {
case start:
digitalWrite (in1, HIGH); //in1 HIGH fährt nach unten
digitalWrite (in2, LOW);
if (statusLS1 == 1 || statusLS2 == 0) { //LS unten schließt
state = fahrt_nach_oben;
}
case fahrt_nach_oben:
digitalWrite (in2, HIGH); //in2 HIGH fährt nach oben
digitalWrite (in1, LOW);
if (statusLS1 == 0 || statusLS2 == 1) { //LS oben schließt
state = dispenser_oben;
}
break;
case dispenser_oben:
digitalWrite (in2, LOW);
digitalWrite (in1, LOW);
if (currentMillis - previousMillis >= wartezeit){ //Motor steht für 3sec oben
previousMillis = currentMillis;
digitalWrite (in2, LOW);
digitalWrite (in1, LOW);
}
digitalWrite (in1, HIGH); //in1 HIGH fährt nach unten
digitalWrite (in2, LOW);
if (statusLS1 == 0 || statusLS2 == 0) { //beide LS offen
state = fahrt_nach_unten;
}
break;
case fahrt_nach_unten:
digitalWrite (in1, HIGH); //in1 HIGH fährt nach unten
digitalWrite (in2, LOW);
if (statusLS1 == 1 || statusLS2 == 0) { //LS unten schließt
state = dispenser_unten;
}
break;
case dispenser_unten:
digitalWrite (in1, LOW);
digitalWrite (in2, LOW);
if (currentMillis - previousMillis >= wartezeit){ //Motor steht für 3sec unten
previousMillis = currentMillis;
digitalWrite (in1, LOW);
digitalWrite (in2, LOW);
}
digitalWrite (in2, HIGH); //in2 HIGH fährt nach oben
digitalWrite (in1, LOW);
if (statusLS1 == 0 || statusLS2 == 0) { //beide LS offen
state = fahrt_nach_oben;
}
break;
}
}
Bin dankbar für jeden Tip.
Danke schonmal!