Anfängerfrage - mehrere Möglichkeiten ablaufen lassen

Hallo,

ich arbeite seit ein zwei Jahren mit Arduino. Es waren immer einfache Sketche, die keine großen Probleme machten. Jetzt habe ich mir einen RobotCar gekauft und wollte diesen einmal anders als in der Packung enthalten, programmieren.

Der Roboter hat die Möglichkeit über Bluetooth angesteuert zu werden. Man kann ihn über eine Infrarotfernbedienung zum laufen bringen und er fährt auf einer schwarzen Linie. Für jede einzelne Möglichkeit gibt es auf einer beiliegenden CD ein Beispiel.
Nun wollte ich die Programme verbinden. Das hat seinen Sinn, da ich das für ein anderes Projekt benötige.

Mit der beiliegenden Fernbedienung möchte ich ein Programm auswählen. Das dann gestartet werden oder durchlaufen soll.

Beispiel: Ich drücke auf der Fernbedienung auf die Taste 1, dann kann ich mein Auto mit Bluetooth verbinden. Drücke ich 2 kann ich mit den Pfeiltasten der Fernbedienung das Auto bewegen. Bei der 3 kann das Auto dann beispielsweise auf der Linie fahren.

Das habe ich, leider ohne Erfolg, versucht zu programmieren. Leider stoße ich da gewaltig an meine Grenzen.

Ich habe für die Codes 1,2,3... der Fernbedienung eine Variable genommen. Wenn auf der Fernbedienung Taste 1 gedrückt wird, wird die Variable auf 1 gesetzt.
Mit einem If will ich dann das Programm starten: Wenn Variable (im Programm "Schluessel") gleich 1 dann soll das Programm durchlaufen. Aber das Ding geht nicht.

Wo liegt mein Denkfehler, kann mir jemand mal helfen? Das wäre echt toll. Für jeden hilfreichen Tipp und jede Hilfe wäre ich sehr dankbar. Vielen Dank auch fürs lesen.

Vielen lieben Dank

Hier noch der Sketch
Positionsangabe imme wie wenn man im Auto als Fahrer sitzen würde
A8 ist Fotosensor 25 ausreichend Licht, unter 25 zu wenig licht
14 ist linkes Licht vorne
15 ist Blinker links vorne
16 ist Blinker rechts vorne
17 ist rechtes Licht vorne
50 ist Rücklicht rechts
51 ist Rücklicht links

*/
/////////Fotosensor
int eingang = A8;
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert
//////////Bluetooth
int LED = 13;
volatile int state = LOW;
char getstr;
int in1 = 6;
int in2 = 7;
int in3 = 8;
int in4 = 9;
int ENA = 5;
int ENB = 11;
//int ABS = 150;
//////////Hindernis
#include <Servo.h>
Servo myservo;
int Echo = A4;
int Trig = A5;
//////////Lichter
int RLichtr = 50;
int RLichtl = 51;
int FLichtr = 17; //Frontlicht
int FLichtl = 14;
int BlinkerL = 15;
int BlinkerR = 16;
//////////Infrarot
#include <IRremote.h>
int receiverpin = 12;
unsigned long RED;
#define A 16736925  //vor
#define B 16754775  //zurück
#define X 16712445  //Stopp
#define C 16720605  //links
#define D 16761405  //rechts
#define E 5316027  //
#define F 2747854299
#define Y 3622325019
#define G 1386468383
#define H 553536955
#define I 16738455  //  0
#define J 16724175  //  1
#define K 16718055  //  2
#define L 16743045  //  3
#define M 16716015  //  4
#define N 16726215  //  5
#define O 16734885  //  6
#define P 16728765  //  7
#define Q 16730805  //  8
#define R 16732845  //  9
#define S 16750695  //  EQ
#define T 16756815  //  ST/REPT
#define U 16769565  //  FUNC/STOP
IRrecv irrecv(receiverpin);
decode_results results;
int Schluessel = 0;
//////////Linienverfolgung
#define LT1 digitalRead(10)
#define LT2 digitalRead(4)
#define LT3 digitalRead(2)

/*#define ENA 5
 #define ENB 11*/
#define IN1 6
#define IN2 7
#define IN3 8
#define IN4 9
#define ABS 115


