Go Down

Topic: Senden von Zahlenwerten über HC-05 und HC-06 (Read 2692 times) previous topic - next topic

michael_x

Quote
Wenn ich den seriellen Monitor nicht öffne, wird die Lampe nicht angeschaltet und das Programm sieht die Bedingung if(Serial.available()) als nicht wahr angenommen.
Ich kann mir nicht erklären warum.
Ich schon. Hab mal die Doku angeschaut. Serial.available() liefert die Anzahl angekommener, aber noch nicht per read() gelesener Zeichen. Sei froh, dass kein Müll ankommt, wenn da gar kein Sender angeschlossen ist, und in deinem Fall eine 0 (false) geliefert wird.


Serenifly

Mein Empfänger wusste nicht genau, was es damit anfangen sollte und hat daraus horizontale Linien gemacht.
Nein. Der weiß das genau. Steuerzeichen sind nun mal auf Displays nicht druckbar. Das Display verwendet den Speicher an der Stelle einfach für andere Zeichen.

adruinoboy

#17
Apr 04, 2020, 03:08 pm Last Edit: Apr 04, 2020, 09:09 pm by adruinoboy
Sei froh, dass kein Müll ankommt, wenn da gar kein Sender angeschlossen ist, und in deinem Fall eine 0 (false) geliefert wird.
Warum ist kein Sender angeschlossen? Das verstehe ich nicht. Ich habe einen Sender und Empfänger. Die finden sich auch.

Oder meinst du, dass ich einen Willkommenstext senden und empfangen muss, damit die Verbindung automatisch startet?
Ich freue mich, wenn du mir praktisch zeigst, was du meinst.

postmaster-ino

Hi

Das soll heißen, daß die Lib (oder Empfänger) genügend Intelligenz mitbringt, daß ein Sender sicher erkannt wird und - viel wichtiger, kein Sender ebenso erkannt wird.
Anders, wenn die Lib (oder Empfänger) einfach nur rauswirft, was wohl am Empfänger eingetrudelt ist, bekommst Du 'irgend was' - Das können korrekte Daten sein - aber eben auch nicht.
Das zu unterscheiden, ist nicht trivial - macht hier aber wohl Lib (oder Empfänger) bereits für Dich.

Somit ist Das, was Du als Antwort bekommst und nicht Null ist, eine echte Antwort - mit Der man arbeiten kann.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

adruinoboy

#19
Apr 06, 2020, 10:52 am Last Edit: Apr 07, 2020, 05:36 pm by adruinoboy
Hallo,

danke für die Erklärung nochmal. Also ich bekomme zwar sinnvolle Zahlenwerte, aber kannst du mir einen Ansatz zeigen, wie ich die Ausgabe bzw. das Empfangen auch intelligent steuern kann.
Ich würde mich freuen.

Übringens: Sender und Empfänger verbinden sich zwar, aber die Kommunikation startet nicht.

Ich bin euch echt dankbar, wenn ihr mir hierbei helft. Ich habe keinen Ansatz.
Hat keiner einen anregenden Gedanken?

adruinoboy

#20
Apr 07, 2020, 10:56 am Last Edit: Apr 08, 2020, 10:24 am by adruinoboy
Ich hoffe, dass ich noch eine Antwort auf meine Frage bekomme.

Mein Projekt entwickelt sich immer weiter. Ich habe jetzt einen DHT22 an meinen Master angeschlossen und sende jetzt die Temperatur und die Feuchtigkeit über den HC-05 auf den HC-06. Soweit alles in Ordnung, die Zeiten zum senden und empfangen passen auch so weit.

Um die Kommunikation zu ermöglichen, sendet der HC-06 den Text "Willkommen". Ist das eine gute Lösung?
Hier der aktuelle Sketch vom Master:

Code: [Select]

#include <SoftwareSerial.h> //Bibliothek für Serielle Schnittstelle
#include "DHT.h"            //DHT Bibliothek laden

