WS2812B mit Handy über ein hc-05 bluetooth modul steuern

Hallo,
ich versuche einen LED-Streifen (WS2812B) mit Hilfe des Bluetooth Modul HC-05 zu steuern.
Die Kommunikation zwischen Handy-App und Seriellen Monitor funktioniert, allerdings kann ich den LED-Streifen nur einmal am Anfang ein- oder ausschalten. Vorher darf keine andere Nachricht verschickt worden sein. Wenn ich den LED-Streifen dann als nächstes wieder ausschalten möchte, funktioniert das nicht und ich bekomme die Rüchmeldung "LED turned on" drei mal auf mein Handy zurück.
ich habe gelesen, dass die Kommunikation per Bluetooth relativ langsam ist und das Programm in der Zeit weiterläuft. Könnte das das Problem sein?

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <FastLED.h>

#define DATA_PIN 2
#define NUM_LEDS 9
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define VOLTS 5
#define MAX_MA 50
CRGB leds[NUM_LEDS];

const byte rxPin = 10;
const byte txPin = 11;
SoftwareSerial BTSerial(rxPin, txPin);

String messageBuffer = "";
String message = "";

bool messageErhalten = false;
bool LichtGeschaltet = false;

void setup() 
{
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  //define pin modes for tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  BTSerial.begin(9600);
  Serial.begin(38400); //38400 für hc-05
}

void loop() 
{
  erhalteMessage();
  schalteLicht();
}

void erhalteMessage()
{
  if (BTSerial.available() > 0)
  {
    char data = (char) BTSerial.read();
    messageBuffer += data;
    if (data == ';')
    {
      message = messageBuffer;
      messageBuffer = "";
      Serial.println(message); //send to serial monitor
    }
    messageErhalten = true;
  }
  else
  {
    messageErhalten = false;
  }
  delay(1000);
}

void schalteLicht()
{
  if (messageErhalten == true)
  {
    if (message == "on;")
    {
      leds[0] = CRGB::AntiqueWhite;
      leds[1] = CRGB::AntiqueWhite;
      leds[2] = CRGB::AntiqueWhite;
      leds[3] = CRGB::AntiqueWhite;
      leds[4] = CRGB::AntiqueWhite;
      leds[5] = CRGB::AntiqueWhite;
      leds[6] = CRGB::AntiqueWhite;
      leds[7] = CRGB::AntiqueWhite;
      leds[8] = CRGB::AntiqueWhite;
      FastLED.show();
      BTSerial.println("LED turned on");
    }
    if (message == "off;")
    {
      leds[0] = CRGB::Black;
      leds[1] = CRGB::Black;
      leds[2] = CRGB::Black;
      leds[3] = CRGB::Black;
      leds[4] = CRGB::Black;
      leds[5] = CRGB::Black;
      leds[6] = CRGB::Black;
      leds[7] = CRGB::Black;
      leds[8] = CRGB::Black;
      leds[9] = CRGB::Black;
      FastLED.show();
      BTSerial.println("LED turned off");
    }
  }
}

Serial ist reserviert für den Seriellen Monitor.

Kommunikation und delay vertragen sich nicht miteinander

Was heißt das genau? Ich habe auch mal ein Programm ausprobiert, um nur über das Handy mit dem seriellen Monitor zu kommunizieren (also ohne leds zu schalten). Das hat mit den einstellungen gut funktioniert.

Den delay hab ich nur zum testen eingefügt. Ohne habe ich das selbe problem.

void erhalteMessage() {
  messageErhalten = false;
  if (BTSerial.available() > 0) {
    char data = (char) BTSerial.read();
	switch (data){
	  '\n' : 
	    // nix
		break;
	  '\r' : 
	    // nix
		break;	
	  ';': 
        message = messageBuffer;
        messageBuffer = "";
        Serial.println(message); //send to serial monitor	  
	    messageErhalten = true;
		break;
	  default:
        messageBuffer += data;	  
	}    
  }
}

void schalteLicht()
{
  if (messageErhalten == true)
  {
    if (message == "on")
    {
      leds[0] = CRGB::AntiqueWhite;
      leds[1] = CRGB::AntiqueWhite;
      leds[2] = CRGB::AntiqueWhite;
      leds[3] = CRGB::AntiqueWhite;
      leds[4] = CRGB::AntiqueWhite;
      leds[5] = CRGB::AntiqueWhite;
      leds[6] = CRGB::AntiqueWhite;
      leds[7] = CRGB::AntiqueWhite;
      leds[8] = CRGB::AntiqueWhite;
      FastLED.show();
      BTSerial.println("LED turned on");
    }
    if (message == "off")
    {
      leds[0] = CRGB::Black;
      leds[1] = CRGB::Black;
      leds[2] = CRGB::Black;
      leds[3] = CRGB::Black;
      leds[4] = CRGB::Black;
      leds[5] = CRGB::Black;
      leds[6] = CRGB::Black;
      leds[7] = CRGB::Black;
      leds[8] = CRGB::Black;
      leds[9] = CRGB::Black;
      FastLED.show();
      BTSerial.println("LED turned off");
    }
  }
}

Die hast Du wohl verwechselt, besser so:

  Serial.begin(9600);
  BTSerial.begin(38400); //38400 für hc-05

Vielen Dank wwerner, deine Lösung funktioniert.

Gerne, weist du auch, was du falsch gemacht hast?

Und markiere Post 4 noch als Lösung

Ne warum mein Programm nicht funktioniert hat ist mir noch nicht klar. Was war denn der Fehler?

Beim Senden werden noch Zeilenumbrüche mit gesendet. Die hast du in deiner Auswertung nicht berücksichtigt. Daher ging immer nur der erste Befehl.

Ok Dankeschön

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.