///////////////////////void Lichter Frontlicht
void _FLichtON() {
 digitalWrite(FLichtr, HIGH);
 digitalWrite(FLichtl, HIGH);
}
void _FLichtOFF() {
 digitalWrite(FLichtr, LOW);
 digitalWrite(FLichtl, LOW);
}
///////////////////////void Lichter Rücklicht
void _RLichtON() {
 digitalWrite(RLichtr, HIGH);
 digitalWrite(RLichtl, HIGH);
}
void _RLichtOFF() {
 digitalWrite(RLichtr, LOW);
 digitalWrite(RLichtl, LOW);
}
///////////////////////Fernbedienung und Bluetooth Vorwärts
void _mForward()
{
 _RLichtOFF();
 digitalWrite(BlinkerR, LOW);
 digitalWrite(BlinkerL, LOW);
 digitalWrite(ENA, HIGH);
 digitalWrite(ENB, HIGH);
 digitalWrite(in1, HIGH); //digital output
 digitalWrite(in2, LOW);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 Serial.println("Forward");
}

///////////////////////Fernbedienung und Bluetooth Rückwärts
void _mBack()
{
 _RLichtON();
 digitalWrite(BlinkerR, LOW);
 digitalWrite(BlinkerL, LOW);
 digitalWrite(ENA, HIGH);
 digitalWrite(ENB, HIGH);
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 Serial.println("Back");
}

///////////////////////Fernbedienung und Bluetooth Links
void _mleft()
{
 _RLichtOFF();
 digitalWrite(BlinkerR, LOW);
 analogWrite(ENA, ABS);
 analogWrite(ENB, ABS);
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 digitalWrite(in3, HIGH);
 digitalWrite(in4, LOW);
 Serial.println("go left!");
 digitalWrite(BlinkerL, HIGH);
}

///////////////////////Fernbedienung und Bluetooth Rechts
void _mright()
{
 _RLichtOFF();
 digitalWrite(BlinkerL, LOW);
 analogWrite(ENA, ABS);
 analogWrite(ENB, ABS);
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 digitalWrite(in3, LOW);
 digitalWrite(in4, HIGH);
 Serial.println("go right!");
 digitalWrite(BlinkerR, HIGH);

}

///////////////////////für Linienverfolgung, Fernbedienung und Bluetooth Stopp
void _mStop()
{
 _RLichtOFF();
 digitalWrite(BlinkerR, LOW);
 digitalWrite(BlinkerL, LOW);
 digitalWrite(ENA, LOW);
 digitalWrite(ENB, LOW);
 Serial.println("Stop!");
}

///////////////////////Linienverfolgung Vorwärts
void forward() {
 analogWrite(ENA, ABS);
 analogWrite(ENB, ABS);
 digitalWrite(IN1, HIGH);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, HIGH);
 Serial.println("go forward!");
}

///////////////////////Linienverfolgung Rückwärts
void back() {
 analogWrite(ENA, ABS);
 analogWrite(ENB, ABS);
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, HIGH);
 digitalWrite(IN3, HIGH);
 digitalWrite(IN4, LOW);
 Serial.println("go back!");
}

///////////////////////Linienverfolgung Links
void left() {
 analogWrite(ENA, ABS);
 analogWrite(ENB, ABS);
 digitalWrite(IN1, HIGH);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, HIGH);
 digitalWrite(IN4, LOW);
 Serial.println("go left!");
}


///////////////////////Linienverfolgung rechts
void right() {
 analogWrite(ENA, ABS);
 analogWrite(ENB, ABS);
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, HIGH);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, HIGH);
 Serial.println("go right!");
}


///////////////////////void Bluetooth stateChange
void stateChange()
{
 state = !state;
 digitalWrite(LED, state);
}

///////////////////////void Bluetooth
void _Bluetooth() {
 getstr = Serial.read();
 if (getstr == 'f')
 {
   _mForward();
 }
 else if (getstr == 'b')
 {
   _mBack();
   delay(200);
 }
 else if (getstr == 'l')
 {
   _mleft();
   delay(200);
 }
 else if (getstr == 'r')
 {
   _mright();
   delay(200);
 }
 else if (getstr == 's')
 {
   _mStop();
 }
 else if (getstr == 'A')
 {
   stateChange();
 }
}

///////////////////////void Fernbedienung
void _infrarot() {
 if (RED == A)
 {
   _mForward();
 }
 else if (RED == B)
 {
   _mBack();
 }
 else if (RED == C)
 {
   _mleft();
 }
 else if (RED == D)
 {
   _mright();
 }
 else if (RED == E)
 {
   _mForward();
 }

 else if (RED == F)
 {
   _mBack();
 }
 else if (RED == G)
 {
   _mleft();
 }
 else if (RED == H)
 {
   _mright();
 }
 else if (RED == X)
 {
   _mStop();
 }
 else if (RED == Y)
 {
   _mStop();
 }
}



///////////////////////Linienverfolgung

void _Linienverfolgung() {
 if (LT2) {
   forward();
 }
 else if (LT1) {
   left();
   while (LT1);
 }
 else if (LT3) {
   right();
   while (LT3);
 }
}



