Bluetooth Empfänger liest falsche Werte

Ich versuche gerade eine Zimmerbeleuchtung durch ein 5m langes LED-Band umzusetzen.
Diese will ich mit meinem Handy über Bluetooth kontrollieren können.

Das Programm funktioniert eigentlich, zumindest unter geringer Belastung des Arduino Micro. Edit: Nano
Zu Problemen kommt es hauptsächlich, wenn ich den Arduino fast oder vollständig auslaste, z.B. wenn ich eine Schlange so schnell wie möglich das Band entlanglaufen lasse.
Denn dann liest der Empfänger oft falsche (ich sende eine '1', es kommt z.B. ')' beim Arduino an) oder gar keine Werte. Nach einigen Versuchen werden dann aber doch richtige Werte gelesen.

In der loop() wird abgefragt, ob neue Daten über Bluetooth vorhanden sind und geht wenn ja in meine blt() funktion, die weitere Eingaben erwartet und meine Einstellungen verändert. Nach jedem empfangenen Wert wird der Input-Buffer von Bluetooth über rewindBt() geleert.
(btw. gibt es eigentlich eine Funktion wie rewind() bei C?).

Ich weiß, dass ein delay(30) im loop() mein Problem lösen würde, jedoch will ich die angeschalteten LED's so schnell wie möglich über das LED-Band laufen lassen.

Vielen Dank fürs Durchlesen und möglicherweise Eure Hilfe

Mein Quellcode ist im Anhang, da er zu lang zum Einbinden ist (Funktionen zu Bluetooth sind ganz unten)

Led_Strip_2.0.ino (12.6 KB)

Hallo,

also 2 Sachen fallen mir da auf ......

if(bt.peek()!=-1){
short val = bt.peek();
dataVal=val-48;
if(dataVal>=1 && dataVal<=4) blt();
else rewindBt();
}

?????? Was ist das. Was willst du damit erreichen.

Und die Delay müssen weg. Suche dir einen Weg das anders zu lösen.

Ich habe dir mal meinen Serial-BT-Reciver angehängt der benutzt kein Delay. Nur als Anschaung.

//
// Code by tft-elektronik.com
//
// Reciver, um Daten direkt weiterzuleiten.
// 1 * Hardware Serial / 1 * SoftSerial für BlueTooth
// Mich Echo Funktion

// Konstanten

#define PIN_RECEIVE         11   // dieser Pin muss Interupt fähig sein
#define PIN_SEND            12

#define SPEED_BLUETOOTH     57600    // diese geschwindigkeit muss im BlueThoot Modul eingestellt sein
#define SPEED_SERIAL        57600

#define LED_Pin             13

#include <Wire.h>
#include <SoftwareSerial.h>

unsigned long Mill   = millis()   ;

unsigned long BlinkTimer   = 0   ;
long          BlinkInterval = 500 ;
byte          BlinkStatus = 0 ;

int i = 0 ;
char thisSerialChar = 0 ;
char thisBlueSerialChar = 0 ;

SoftwareSerial BlueSerial(PIN_RECEIVE, PIN_SEND);

void setup() {
  
  // put your setup code here, to run once:
  pinMode(LED_Pin, OUTPUT) ;
  
  Serial.begin(SPEED_SERIAL);
  BlueSerial.begin(SPEED_BLUETOOTH);

  // Serial gibt nicht den Status der Verbindung wieder, Sondern ob eine
  // Schnitstelle von seiten des Arduino bereit ist. Beim Leonardo ist
  // dies nach einem Reset nicht sofort da.

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
}

