Bluetooth To LCD, Fragen und Probleme

Ich experimentiere gerade mit einem HC-06 Bluetoothmodul herum. Zunächst geht es mir noch nicht darum, konkrete Anwendungen umzusetzen, ich will erstmal grundsätzliches Verständnis aufbauen.

Dafür habe ich ein LC-Display angeschlossen und möchte mit der Smartphone-App “Ardudroid” einzelne Zeichnen an den Arduino senden, der das dann auf dem LCD darstellen soll.

Pro Schleifendurchlauf lese ich ein Zeichen aus dem Arduino Serialbuffer aus. Wenn ich mit ArduDroid ein “e” sende, scheint es so, dass er nicht nur das das Zeichen “e” sendet, sondern noch jede Menge Inofs mit, die dort auf dem Display erscheint. Kann mir jemand sagen, was das soll? Andere Fertig-Arduino-Bluetooth-Apps scheinen diese Funktionalität nicht zu haben und schicken einfach nur ein einzelnes Zeichen.

Ein weiteres Problem ergibt sich, wenn ich mit einer anderen Bluetooth-App arbeite, die lediglich das eine beabsichtigte Zeichen sendet. Mein Code soll einfach jeden Schleifendurchlauf gucken, ob ein Zeichen im Serial.Buffer steckt, dass dann ggf. auslesen und auf das LC-display drucken. Den Cursor bzw. die Zeile für das Display setze ich manuell mit Variablen i und d (dass das nicht wirklich notwendig ist, ist mir klar, aber sollte auch nicht zum Problem führen). Das Problem ist, dass es pures Glück zu sein scheint, ob auf dem Display meine per Handy gesendeten Zeichen ankommen, oder irgendwelche anderen Zeichen, wie z.B. Summenzeichen, oder andere Sonderzeichen. Mal klappt es und wenn ich dann manchmal nur eine Leerzeile in meinen Code ändere und den Code auf den Arduino spiele, klappt es nicht mehr und es kommt nur Müll an. Also es kommt schon noch ein Zeichen auf dem Display an, wenn ich ein Zeichen sende. Es ist nur ein vollkommen anderes. Oft nicht mal ein Buchstabe, sondern irgendwelche Sonderzeichen. Hat jemand eine Idee, woran das liegen könnte?

Hier mein Code:

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

//Globals 
int i; //Cursor-Variable
int d; //Zeilen-
 
void setup() {
  Serial.begin(9600);
  Serial.flush();
  pinMode(13, OUTPUT);
  lcd.begin(16, 2);
  i = 0;
  d = 0;
}
 
void loop()
{
  Serial.flush();
 
  if (Serial.available() > 0)
  {
     lcd.write(Serial.read());
     i++;
  }

   if(i>16)
    {
       d=1;
       i=0;
    }
    
    if(d>0 && i>16)
    {
      d=0;
      i=0;
    }
    
    
  lcd.setCursor(i, d);
  delay(20);
}

Der Ansatz mit dem Code scheint mir schon falsch zu sein. Desweiteren gehst du nicht darauf ein, was dein Smartphone Terminal schickt. Wird \r\n bzw. \n jedes mal mitgesendet?

Welcher Teil, denkst Du, ist falsch?

Wie gesagt, ab und zu funktioniert es ja aus irgendeinem Grund mal.

Was der Terminal sendet, frage ich mich auch. Deswegen wollte ich mir ja jedes ankommende Zeichen mal auf ein Display schicken. Bei “Ardudroid” kommt ungefähr etwas wie “#|10|99|99|ZEICHEN*” an, wobei “ZEICHEN” für das von mir gesendete Zeichen steht.

Ich glaube nicht, dass “\r” oder “\n” mitgesendet werden, da die ja eigentlich vom LC-Display nicht als Steuerungszeichen interpretiert werden würden (Oder?) und mitgedruckt werden müssten.

Aber ich weiß es nicht genau. Gerade um heraus zu bekommen, was die Apps senden, wollte ich mir ja alles aufs Display ausgeben lassen.

Warum siehst du dir den Buffer nicht mal im Serial-Monitor an?

Das müsste funktioniert, wenn ich die Zeile

 lcd.write(Serial.read());

