Bluetooth Verbindung Android/ Arduino

Hallo zusammen,

ich habe mich stück für stück in die Arduino Welt eingewühlt und bin zu dem Punkt gekommen das ich eine Verbindung zwichen meinem Android Smartphone und dem Arduino via Bluetooth hinbekomme. Das ganze habe ich über ein Tutorial geschafft: http://www.instructables.com/id/Android-talks-to-Arduino/

Nun zu meinem Ziel des ganzen.
Ich möchte im ersten Schritt eine RGB Led an den Arduino schließen und via Smartphone ansteuern.
Die Befehle werden vom Smarphone aus via "Bluetoothchat" an den Arduino gesendet.
Das funktioniert auch soweit. Ich bekomme den Text den ich sende im Arduino angezeigt, als datentyp ahbe ich dafür char genommen.

Jetzt möchte ich gerne wenn von meinen Smartphone der text kommt "Blau ein" einen Output Pin auf high setzen.
Wenn ich "Blau aus" schreibe soll es wieder auf low gehen.... usw für 3 Farben.
Jedoch bekomme ich keinen ordentlichen Vergleich hin.
Könnte mir da jem. helfen?
im Code an der Stelle : char MasterString = (char)blue.read();
Serial.print(MasterString);
lese ich die chat message ein, danach gebe ich sie mir zur kontrolle kurz aus. Hiernach müsste irgendwie mein vergleich rein.??

#include <NewSoftSerial.h>
NewSoftSerial blue(2, 3); // (RX, TX)


// Beispiel Kram ->

int const chatInterval = 30000; // after 30 seconds, send a message to the connected Android device.
int numberOfTimesToSend = 2; // the number of times to send the message (spaced out by number of chatInterval above)
int lastChatSendTime = 0; //the last time - in millis() - that we sent a message to the Droid
String chatMessage = "Hello from Arduino"; // change this to anything you want to send to the Android device
int chatSendCounter = 0; //the number of times we've sent the message

char MasterString;
char test;

// **************** end section on sending messages from Arduino to the Android device

void setup()
{
  blue.begin(57600);
  Serial.begin (9600);
  
  lastChatSendTime = millis(); 
 
}

void loop()
{
  // Nachrricht holen
  if (blue.available()) 
   {
  
     char MasterString = (char)blue.read();
     Serial.print(MasterString);

          if ( MasterString == test)
  
                 {
                  Serial.print("Blau ist An");
                 }
 
 }
   // Beispiel Kram ->
   
   
   
   //*************sending a message from Arduino to Android *************************   
   if (((millis() - lastChatSendTime) > chatInterval) && (chatSendCounter < numberOfTimesToSend)) 
   //send a predefined message to the Android device after 'chatInterval' seconds and do this 'numberOfTimesToSend' times.
    {
      lastChatSendTime = millis();  
      chatSendCounter++; //increment chat counter
      blue.print(chatMessage); //print out the message on the NewSoftSerial serial port which then travels via Bluetooth to the Android device   
      
  }

}

Dein MasterString ist momentan genau ein Zeichen gross. Klar kannst Du damit auch Wort-Befehle interpretieren, aber das endet dann in einer verschachtelten IF-Wüste. Als erstes würde ich mal einen Befehl-Trenner definieren. Wenn es möglichst Worte sein sollen, wäre LF (ASCII 0x0A) angebracht. Mit diesem Zeichen beginnt dann immer ein neuer Befehl. Also liest Du ein bis dieses Zeichen erkannt wurde. Dann füllst Du Deinen Befehlspuffer mit Zeichen bis dieser entweder überläuft oder wieder ein LF erkannt wurde. Ist dies der Fall, kannst Du mit der strncmp()-Funktion überprüfen, ob ein von Dir definierter Befehl erkannt wurde.

Ah, okay.

Also "strncmp" habe ich auch schon öfters gelesen, scheint ein String vergleicher zu sein?
Hättest du ein beispiel für die Trennung? Kann mir das gerade garnicht vostellen wie es gemeint ist, so etwas : "readStringUntil(xxxx)" für xxxx würde ich eine Zahl definieren und er liest mir dann nur diese anzahl an Buchstaben raus?
Grundlegend würde es doch auch helfen wenn ich die Befehle mal definieren würde was die länge und Anzahl der Wörter angeht?
z.B. Stelle ich mir diesen Befehl vor " Blau ein, "Blau aus" und das dann mit beliebigen Farben, wobei die Zeichenlänge halt insgesammt IMMER 8 wären, daran müsste ich mich dann halten.
Ich könnte mir vorstellen das, dass bei der Auswertung sehr hilfreich wäre?
Sorry mit bit übergreifenden Datentypen habe ich nicht wirklich Erfahrung :~

Also "strncmp" habe ich auch schon öfters gelesen, scheint ein String vergleicher zu sein?

http://www.cplusplus.com/reference/clibrary/cstring/strncmp/

Hättest du ein beispiel für die Trennung?

In etwa so könnte eine Leseroutine aussehen:

uint8_t readLine(char *buffer, uint8_t size) {
  uint8_t pos = 0;
  if (size == 0) return size;
  do {
    while (! Serial.available());
    buffer[pos++] = Serial.read();
  } while (pos < size && buffer[pos-1] != 0x0A);
  return pos;
}

Sorry mit bit übergreifenden Datentypen habe ich nicht wirklich Erfahrung

Das wird aber schwer, denn schon ein Byte ist bit-übergreifend... :slight_smile:

Ich möchte im ersten Schritt eine RGB Led an den Arduino schließen und via Smartphone ansteuern.
Die Befehle werden vom Smarphone aus via "Bluetoothchat" an den Arduino gesendet.
Das funktioniert auch soweit. Ich bekomme den Text den ich sende im Arduino angezeigt, als datentyp ahbe ich dafür char genommen.

Im ersten Schritt...
... würde ich es mir einfach machen, mit 1 char - Befehlen:
z.B, jedes 'R' schaltet den Rot Pin ein, jedes 'r' den Rot Pin wieder aus. usw.
Alles andere wird ignoriert ( oder nur wie bisher angezeigt )

Dann hast du schnell ein erstes Erfolgserlebnis, und kommst schneller dazu, dir zu überlegen, wie du den Farbton genau einstellen willst.
Mit einem Text wie "mehr Aubergine bitte" von Deinem Handy wirst du deinen Arduino , bzw. deinen Sketch, sicher überfordern :wink:

@ Pylon, Vielen Dank das werde ich wohl mal Probieren! mit dem Tipp von Michael.

Vielen Dank euch beiden, ich teste da jetzt mal ein bisschen aus !