void loop() {
  // put your main code here, to run repeatedly:
  Mill = millis();

  // Damit man sieht ob das Programm läuft
  if (BlinkTimer<Mill) {
    BlinkTimer = Mill + BlinkInterval ;
    if (BlinkStatus == 0) {
      BlinkStatus = 1 ;
      digitalWrite(LED_Pin,HIGH);
    }
    else {
      BlinkStatus = 0 ;
      digitalWrite(LED_Pin,LOW);     
    }
    
  }

  // Daten von der Serialen Hardware Schnitstelle holen und an die BlueTooth Schnitstelle senden
  if (Serial.available()) {
    i = Serial.available() ;
    while (i > 0)
    {
      thisSerialChar = Serial.read() ;
      BlueSerial.write(thisSerialChar);
      Serial.write(thisSerialChar); // Echo
      i = Serial.available() ;
    }
  }
  
  // Daten von der BlueTooth Schnitstelle holen und an die Seriale Schnitstelle senden  
  if (BlueSerial.available()) {
    i = BlueSerial.available() ;
    while (i > 0)
    {
      thisBlueSerialChar = BlueSerial.read() ;
      Serial.write(thisBlueSerialChar);
      BlueSerial.write(thisBlueSerialChar); // Echo
      i = BlueSerial.available() ;
    }
  }
}

Warum benutzt du Softwareserial?
Wenn du Performance Probleme hast, solltest du das evtl. nicht tun.

The Arduino Leonardo board uses Serial1 to communicate via TTL (5V) serial on pins 0 (RX) and 1 (TX). Serial is reserved for USB CDC communication. For more information, refer to the Leonardo getting started page and hardware page.

Quelle

Sry, das ist eine Speicherung vorher, um auszuprobieren, ob es mit peek()!=-1 (leer) funktionert, kam aber zum selben Ergebnis. Jetzt heißt es:

if(bt.available()){
dataVal=bt.peek()-48;
if(dataVal>=1 && dataVal<=4) blt();
else rewindBt();
}

dataVal ist eine globale Variable die die letzte gesendete Zahl enthält (0 entspricht ja 48).
Danach überprüfe ich, ob die Variable einer brauchbaren Zahl entspricht (Menü geht von Option 1 bis 4), wenn sie brauchbar ist werden weitere Menüs aufgerufen.
Wenn sie nicht brauchbar ist, so wird bt geleert.

Ich verwende im Moment ja auch keine Delays, sondern überprüfe jede loop ob

  1. etwas gezeichnet werden muss
  2. Daten über Bluetooth verfügbar sind
    Nur ist es so dass delay mein Problem lösen würde, da der Arduino dann ja nicht mehr voll ausgelastet ist.

Welche Möglichkeiten gibt es noch außer Software Serial?

Welche Möglichkeiten gibt es noch außer Software Serial?

HardwareSerial

baechlju:
Welche Möglichkeiten gibt es noch außer Software Serial?

Anscheinend verwendest du einen Arduino Micro:

baechlju:
Das Programm funktioniert eigentlich, zumindest unter geringer Belastung des Arduino Micro.

Dieser hat neben "Serial" auch noch "Serial1", wie combie das in #2 und #4 ja schon angedeutet hat - was für den Arduino Leonardo gilt, gilt auch für den Arduino Micro - das sind dieselben Mikrocontroller, nur die Boards haben andere Abmessungen.

Also: du solltest Serial1 statt SoftwareSerial verwenden.

Es handelt sich dummerweise um einen Arduino Nano.
Da hab ich zu leichtfertig Arduino Micro geschrieben.

Könnte mich gerade voll über mich selbst aufregen.
Tut mir echt leid. :-[

Hi

Voll ausgelastet ist der µC auch beim delay() - nur, daß Er Da im Kreis in einer While-Schleife auf das Ende der Wartezeit ... äh ... wartet.
Ist also nicht so, daß der µC jetzt 'Freizeit' hat und mit Freude die neuen Aufgaben entgegen nimmt - NICHTS kann der µC nicht, dafür müsstest Du Ihn schon schlafen legen - hilft Dir hier aber auch nicht wirklich weiter :wink:

MfG

baechlju:
Es handelt sich dummerweise um einen Arduino Nano.

Tja...
So ist das Leben manchmal...

:o Aber vielleicht ist das ja ein Grund für dich, einen Micro anzuschaffen.. :o

Auch ein Mega hat mehrere Serielle...

Ich habe es jetzt mit (Hardware) Serial ausprobiert und tatsächlich funktioniert es fehlerfrei :D.
Hätte ich auch gleich drauf kommen können xD.

Auf jeden Fall vielen, vielen Dank :))

Edit: Problem war also im Grunde, dass ich mich keine 5min. mit dem Thema Serial Port/Serial auseinander gesetzt habe sonder von Beispielprogrammen übernommen habe.