Guten Tag an die Gemeinde,
habe einen Sketch zum Steuern von Motoren, dabei wird eine Message geprüft und in eine Zahl umgewandelt, die Zahl entspricht dann dem Case. Es wird immer der erste Case in der Schleife abgespielt, egal wie er heißt. Also wenn case 1 am Anfang steht, dann wird nur case 1 abgespielt, wenn die Message 4 sendet, dann wird case 4 nicht abgespielt.
Wenn ich hingegen zB Case 3 an den Anfang der Schleife setze, wird case 3 abgespielt wenn die Message 3 sendet, alle anderen Cases werden wieder nicht abgespielt. Ich sehe leider die Ursache nicht - liegt es am break? liegt es am void Message?
Am seriellen Monitor wird BtnValue für jeden Case richtig ausgegeben.
Es handelt sich um einen Arduino Mega, an dem hängt ein ESP8266 der über eine Webseite das BtnValue sendet.
#include <Servo.h>
int in1 = 30;
int in2 = 31;
int in3 = 32;
int in4 = 33;
int in5 = 34;
int in6 = 35;
Servo myservo;
int pos = 0;
int BtnValue = 0;
long Speed = 90;
long Height, Width, Diagonale, HalfWidth, HalfHeight, HalfDiagonale;
long /*Bewegung*/ links, rechts, oben, unten;
String message = "";
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(in5, OUTPUT);
pinMode(in6, OUTPUT);
myservo.attach(10);
Serial.begin(115200);
while (!Serial) {
}
}
void StopAllMotors() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
digitalWrite(in5, LOW);
digitalWrite(in6, LOW);
}
void Message() {
if (message.substring(0, 9) == "BtnValue:") {
String Split = message.substring(9);
BtnValue = Split.toInt();
Serial.println(BtnValue);
links = Width * 100;
rechts = Width * 100;
oben = Height * 100;
unten = Height * 100;
}
if (message.substring(0, 1) == "Q") {
int PointPosition = message.indexOf(':');
String messageA = message.substring(1, PointPosition);
//Serial.println(String(messageA));
String messageB = message.substring((PointPosition + 1));
//Serial.println(String(messageB));
Width = messageA.toInt();
Height = messageB.toInt();
Serial.println(Width);
Serial.println(Height);
}
}
void loop() { // run over and over
if (Serial.available()) {
message = Serial.readString();
message.trim();
Serial.println(message);
Message();
}
Motors();
}
void Motors() {
switch (BtnValue) {
case 1: //FRONT
Serial.println("Up");
StopAllMotors();
digitalWrite(in1, LOW); // Motor 1 beginnt zu rotieren
digitalWrite(in2, HIGH);
delay(20);
break;
case 2: //BACK
Serial.println("Down");
StopAllMotors();
digitalWrite(in2, LOW); // Motor 1 beginnt zu rotieren
digitalWrite(in1, HIGH);
delay(20);
break;
case 3://Left
Serial.println("Left");
StopAllMotors();
digitalWrite(in3, LOW); // Motor 2 beginnt zu rotieren
digitalWrite(in4, HIGH);
delay(20);
break;
case 4://Right
Serial.println("Right");
StopAllMotors();
digitalWrite(in4, LOW); // Motor 2 beginnt zu rotieren
digitalWrite(in3, HIGH);
delay(20);
break;
case 5: //Stop
Serial.println("Stopp");
StopAllMotors();
BtnValue = 0;
break;
case 9://Dc links
Serial.println("Rein");
StopAllMotors();
digitalWrite(in5, HIGH); // Motor 3 beginnt zu rotieren
digitalWrite(in6, LOW);
delay (20);
//Motors();
break;
case 10://dc rechts
Serial.println("Raus");
StopAllMotors();
digitalWrite(in5, LOW); // Motor 3 beginnt zu rotieren
digitalWrite(in6, HIGH);
delay (20);
break;
case 11://Servo left
Serial.println("Servo links");
StopAllMotors();
pos -= 1;
myservo.write(pos);
break;
case 12://Servo right
Serial.println("Servo rechts");
StopAllMotors();
pos += 1;
myservo.write(pos);
break;
}
}