#define ledR 11         //Die rote LED wird an PIN 11 angeschlossen
#define ledG 12         //Die grüne LED wird an PIN 12 angeschlossen
#define ledB 13         //Die blaue LED wird an PIN 13 angeschlossen
#define rxPin 0         //Für die BL Verbindung
#define txPin 1         //Für den BL Verbindung
#define DHTPIN 2        //Der Sensor wird an PIN 2 angeschlossen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor
 
SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen
 
void setup()
{
  btSerial.begin(9600);   //Serielle Verbindung starten
  dht.begin();            //DHT22 Sensor starten
  //Festlegen der Ein- und Ausgänge für die BL Verbindung
  pinMode(rxPin,INPUT);
  pinMode(txPin,OUTPUT);
  btSerial.println("bluetooth available");
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  analogWrite(ledB,255);  //Blaue LED wird eingeschaltet
  delay(5000);
}
 
void loop()
{
  if(btSerial.available())   //wenn Daten empfangen werden...
  {
    //Bestätigung zur erfolgreichen Funkanmeldung
   analogWrite(ledR,0);analogWrite(ledG, 255);analogWrite(ledB,0); //LED Grün an und LED Bla aus

   //Wartezeit, damit der Sensor die Messwerte ermitteln kann
   delay(2000);         //2 sek. bis zur Messung, weil der Sensor etwas langsam ist

   //Definition beider Variablen für beide Messwerte
   float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
   float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
   
   //Senden der Werte über HC-05
   btSerial.println(tempaussen);
   delay(30000);   //Warten   
   btSerial.println(feuchteaussen);
   
   // clear the string for new input:
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   
   delay(28000);
   analogWrite(ledR,255);analogWrite(ledG,0);analogWrite(ledB,0); //Grüne LED aus und rote LED an
  }
}



Und hier ist der aktuelle Sketch vom Slave:

Code: [Select]


#include <SoftwareSerial.h>
#include <Wire.h>                    // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h>       // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 20, 4);  //Hier wird festgelegt um welches Display es sich handelt

#define ledG 11
#define ledR 12
#define ledB 13
#define rxPin 0
#define txPin 1

SoftwareSerial btSerial(rxPin, txPin);
float btData;
 
void setup()
{
 btSerial.begin(9600); //serieller Monitor wird gestartet
 pinMode(11,OUTPUT);   //PIN 11 wird als Ausgang festgelegt
 pinMode(12,OUTPUT);   //PIN 12 wird als Ausgang festgelegt
 pinMode(13,OUTPUT);   //PIN 13 wird als Ausgang festgelegt
 lcd.init();           //Im Setup wird der LCD gestartet
 lcd.backlight();      //Hintergrundbeleuchtung einschalten
 lcd.setCursor(0,0);   //Cursor auf Poition 0,0 setzen
 lcd.print("Start");   //Schreib Start auf das Display
 analogWrite(ledB,255);//Blaue LED an
 delay(5000);
 lcd.clear();          //Das Dispaly komplett löschen
}
 
