Sehr geehrtes Forum, ich möchte meinen Arduino per Bluetooth über ein App ansteuern (Motor, Servo, 2 led) über seriellen Monitor klappt das alles wunderbar, auch über Bluetooth nimmt er alle Befehle an, jedoch nur solange ich den Arduino mit dem PC verbunden habe. Kaum trenne ich die Verbindung, nimmt er nur noch den ersten Befehl an nachfolgende Befehle werden falsch interpretiert und schließlich die Bluetooth Verbindung unterbrochen. Woran kann das liegen ? Nachfolgend mein Code.
#include <Servo.h>
Servo myServo;
constexpr uint8_t servoPin {5};
constexpr uint8_t middle {84};
constexpr uint8_t rightOne {5};
constexpr uint8_t rightTwo {30};
constexpr uint8_t rightThree {60};
constexpr uint8_t leftThree {120};
constexpr uint8_t leftTwo {150};
constexpr uint8_t leftOne {173};
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); // 2 TXD grün 3 RXD gelb
#define IN1 8 // Motor Richtung
#define IN2 7
#define ENA 11 // PWM Geschwindigkeit
const int geschwindigkeit[4] = {150, 170, 210, 255}; // Vier Stufen Vorwärts
#define PL 4 //Positionslichter
#define SW 6 //Scheinwerfer
void setup()
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENA, OUTPUT);
// Seriell & Bluetooth
Serial.begin(9600);
BTSerial.begin(9600);
// Motor Stop
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
analogWrite(ENA, 0);
myServo.attach(servoPin);
setServo(middle);
pinMode(PL, OUTPUT);
digitalWrite(PL, LOW); //Positionslichter anfangs aus
pinMode(SW, OUTPUT);
digitalWrite(SW, LOW); //Scheinwerfer anfangs aus
Serial.println("DC Motor bereit. Kommandos: v1, v2, v3, v4, r, s, l1, l2, l3, m, r3, r2, r1, pl1, pl0, sw1, sw0");
}
const uint8_t maxIdx = 5;
char serBuf[maxIdx + 1];
char btBuf[maxIdx + 1];
uint8_t btIdx;
uint8_t serIdx;
void getSerial()
{
if (Serial.available()) // Es ist was im seriellen
{
char c = Serial.read(); // liest ein Zeichen aus
if (isPrintable(c)) // Test auf sichtbares Zeichen
{
serBuf[serIdx++] = c; // Dann in den Puffer aufnehmen
}
if (isControl(c) || // Steuerzeichen gelesen? ODER
serIdx == maxIdx) // Buffer voll
{
setSpeed(serBuf); // Aktion ausführen
clearBuf(serBuf, serIdx); // Variablen leeren
}
}
}
void getBluetooth()
{
if (BTSerial.available()) // Es ist was im seriellen
{
Serial.print(F("BT Zeichen erkannt: "));
char c = BTSerial.read(); // liest ein Zeichen aus
Serial.println(c, HEX);
if (isPrintable(c)) // Test auf sichtbares Zeichen
{
btBuf[btIdx++] = c; // Dann in den Puffer aufnehmen
}
if (isControl(c) || // Steuerzeichen gelesen? ODER
btIdx == maxIdx) // Buffer voll
{
if (btIdx) // Wenn Zeichen im Buffer sind
{ setSpeed(btBuf); } // Aktion ausführen
clearBuf(btBuf, btIdx); // Variablen leeren
}
}
}
void clearBuf(char *buf, uint8_t &idx)
{
memset(buf, '\0', maxIdx);
idx = 0;
}
void setSpeed(const char *buf)
{
if (!strcmp(buf, "v1"))
{ motorVorwaerts(geschwindigkeit[0]); }
else if (!strcmp(buf, "v2"))
{ motorVorwaerts(geschwindigkeit[1]); }
else if (!strcmp(buf, "v3"))
{ motorVorwaerts(geschwindigkeit[2]); }
else if (!strcmp(buf, "v4"))
{ motorVorwaerts(geschwindigkeit[3]); }
else if (!strcmp(buf, "r"))
{ motorRueckwaerts(150); } // Geschwindigkeit rückwärts
else if (!strcmp(buf, "s"))
{ motorStop(); }
else if (!strcmp(buf, "l1"))
{setServo(leftOne);}
else if (!strcmp(buf, "l2"))
{setServo(leftTwo);}
else if (!strcmp(buf, "l3"))
{setServo(leftThree);}
else if (!strcmp(buf, "m"))
{setServo(middle);}
else if (!strcmp(buf, "r1"))
{setServo(rightOne);}
else if (!strcmp(buf, "r2"))
{setServo(rightTwo);}
else if (!strcmp(buf, "r3"))
{setServo(rightThree);}
else if (!strcmp(buf, "pl1")) //Positionslichter an
{digitalWrite(PL, HIGH);}
else if (!strcmp(buf, "pl0"))
{digitalWrite(PL, LOW);}
else if (!strcmp(buf, "sw1"))
{digitalWrite(SW, HIGH);}
else if (!strcmp(buf, "sw0"))
{digitalWrite(SW, LOW);}
else
{
Serial.print(F("FEHLER: "));
Serial.println(buf);
}
}
void loop()
{
getSerial();
getBluetooth();
}
void motorVorwaerts(int speed)
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, speed);
Serial.println("Motor vorwärts, Speed: " + String(speed));
}
void motorRueckwaerts(int speed)
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, speed);
Serial.println("Motor rückwärts, Speed: " + String(speed));
}
void motorStop()
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
analogWrite(ENA, 0);
Serial.println("Motor gestoppt");
}
void setServo(const uint8_t pos)
{
myServo.write(pos);
}