durch

 Serial.write(Serial.read());

ersetze, oder?

Werde ich nachher mal ausprobieren.

Schreibe ich mir damit nicht selber wieder in den eigenen SerialBuffer?

ElZoido: Das müsste funktioniert, wenn ich die Zeile

 lcd.write(Serial.read());

durch

 Serial.write(Serial.read());

ersetze, oder?

Werde ich nachher mal ausprobieren.

Schreibe ich mir damit nicht selber wieder in den eigenen SerialBuffer?

Nein, das machst du so:

Pack die Zeile dahin, wo du lesen möchtest und tausche "DeinenBuffer" gegen die Variable.

Serial.println(DeinenBuffer);

Entweder habe ich ein kleines Verständnis Problem, oder sehe nur einen Minimalen Unterschied

Serial.println(Serial.read());

Müsste doch genau das tun? Meinem Verständnis nach, lese ich mit Serial.read() ein Byte aus dem Buffer.

Ja, die Funktion ist ähnlich.

Ich glaube die unterscheidet sich in der Darstellung am Monitor. ASCII oder direkt die eingegebenen Zeichen.

wird das BT Modul nicht seriell angeschlossen? Dann solltest du das über 2 verschiedene Schnittsyellen machen.

Stichwort Softserial, und vergiss das available() nicht.

ElZoido: Entweder habe ich ein kleines Verständnis Problem, oder sehe nur einen Minimalen Unterschied

Serial.println(Serial.read());

Müsste doch genau das tun? Meinem Verständnis nach, lese ich mit Serial.read() ein Byte aus dem Buffer.

Um 1:1 das zu senden was du empfängst machst du besser

if ( Serial.available() ) Serial.write(Serial.read()) ;

Serial.read liefert ein int ( um mit -1 zu signalisieren, dass nichts da war ) Serial.print(int) gibt die Dezimal-Darsetllung einer Zahl aus. Serial.write(int) wandelt nicht, sondern gibt das Zeichen so aus, wie es ist.

Ausserdem: Willst du dorthin senden, von wo du es empfangen hast? oder an eine andere Schnittstelle ?

michael_x: Ausserdem: Willst du dorthin senden, von wo du es empfangen hast? oder an eine andere Schnittstelle ?

Das meinte ich ja. Gehen täte es schon, über die gleiche Schnittstelle wieder raus, wenn man den Tx an den Rx eines USB-Seriell Wandlers anschliesst. Notfalls sogar über den USB-Port vom Arduino. Aber einfacher zu verstehen: mit Mega2560 oder Softserial über 2 Schnittstellen

ElEspanol:
wird das BT Modul nicht seriell angeschlossen? Dann solltest du das über 2 verschiedene Schnittsyellen machen.

Stichwort Softserial, und vergiss das available() nicht.

Das BT Modul ist an TX-RX angeschlossen. Damit hängt ja eigentlich der Serial.Out mit dem BT-Modul zusammen, scheint aber irgendwie zu funktionieren.

Das Problem scheint irgendwie am LC-Display zu liegen. Ich habe mittlerweile mal unten stehenden Experimentiercode aufgespielt. Mal kommt auf dem Display, was ich erwarte und mal nicht, sondern nur irgendwelche Zeichen, teilweise auch kyrillisch, oder Leerzeichen. Auf dem Serialmonitor erscheinen aber die erwarteten Buchstaben und Zahlen. Wird der Code leicht geändert (also ohne, dass die eigentliche Funktionalität sich ändert) klappt es auch mal. Es scheint reiner Zufall zu sein. Was ja eigentlich nicht sein kann.

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

//Globals 
int i;
int d;
 
void setup() {
  Serial.begin(9600);
  Serial.flush();
  pinMode(13, OUTPUT);
  lcd.begin(16, 2);
  i = 0;
  d = 0;
  lcd.setCursor(i, d);
}
 
