Die Funktionen geben true zurück wenn ein Switch betätigt wurde und funktionieren. "Einer ist gedrückt" und "Error: Links" wird auch geprinted [Serial Monitor + LCD] jedoch werden die anderen gar nicht berücksichtigt, das ist doof
Woran könnte das liegen?
Szenario: Links wird gedrückt --> Einer ist gedrückt, Links (im Loop)
Rechts wird gedrückt-->Einer ist gedrückt (im Loop)
//while if als Schleifenkonstruktion, die die einzelnen Bedingungen überprüft
while(CheckSwitches() == true){
SetSpeed(0); //Zuallererst die Geschwindigkeit zu Null setzen
Serial.println("Einer ist gedrückt"); //spft
delay(1000);
if(CheckLeft() == true){
lcd.print("Error: Left");
Serial.println("Links"); //spft
}
else if(CheckRight == true){
lcd.print("Error: Right");
Serial.println("Rechts"); //spft
lcd.clear();
}
else if(CheckAnschlag == true){
lcd.print("Anschlag");
lcd.clear();
}
}
Serial.println("Keiner"); //spft
Der Sketch macht genau das was du programmiert hast.
Nach der ersten if-Abfrage die TRUE ist springt er raus und kann die anderen ja nicht mehr abfragen.
Habe aus "else if" jetzt nur "if" gemacht. Bitte beachte auch das zweite Szenario: Nur Rechts ist gedrückt --> "Einer ist gedrückt" folgt und nicht "Error: Right"
Der gesamte Sketch ist ziemlich lang und funktioniert ansonsten soweit, deswegen weiß ich nicht ob das in diesem Fall zielführend ist. Sonst könnte ich natürlich noch die Definitionen der Funktionen posten.
Marsmann:
Habe aus "else if" jetzt nur "if" gemacht. Bitte beachte auch das zweite Szenario: Nur Rechts ist gedrückt --> "Einer ist gedrückt" folgt und nicht "Error: Right"
Der gesamte Sketch ist ziemlich lang und funktioniert ansonsten soweit, deswegen weiß ich nicht ob das in diesem Fall zielführend ist. Sonst könnte ich natürlich noch die Definitionen der Funktionen posten.
Meist liegt der Fehler im verborgenen, daher ist das schon zielführend.
Aber lass mich mal raten (mach ich gern).
Es liegt an den Variablen in der if-Abfrage. Deine erste Abfrage arbeitet mit einer Funktion, die beiden anderen mit Variablen.
Wenn's das nicht ist, dann brauchen wir alles. Punkt.
//LCD
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int state = 0; //State in dem sich das Programm derzeit befindet Zu Beginn auf Zero, sprich LCD Eingabe!
//Digital Pin für Knopfdruck
int buttonPin = 6;
//ENDSCHALTER
int sig1 = 22; //Linker Endschalter D22
int sig2 = 23; //Rechter Endschalter D23
//ENDPUNKT bzw Anschlag
int sig3 = 25; //Postitionsschalter D25
// ****************************************************************************************
// ****************************************************************************************
void setup() {
//ALLGEMEIN
Serial.begin(9600);
//LCD
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.print("Hello User!"); // Print a message to the LCD. (optional) spft?!
}
void loop(){
while(CheckSwitches() == true){
SetSpeed(0); //Zuallererst die Geschwindigkeit zu Null setzen
Serial.println("Einer ist gedrückt"); //spft
delay(1000);
if(CheckLeft() == true){
lcd.print("Error: Left");
Serial.println("Links"); //spft
}
if(CheckRight == true){
lcd.print("Error: Right");
Serial.println("Rechts"); //spft
lcd.clear();
}
if(CheckAnschlag == true){
lcd.print("Anschlag");
lcd.clear();
}
}
}
//ENDSCHALTER
// Endschalter soll schützen
boolean CheckSwitches(){ //Gibt true zurück wenn einer der Schalter gedrückt wurde
int links = digitalRead(sig1); //States werden gelesen
int rechts = digitalRead(sig2);
int anschlag = digitalRead(sig3);
if ((links == LOW) || (rechts == LOW) || (anschlag == LOW) ){ //einer von beiden Endschaltern oder Anschlag wurde gedrückt
return true;
}
else{
return false;
}
}
boolean CheckAnschlag(){ //Gibt true zurück wenn Positionsanschlag gedrückt wurde
int anschlag = digitalRead(sig3);
if (anschlag == LOW){ //anschlag wurde gedrückt
return true;
}
else{
return false;
}
}
boolean CheckLeft(){ //Gibt true zurück wenn Left gedrückt wurde
int links = digitalRead(sig1);
if (links == LOW){ //links wurde gedrückt
return true;
}
else{
return false;
}
}
boolean CheckRight(){ //Gibt true zurück wenn Right gedrückt wurde
int rechts = digitalRead(sig2);
if (rechts == LOW){ //rechts wurde gedrückt
return true;
}
else{
return false;
}
}
Hab jetzt den Code rauskopiert, den das angesprochene Problem betrifft. Hoffentlich hilft das weiter.
Die Funktionen am Ende sind eigentlich alle gleich gehalten, also existiert eigentlich kein Unterschied zwischen Variablen oder Ähnlichem oder?
Das ist ja peinlich und ich sitze hier seit ner Stunde und verschwende meine/deine Zeit :S:S:S
Ich hab den Code vor Augen nicht mehr gesehen, Danke, danke, danke!!!
Edit: Wie kann man den Topic löschen, das ist ja peinlich grrr
Marsmann:
Das ist ja peinlich und ich sitze hier seit ner Stunde und verschwende meine/deine Zeit :S:S:S
Ich hab den Code vor Augen nicht mehr gesehen, Danke, danke, danke!!!
Edit: Wie kann man den Topic löschen, das ist ja peinlich grrr
Ok, habe gern geholfen.
Wie sagt man so schön "Vier Augen sehen mehr wie zwei".
Schreibe einfach vor den Titel des ersten Post "erledigt".
Wieder ein Fall bei dem eingeschaltete Warnungen gute Hinweise gegeben hätten.
Somewhere\Anschlag\Anschlag.ino:53:23: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (CheckRight == true) {
^
Somewhere\Anschlag\Anschlag.ino:59:26: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (CheckAnschlag == true) {
^