void loop()
{
  if(btSerial.available()) //wenn Daten empfangen werden...     
  {
    //Bestätigung zur erfolgreichen Funkanmeldung
    analogWrite(ledR,0);analogWrite(ledG,255);analogWrite(ledB,0); //Blaue LED aus und Grüne LED an
    delay(2000);    //2 sek. warten, für erfolgreiche Anmeldung
    btSerial.print("Willkommen");
   
    //Hier wird die Temperatur ausgelesen
    delay(15000);
    btData = btSerial.parseFloat();   //..sollen diese ausgelesen werden
   
    //Wird das eingelesene Zeichen auf dem seriellen Monitor ausgegeben
    btSerial.print(btData);         //WICHTIG! Schreiben der Empfangenen Daten

    //Das eingelesene Zeichen soll auf dem LCD ausgegeben werden
    lcd.setCursor(0,0);      //Die Zeile wird gelöscht
    lcd.print("          ");
    lcd.setCursor(0, 0);     //Den Cursor an den Anfang setzen
    lcd.print(btData,2);     //Den Zahlenwert auf das Display schreiben
    lcd.setCursor(4,0);      //Der Cursor wird auf die 2. Nachkommastelle gesetzt
    lcd.print(" ");          //Die 2. Nachkommastelle wird nicht benötigt und wird geslöscht
    lcd.setCursor(5,0);
    lcd.print("Grad");          //Grad hinter die Zahl setzen

    //clear the float for new input
    btData = 0;
    delay(30000);

    //Hier wird die Feuchtigkeit ausgelesen
    btData = btSerial.parseFloat();   //..sollen diese ausgelesen werden
   
    //Das eingelesene Zeichen soll auf dem LCD ausgegeben werden
    lcd.setCursor(0, 1);     //Die Zeile wird gelöscht
    lcd.print("          ");
    lcd.setCursor(0, 1);     //Den Cursor an den Anfang setzen
    lcd.print(btData,2);     //Den Zahlenwert auf das Display schreiben
    lcd.setCursor(4,1);      //Der Cursor wird auf die 2. Nachkommastelle gesetzt
    lcd.print(" ");          //Die 2. Nachkommastelle wird nicht benötigt und wird geslöscht
    lcd.setCursor(5,1);
    lcd.print("%");          //Grad hinter die Zahl setzen
   
    //clear the float for new input
    btData = 0;
    delay(13000);
    analogWrite(ledR,255);analogWrite(ledG,0);analogWrite(ledB,0);     //Grüne LED aus und rote LED an
  }
}


adruinoboy

#21
Apr 08, 2020, 10:42 am Last Edit: Apr 08, 2020, 10:43 am by adruinoboy
Hallo Leute, ich habe auf dieser Seite die Lösung meines Problems gefunden.

https://forum.arduino.cc/index.php?topic=214276.0

Auf der Seite wird beschrieben, wie ein Reset ausgeführt werden kann. Nämlich ein Kabel von RES kurz auf den neutralen Rückleiter geben. Das ist genau so viel, wie das öffnen des seriellen Monitors damit startet das Programm wie gewünscht.

Ich muss nur noch rausfinden, wie ich das am besten in meinen Sketch einbaue.
Falls jemand ebenfalls das Problem hat, dann gibt es hier einen Ansatz.

combie

Was willst du mit einem Reset im Sketch?

Das ist meist eine ganz dumme Idee.
Säge kein Sägemehl.

adruinoboy

#23
Apr 08, 2020, 11:29 am Last Edit: Apr 08, 2020, 11:36 am by adruinoboy
Der Reset ist meine Rettung, sonst könnte ich mein Projekt nicht verwirklichen. Zumindest mit meinen Programmierkenntnissen.

Die Sache ist, der Master geht alleine nicht in die if-Bedingung, obwohl sich beide Bluetooth Module gefunden haben (laut dem Blinkrythmus bzw. dem leuchten). Der wartet solange, bis ich den seriellen Monitor öffne, dann geht er in die if-Bedingung und sendet die Messwerte an den HC-06.

Ich habe ihm gesagt, wenn die if-Bedingung nicht wahr ist, dann mach einen Reset.
Das läuft wie geschmiert.
Der Watchdog soll eine elegantere Lösung sein, freue mich sehr für Vorschläge mit der Watchdog-Lösung. Dann ersetze ich meinen Neustart sofort.

Hier nochmal der Sketch vom Master, mit dem Reset-Befehl.
Code: [Select]

#include <SoftwareSerial.h> //Bibliothek für Serielle Schnittstelle
#include "DHT.h"            //DHT Bibliothek laden

#define ledR 11         //Die rote LED wird an PIN 11 angeschlossen
#define ledG 12         //Die grüne LED wird an PIN 12 angeschlossen
#define ledB 13         //Die blaue LED wird an PIN 13 angeschlossen
#define rxPin 0         //Für die BL Verbindung
#define txPin 1         //Für den BL Verbindung
#define DHTPIN 2        //Der Sensor wird an PIN 2 angeschlossen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen
 