void loop()
{
  Serial.flush();
 
  if (Serial.available() > 0)
  {
    byte mybyte = Serial.read(); 
    char mychar = mybyte;
    //int myint = mybyte;
    mybyte = mybyte;
    
    Serial.println(mychar);
    Serial.println(mybyte);
    lcd.write(mychar);
    lcd.write(mybyte);
    lcd.print(mychar);
    lcd.print(mybyte);
    
    i=i+5;
    
  }
//Cursor

   if(i>16)
    {
       d++;
 
       i=0;
    }
    
    if(d>0 && i>16)
    {
      d=0;
      
      i=0;
    }
    
    
  lcd.setCursor(i, d);
  delay(20);
}

Das Problem scheint irgendwie am LC-Display zu liegen

Dann lass BT doch mal weg und schliesse es auf jeden Fall nicht an Serial an.
Stell den SerialMonitor auf “ohne Zeilenende” und spiel damit rum, um die LCD Seite zu testen.

void loop() {
  if (Serial.available()) {
   byte mybyte; char mychar;
   mychar = mybyte = Serial.read();
   lcd.setCursor(0,0);
   lcd.write(mychar);
   lcd.write(mybyte);
   lcd.print(mychar);
   lcd.print(mybyte);
 }
delay(100);
}

Aus einem ‘A’ sollte das auf dem lcd “AAA65” machen. rate ich jetzt mal

Danke für den Tipp. Hat leider auch nicht funktioniert. Das Display zeigt immernoch sein "indifferentes" Verhalten. Mal funktioniert es und mal nicht. Wenn es funktioniert, wird für die Eingabe eines 'a' wirklich "aaa97" angezeigt. Wenn es nicht funktioniert, kommen allerdings nur wirre Zeichen. Bis zu einem gewissen Grad scheint wenigstens ein Zusammenhang zwischen Ein- und Ausgabe zu bestehen. Für ein 'b' zeigt das Display dann z.B. "&&#" und für ein 'c' "\Leerzeichen663" (Statt "\Leerzeichen, wird natürlich eine leere Stelle auf dem Display angezeigt". Für viele andere Buchstaben erscheinen nicht europäische Schriftsymbole.

Ich hab schonmal ein spinnendes Display weggeworfen, ein anderes funktionierte problemlos.

ElZoido:
Danke für den Tipp. Hat leider auch nicht funktioniert. Das Display zeigt immernoch sein “indifferentes” Verhalten. Mal funktioniert es und mal nicht. Wenn es funktioniert, wird für die Eingabe eines ‘a’ wirklich “aaa97” angezeigt. Wenn es nicht funktioniert, kommen allerdings nur wirre Zeichen. Bis zu einem gewissen Grad scheint wenigstens ein Zusammenhang zwischen Ein- und Ausgabe zu bestehen. Für ein ‘b’ zeigt das Display dann z.B. “&&#” und für ein ‘c’ “\Leerzeichen663” (Statt “\Leerzeichen, wird natürlich eine leere Stelle auf dem Display angezeigt”. Für viele andere Buchstaben erscheinen nicht europäische Schriftsymbole.

Hast du dir schon mal die Hardware näher angesehen.
Ich meine damit die Verbindungen (gesteckt oder gelötet).
Die Steckbretter geben teilweise sehr schlecht Kontakt.
Sind die alle korrekt oder gibt es einen Wackelkontakt bzw. eine schlechte (kalte) Lötstelle?

Und ein zweites Display zum Testen ist nicht zufällig vorhanden?

Ich musste an das Display eine Stiftleiste ranlöten und ich gehe stark davon aus, dass diese Lötarbeit nicht besonders gut ausgefallen ist, da es so ziemlich meine erste Lötarbeit war. Ich hatte bisher ganz naiv angenommen, dass das Display entweder funktioniert, oder nicht. Dass es zu einem Fehlermodus kommen kann, bei dem zwar Zeichen auf dem Display angezeigt werden, aber die Zuordnung zwischen befohlenem und angezeigten Zeichen unterschiedlich ist, damit hätte ich nicht gerechnet. Wie Du schon sagst, kann es natürlich auch sein, dass das Display ganz einfach irgendeinen Defekt aufweist. Es handelt sich lediglich um irgendeinem günstiges China-Teil von einem Amazonhändler, da kann sowas natürlich mal passieren. Ein Vergleichsdisplay, das zumindest schonmal von jemand versierterem gelötet wurde, werde ich nächste Woche mal ausprobieren.