Blinkgeschwindigkeit eier Led ändern über Bluetooth

Hey ich bin relativ neu in Sachen Arduino, derzeit experimentiere ich mit einem HC06Bluetooth Module und dem MIT APP INventor

ich möchte gerne eine App schreiben mit der ich die blinkgeschwindigkeit einer Led in drei oder mehr verschiedene geschwindigkeiten regulieren kann
mein code sieht bislang so aus :

int ledPin = 13;

int i;
int var;
int zeitpunkt;

void setup() {

Serial.begin(9600);
pinMode(ledPin, OUTPUT);

}

void loop() {

while (Serial.available()) {
delay(3);
char c = Serial.read();
readString += c;
}

if (readString.length() >0) {
Serial.println(readString);

if (readString == "zeiteins")
{

zeitpunkt = 200;
}
if (readString == "zeitzwei")
{

zeitpunkt = 500;
}
if (readString == "zeitdrei")
{

zeitpunkt =
1000;
}

if (readString == "on")
{

an ();
}

if (readString == "blinkenan")
{

blinken ();
}

if (readString == "blinkenaus")
{
aus ();
}

readString="";
}
}
void an (){

digitalWrite(ledPin, HIGH);

}
void aus(){
digitalWrite(ledPin, LOW);

}

void blinken (){
for(int i = 0; i < 50; i++){
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)

delay(zeitpunkt);

digitalWrite(ledPin, LOW); // turn the LED off by making the voltage LOW
delay(zeitpunkt); // wait for a second}
}}

Die Led geht an und aus ohne Probleme wenn die App inbentor App die entsprechenden Worte sendet aber das Blinken will nicht funktionieren

Was mach ich falsch ?

Die Einlese-Routine ist nicht gut. Am einfachsten geht es wenn man den String beim Senden mit einem Linefeed abschließt. Dann liest man alles ein bis zum LF und vergleicht dann. Aber auch nur wenn ein Zeichen da ist. Und wenn nicht hat man Zeit andere Dinge zu tun.
So weißt du immer wann der String zu Ende ist und musst das nicht über die Zeit machen.

Siehe die erste Version hier:
http://forum.arduino.cc/index.php?topic=361111.msg2494595#msg2494595

Da machst du SERIAL_BUFFER_SIZE größer, z.B. 16 oder 20. 5 wie in den Beispiel sind bei dir zu wenig!

Und die Auswertung so:

void loop()
{
  if (readSerial(Serial) == true)
  {
     if(strcmp(serialBuffer, "blinkenan") == 0)
     {
     }
     else if(strcmp(serialBuffer, "blinkenaus") == 0)
     {
     }
  }
}

Arrays kann man nicht mit == vergleichen! Also strcmp() (string compare) nehmen. Das liefert bei Gleichheit 0.

Das Blinken solltest du nicht-blockierend schreiben (ohne delay), damit man zu jedem Zeitpunkt Text empfangen kann! Sonst reagiert der Arduino während dem Blinken auf nichts.

Vielen Dank für die Rasche antwort ich habe den code aus deinen Beispielen genommen undso zusammengefügt:

const int SERIAL_BUFFER_SIZE = 16;
char serialBuffer[SERIAL_BUFFER_SIZE];

void setup()
{
Serial.begin(9600);

}

void loop()
{

if (readSerial(Serial) == true)
{
if(strcmp(serialBuffer, "blinkenan") == 0)
{
}
else if(strcmp(serialBuffer, "blinkenaus") == 0)
{
}
}
}

aber was ist "readSerial" in meinem code gibt es diese Variable nicht und bei obigen bispiel kommt beim compilieren der fehler:

sketch_jan17a.ino: In function 'void loop()':
sketch_jan17a:14: error: 'readSerial' was not declared in this scope

ich hab probiert eine globale variable namens readSerial zu erstellen aber das hat nicht funktioniert
tut mir leid falls die frage dumm erscheint aber ich in wirklich noch ein ziemlicher anfänger

readSerial() ist eine Funktion. Wieso hast du die nicht dazu kopiert?

bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if (c == '\n' && index > 0)
    {
      serialBuffer[index] = '\0';
      index = 0;
      return true;
    }
  }
  return false;
}

Danke, ich hab ehrlich gesagt keine Ahnung wie ich vergessen konnte die dazuzukopieren :confused:

Ich wollte jetzt diesen code ausprobieren aber es tut sich leider nichts auf dem arduino, bzw die RX TX lämpchen leuchten nicht, das heiist doch das er nichts empfängt/sendet oder ?

const int SERIAL_BUFFER_SIZE = 16;
char serialBuffer[SERIAL_BUFFER_SIZE];
int ledPin = 13;

void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);

}

void loop()
{

if (readSerial(Serial) == true)
{
if(strcmp(serialBuffer, "on") == 0)
{
digitalWrite(ledPin, HIGH);
}
else if(strcmp(serialBuffer, "off") == 0)
{
digitalWrite(ledPin, LOW);
}
}
}

bool readSerial(Stream& stream)
{
static byte index;

while (stream.available())
{
char c = stream.read();

if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
{
serialBuffer[index++] = c;
}
else if (c == '\n' && index > 0)
{
serialBuffer[index] = '\0';
index = 0;
return true;
}
}
return false;
}

Sendest du auch ein LF am Ende? Wahrscheinlich nicht

Du musst bei deiner App sowas senden:
"on\n"
"off\n"

Oder eine Methode wählen die das automatisch macht. Wie println() auf dem Arduino.

Und Code bitte in Code-Tags! Dazu den </> Knopf anklicken.

doch das \n sende ich mit, allerdings direkt aus der AppInventor App alsovon dort einfach die Message:

on\n

hab mich allerdings geirrt weil dir RX/TX leuchten nicht geleuchtet haben, die Led wird geschaltet aber das On/Off schalten funktioniert immer nur mit einem delay von ca 10 sekunden also erst 10 sekunden nachdem ich die Led auf on geschalten hab kann ich sie vom Handy aus wieder ausschalten, befehle davor werden vom Arduino ignoriert
kann das am Arduino Code liegen oder eher an App Inventor ?
Bei dem anderen sketch hat es sofort geschalten

Das muss auch sofort gehen. Der Code würde auch noch mit 500.000 Baud mit mehr Daten funktionieren

Hast du den Arduino nach dem Programmieren noch an USB hängen? Serial ist eigentlich die USB Schnittstelle. Wenn du daran als BT hängst, musst du USB abstöpseln. Sonst stören die sich gegenseitig.

Abhilfe kann es es schaffen wenn du dir mit AltSoftSerial eine serielle Schnittstelle in Software emulierst:
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html
Die ist dann auf dem UNO Pins 8 und 9 (siehe Tabelle)

Ansonsten lass mal das BT Modul weg und öffne den Serial Monitor. Da kannst du auch deine Kommandos eintippen. Und unten rechts einstellen dass ein "newline" am Ende gesendet wird. So siehst du was der Arduino alleine macht. Wenn das geht kannst du deine App programmieren.