///////////////////////////////////////////////////void SETUP
void setup()
{
 pinMode(LED, OUTPUT);
 Serial.begin(9600);
 pinMode(in1, OUTPUT);
 pinMode(in2, OUTPUT);
 pinMode(in3, OUTPUT);
 pinMode(in4, OUTPUT);
 pinMode(ENA, OUTPUT);
 pinMode(ENB, OUTPUT);
 pinMode(RLichtr, OUTPUT);
 pinMode(RLichtl, OUTPUT);
 pinMode(FLichtr, OUTPUT);
 pinMode(FLichtl, OUTPUT);
 pinMode(BlinkerL, OUTPUT);
 pinMode(BlinkerR, OUTPUT);
 pinMode(Echo, INPUT);
 pinMode(Trig, OUTPUT);
 pinMode(receiverpin, INPUT);
 _mStop();
 irrecv.enableIRIn();
}

///////////////////////////////////////////////////void LOOP
void loop()
{


 /////////////Fotodiode
 sensorWert = analogRead(eingang);
 Serial.print("Sensorwert = " );
 Serial.println(sensorWert);

 if (sensorWert < 21 )
 {
   _FLichtON();
 }
 else
 {
   _FLichtOFF();
 }
 /////////////Fernbedienung Master

 if (irrecv.decode(&results))
 {
   RED = results.value;
   Serial.println(RED);
   irrecv.resume();
   delay(150);
   if (RED == I)
   {
     Schluessel = 1;
   }
   else if (RED == J)
   {
     Schluessel = 2;
   }
   else if (RED == K)
   {
     Schluessel = 3;

   }
   else if (RED == L)
   {
     Serial.println("L");
   }
 }
 /////////////Fernbedienung Slave

 /////////////Bluetooth Slave
 if (Schluessel == 1) {
   _Bluetooth();
   Serial.println("Bluetooth gestartet");
 }
 /////////////Fernbedienung
 if (Schluessel == 2) {
   _infrarot();
   Serial.println("Bluetooth gestartet");
 }

 /////////////Linien verfolgung
 if (Schluessel == 3) {
   _Linienverfolgung();
   Serial.println("Bluetooth gestartet");
 }
}

Den ganzen Code zu posten ist zwar sehr löblich, aber grundsätzliche Fragen klären sich besser an grundsätzlichem, finde ich.

Schön, dass du einen Helligkeitssensor hast, mit dem du die Fahrzeugbeleuchtung steuerst. Aber das hat mit deiner Frage nichts zu tun, stimmts?

Du verwendest schon einige Funktionen, sehr schön. Wenn du zusätzlich zu diesen lowLevel Funktionen noch highLevel Funktionen erfindest, wird loop deutlich übersichtlicher.

z.B. so

byte aktuellesProgramm; // 0 : noch nichts, sonst 1 .. 3
void loop() {
  unsigned long irCmd = liesFB();  // liefert 0, wenn keine Taste gedrückt wurde, sonst 1 ... 3 bei Programmwechsel
                                  // oder den Code einer anderen Taste ( Pfeil etc. ) 
  if (irCmd > 0 && irCmd <= 3) aktuellesProgramm = irCmd;

  switch (aktuellesProgramm) {
   case 1: doBluetooth(); break;
   case 2: prog2(irCmd); break; // wertet andere FB - Tasten aus
   case 3: linie(); break;   // braucht keine weiteren FB - Tasten
   default: break;  // noch nichts gewählt
  }
}

Das verlegt dein Problem in die zu schreibenden Funktionen und macht loop übersichtlich

Ob es gut ist, dass mein liesFB() entweder den decodierten Schlüssel ( 1…3 ) oder einen TastenCode wie dein RED zurückliefert, ist sicher Geschmacksfrage.

Ob es sicher (und sinnvoll) ist, in deiner linienverfolgung while-Schleifen einzubauen, ist auch fraglich.
Man könnte doch genausogut auch loop neu durchlaufen lassen und könnte dann zur Not per FB wieder auf Handsteuerung übernehmen.

Was ist jetzt genau dein eigentliches Problem? Eigentlich ist dein Sketch doch ziemlich ähnlich, soweit ich ihn verstanden habe.

Dankeschön für die schnelle Hilfe. Ich bin mir zwar nicht sicher, welcher der super Ratschlägen geholfen hat, aber einer davon hat bewirkt, dass genau das funktioniert was ich eigentlich wollte.

Ich werde das ganze nochmal Stück für Stück durchspielen, und dann die gefundene Schwachstelle hier posten.

Herzlichen Dank für die Hilfe.

KBLc