void setup()
{
  btSerial.begin(9600);   //Serielle Verbindung starten
  dht.begin();            //DHT22 Sensor starten
  //Festlegen der Ein- und Ausgänge für die BL Verbindung
  pinMode(rxPin,INPUT);
  pinMode(txPin,OUTPUT);
  btSerial.println("bluetooth available");
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  analogWrite(ledB,255);  //Blaue LED wird eingeschaltet
  delay(5000);
}
 
void loop()
{
  if(btSerial.available())   //wenn Daten empfangen werden...
  {
    //Bestätigung zur erfolgreichen Funkanmeldung
   analogWrite(ledR,0);analogWrite(ledG, 255);analogWrite(ledB,0); //LED Grün an und LED Bla aus

   //Wartezeit, damit der Sensor die Messwerte ermitteln kann
   delay(2000);   //2 sek. bis zur Messung, weil der Sensor etwas langsam ist

   //Definition beider Variablen für beide Messwerte
   float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
   float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
   
   //Senden der Werte über HC-05
   btSerial.println(tempaussen);
   delay(30000);   //Warten   
   btSerial.println(feuchteaussen);
   
   // clear the string for new input:
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   
   delay(28000);
   analogWrite(ledR,255);analogWrite(ledG,0);analogWrite(ledB,0); //Grüne LED aus und rote LED an
  }
  else
  {
   asm volatile ("jmp 0");   //Wenn BT Verbindung weg, dann Neustart
  }
}

combie

Du machst mich erschrocken.


Wäre es nicht besser, die ganzen delay zu entsorgen, und ein ordentliches Protokoll zwischen den Beiden zu fahren?


Aber was solls, des Menschen Wille ist sein Himmelreich.
Säge kein Sägemehl.

adruinoboy

Ja, ich habe bemerkt, dass die delay-Zeiten sich verschieben. Dann zeigt er mir nach wenigen Stunden, an der Stelle für Temp. die Feuchtigkeit an und anders herum. Das ist Schade :(
Ich weiß aber nicht, wie ich ein ordentliches Protokoll fahren kann.
Ich freue mich für jeden Ansatz und jeden Hinweis.

combie

Säge kein Sägemehl.

wno158

Das wäre ein korrekte Lösung.

Aber wenigstens ein Minimaldings (ich will es nicht Protokoll nennen) sollte doch möglich sein:
Code: [Select]

...
   //Senden der Werte über HC-05
   btSerial.print("T:");     // Kennung Temperatur außen; Doppelpunkt kommt in den Zahlen nicht vor und ist Ende der Kennung
   btSerial.println(tempaussen);
   btSerial.print("F:");     // Kennung Feuchte außen (könnte auch "FA" sein, falls später mal "FK" für "Feuchte Keller" dazukommt)
   btSerial.println(feuchteaussen);
...

Dann auf der Gegenseite mit readBytesUntil() die Zeichen bis zum Doppelpunkt weglesen und dann kommt der passende Wert.
Gruß Walter

michael_x

Quote
ich will es nicht Protokoll nennen
Ich schon :)
Den Doppelpunkt kann man sich sogar sparen, denn weder 'T' noch 'F' kommt in einer Zahl vor.
Wenn eine Zeile mit einem Buchstaben anfängt und man dann die folgende Zahl (bis zum Zeilenende) auswertet, sollte man schon fertig sein.

Dieses "Protokoll" könnte man sogar auf einige (min. zwei) Dutzend verschiedene Messwerte anwenden.

adruinoboy

#29
Apr 08, 2020, 11:26 pm Last Edit: Apr 08, 2020, 11:27 pm by adruinoboy
Danke Leute, dass ihr mir so schnell helft.

Ich habe den Ansatz versucht anzuwenden. Aber ich habe den Befehl "CmdMessenger" noch nicht verstanden.

