Guten Abend zusammen, ich habe hier einen Code umgeschrieben um einen Schlitten von A nach B zu fahren und dann mit Endschaltern zu stoppen.
Dazu habe ich einen funktionieren Code im endeffekt einfach mit Copy & Paste dupliziert. Laut Seriellen Monitor funktioniert auch alles. Aber sobald ich die Relais anschließe 'Flackern' diese wie wild. Ich bin mir sicher es liegt am 'Delay' jedoch sind alle versuche es rauszukürzen erfolglos gewesen.
du hast ein paar konkurrierende IF-Bedingungen und schaltest in bestimmten Situationen die Ausgänge ständig aus und ein. Konkret in die Ifs nach D67 und D46
Wozu?
Du drückst auf die Taste - der Antrieb läuft.
Ob das für 5ms flattert, ist vollkommen egal - Dein relais schaltet nicht so schnell.
Du versperrst Dir aber mit dem delay() die Abfrage der Endschalter - das halte ich für gefährlicher.
Du verriegelst zudem die Taster nicht gegenseitig.
Wer zuletzt dran ist, hat gewonnen....
Soll der Schlitten solange fahren, bis der Endschalter ereicht ist, oder soll bei loslassen der taste auch angehalten werden?
Das wäre dann die Aufgabe.
Ziel ist das wenn der Taster das erste mal gedrückt wurde der Motor losfährt bis; entweder der Taster ein zweites mal gedrückt wird oder er am Endschalter anschlägt.
DANKE! - Grundsätzlich Funktioniert alles wie es soll, jedoch schalten die Relais wenn die Taster gedrückt sind ganz wild hin und her, hört sich an wie ein vibrieren - ich hoffe du weißt was ich mein, wie kann man so einen Fehler beheben?
Cooles Prinzip, danke dafür - jedoch wird in dem Sketch momentan nur ein Taster ausgelesen, rechts funktioniert perfekt, aber genau das ist mein Problem noch den zweiten Taster, in dem fall für Links einzubinden..
Copy und Paste wird mir hier ja wieder den gleichen Fehler wie am Anfang bringen..
2 Kanal Relais - nichts besonderes, einfach über den 5V pin - sobald ich den Taster los lasse ist das flackern auch weg, nur im 'Schaltzustand' flackerts.
naja wenn du das Prinzip durchschaut hast: ... mach dir eine zweite wasPressed Funktion für den anderen Taster und reagiere in den einzelnen States auf den anderen Taster.
Ich glaube nicht dass du da wirklich meine Hilfe brauchst oder?
edit,
oder vieleicht doch:
const byte Taster = A0;
const byte Endschalter = 2;
const byte Taster1 = A1;
const byte Endschalter1 = 3;
const byte Relais = 13;
const byte Relais1 = 12;
enum State {LEFT, // Endposition Links
RIGHT, // Endposition Rechts
LEFT_GO, // Bewegung nach Links
RIGHT_GO, // Bewegung nach Rechts
LEFT_HALT, // Nothalt während Bewegung nach Links
RIGHT_HALT // Nothalt während Bewegung nach Rechts
};
State state;
bool tasterWasPressedLeft()
{
int btnstate = !digitalRead(Taster1); //Taster lesen
static bool lastbtnstate = true;
bool result = false;
if (btnstate != lastbtnstate)
{
delay(50);
}
if (btnstate == true && btnstate != lastbtnstate)
{
Serial.println(F("pressed A"));
result = true;
}
lastbtnstate = btnstate;
return result;
}
bool tasterWasPressedRight()
{
int btnstate = !digitalRead(Taster); //Taster lesen
static bool lastbtnstate = true;
bool result = false;
if (btnstate != lastbtnstate)
{
delay(50);
}
if (btnstate == true && btnstate != lastbtnstate)
{
Serial.println(F("pressed B"));
result = true;
}
lastbtnstate = btnstate;
return result;
}
void stop()
{
digitalWrite(Relais, LOW);
digitalWrite(Relais1, LOW);
}
void goRight()
{
digitalWrite(Relais, HIGH);
digitalWrite(Relais1, LOW);
}
void goLeft()
{
digitalWrite(Relais, LOW);
digitalWrite(Relais1, HIGH);
}
void setup() {
Serial.begin(115200);
pinMode(Taster, INPUT_PULLUP);
pinMode(Endschalter, INPUT_PULLUP);
pinMode(Taster1, INPUT_PULLUP);
pinMode(Endschalter1, INPUT_PULLUP);
pinMode(Relais, OUTPUT);
pinMode(Relais1, OUTPUT);
}
void loop()
{
switch (state)
{
case LEFT:
if (tasterWasPressedRight())
{
Serial.println(F("start RIGHT_GO"));
state = RIGHT_GO;
goRight();
}
break;
case LEFT_GO:
if (digitalRead(Endschalter1) == LOW)
{
Serial.println(F("End LEFT"));
state = LEFT;
stop();
}
if (tasterWasPressedLeft())
{
Serial.println(F("LEFT halted"));
state = LEFT_HALT;
stop();
}
break;
case LEFT_HALT:
if (tasterWasPressedLeft())
{
Serial.println(F("restart LEFT"));
state = LEFT_GO;
goLeft();
}
if (tasterWasPressedRight())
{
Serial.println(F("reverse RIGHT"));
state = RIGHT_GO;
goRight();
}
break;
case RIGHT:
if (tasterWasPressedLeft())
{
Serial.println(F("start LEFT"));
state = LEFT_GO;
goLeft();
}
break;
case RIGHT_GO:
if (digitalRead(Endschalter) == LOW)
{
Serial.println(F("End RIGHT"));
state = RIGHT;
stop();
}
if (tasterWasPressedRight())
{
Serial.println(F("RIGHT halted"));
state = RIGHT_HALT;
stop();
}
break;
case RIGHT_HALT:
if (tasterWasPressedRight())
{
Serial.println(F("restart RIGHT"));
state = RIGHT_GO;
goRight();
}
if (tasterWasPressedLeft())
{
Serial.println(F("reverse Left"));
state = LEFT_GO;
goLeft();
}
break;
}
}