Hier ist der Sketch vom Slave, der macht Probleme :( Freue mich bei weiterer Hilfe.

Code: [Select]

#include <SoftwareSerial.h>
#include <Wire.h>                   // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h>      // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
#include <CmdMessenger.h>           // CmdMessenger für geschickte Datenübertragung
LiquidCrystal_I2C lcd(0x27, 20, 4); //Hier wird festgelegt um welches Display es sich handelt

#define ledG 11
#define ledR 12
#define ledB 13
#define rxPin 0
#define txPin 1

SoftwareSerial btSerial(rxPin, txPin);
float btData = 0;     //Für eingehende Messwerte
char T = 0;  //Kennung für Temp
char F = 0;  //Kennung für Feuchtigkeit
 
void setup()
{
 btSerial.begin(9600); //serieller Monitor wird gestartet
 pinMode(11,OUTPUT);   //PIN 11 wird als Ausgang festgelegt
 pinMode(12,OUTPUT);   //PIN 12 wird als Ausgang festgelegt
 pinMode(13,OUTPUT);   //PIN 13 wird als Ausgang festgelegt
 lcd.init();           //Im Setup wird der LCD gestartet
 lcd.backlight();      //Hintergrundbeleuchtung einschalten
 lcd.setCursor(0,0);   //Cursor auf Poition 0,0 setzen
 lcd.print("Start");   //Schreib Start auf das Display
 analogWrite(ledR,0);analogWrite(ledG,0);analogWrite(ledB,255);//Blaue LED an
}
 
void loop()
{
  if(btSerial.available()) //wenn Daten empfangen werden...     
  {
    //Bestätigung zur erfolgreichen Funkanmeldung
    analogWrite(ledR,0);analogWrite(ledG,255);analogWrite(ledB,0); //Blaue LED aus und Grüne LED an
    delay(2000);    //2 sek. warten, für erfolgreiche Anmeldung
    btSerial.print("Willkommen");
   
    //Hier wird die Temperatur ausgelesen
    T = btSerial.readBytesUntil();
    //btData = btSerial.parseFloat();   //..sollen diese ausgelesen werden
   
    //Wird das eingelesene Zeichen auf dem seriellen Monitor ausgegeben
    btSerial.print(btData);         //WICHTIG! Schreiben der Empfangenen Daten

    //Das eingelesene Zeichen soll auf dem LCD ausgegeben werden
    lcd.setCursor(0,0);      //Cursor an den Anfang setzen
    lcd.print("          "); //Die Zeile wird gelöscht
    lcd.setCursor(0, 0);     //Den Cursor wieder an den Anfang gesetzt
    lcd.print(btData,2);     //Die Temperatur auf das Display schreiben
    lcd.setCursor(4,0);      //Der Cursor wird auf die 2. Nachkommastelle gesetzt
    lcd.print(" ");          //Die 2. Nachkommastelle wird gelöscht
    lcd.setCursor(5,0);      //Cursor hinter Temp. setzen
    lcd.print("Grad");       //Grad hinter Temp. schreiben

    //clear the float for new input
    btData = 0;    //Den Float auf Null setzen

    //Hier wird die Feuchtigkeit ausgelesen
    F = btSerial.readBytesUntil();
    //btData = btSerial.parseFloat();
   
    //Das eingelesene Zeichen soll auf dem LCD ausgegeben werden
    lcd.setCursor(0, 1);     //Cursor an den Anfang der 2. Zeile setzen
    lcd.print("          "); //Die Zeile wird gelöscht
    lcd.setCursor(0, 1);     //Den Cursor an den Anfang der 2. Zeile setzen
    lcd.print(btData,2);     //Die Feuchtigkeit auf das Display schreiben
    lcd.setCursor(4,1);      //Der Cursor auf die 2. Nachkommastelle setzen
    lcd.print(" ");          //Die 2. Nachkommastelle wird gelöscht
    lcd.setCursor(5,1);      //Den Cursor auf 2. Nachkommastelle setzen
    lcd.print("%");          //% hinter die Feuchtigkeit setzen
   
    //clear the float for new input
    btData = 0;
    delay(13000);
    analogWrite(ledR,255);analogWrite(ledG,0);analogWrite(ledB,0);     //Grüne LED aus und rote LED an
  }
}


Ich erhalte folgende Fehlermeldung:

no matching function for call to 'SoftwareSerial::readBytesUntil()'

Muss ich T und F vorher irgendwie als "int" oder "char" oder sonst was deklarieren??

Go Up