Go Down

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

adruinoboy

Ich habe dein Beispiel mal ausprobiert. Es gibt wie schon gesagt, keine Schwierigkeiten beim Hochladen.
Mit LEDs habe ich auch geprüft, dass das gesamte Programm durchlaufen wird.
Nur kann keine Verbindung zwischen den Modulen hergestellt werden. Beide suchen, können sich aber gegenseitig nicht finden.

Auf dem seriellen Monitor des Senders gibt es keine Ausgabe.

Beim Empfänger ist folgender Eintrag im seriellen Monitor zu finden:
16:01:30.774 -> Start: D:\Dateiordner\Arduino zu Hause\Beispielsketch empfänger\Beispielsketch_empf_nger\Beispielsketch_empf_nger.ino

Ich hoffe die Informationen reichen, damit meinem Problem geholfen werden kann.

combie

Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

adruinoboy

#47
Apr 17, 2020, 12:24 pm Last Edit: Apr 17, 2020, 01:15 pm by adruinoboy
Ich bin schon lange dabei meine hc-05 und hc-06 zu verbinden, doch ohne Erfolg.
Als ich die Frage gestellt habe, lief die Verbindung einwandfrei.
Ich weiß nicht was da passiert ist, dass meine Verbindung weg ist.

Ich habe den Beitrag oben befolgt und die Einstellungen für beide Module mit den AT-Befehlen durchgeführt.
Der Master findet sogar die Adresse vom Slave mit +INQxxxx.xx.xx u.s.w. aber ich habe bei AT-PAIR kein OK zurückbekommen.
Ich weiß nicht, was ich mit den beiden noch machen soll?

Die suchen sich wieder, aber finden sich nicht.

adruinoboy

Ich freue mich auf Rückmeldung. Es gibt doch bestimmt welche die mir helfen können.
Es liegt bestimmt an irgendwelchen AT-Einstellungen. Ich weiß nur nicht welche.

combie

Wie schon gesagt: Ich habe deine Module nicht bereit liegen, um zu testen.

Auch hältst du geheim, was du versuchst, so kann man es noch nicht mal mit der Doku vergleichen.

Wie stellst du dir so eine Hilfe vor?

Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

adruinoboy

#50
Apr 20, 2020, 10:40 am Last Edit: Apr 20, 2020, 10:41 am by adruinoboy
Hallo Leute,

plötzlich hat es bei mir geklappt :) Also das Problem lag wahrscheinlich im Master. Ich habe dem im AT-Modus gesagt: AT+CMODE=1. Aber das ging mit diesem Sketch:

Code: [Select]

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {

Serial.begin(9600);

pinMode(9,OUTPUT); digitalWrite(9,HIGH);

Serial.println("Enter AT commands:");

mySerial.begin(38400);

}

void loop()

{

if (mySerial.available())

Serial.write(mySerial.read());

if (Serial.available())

mySerial.write(Serial.read());

}


Folgend habe ich das hc-05 Modul mit dem UNO verbunden:
Rx -> Pin 10
Tx -> Pin 11
Gnd -> Gnd
Vcc -> 5V
En -> 3,3v

Dann hat er mir Rückmeldungen auf meine AT-Commands gegeben.[/code]

adruinoboy

Jetzt habe ich deinen Code hochgeladen:

Code: [Select]

#include <Streaming.h>
#include <SoftwareSerial.h>

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

#define rxPin 3
#define txPin 4
int c = 0;

SoftwareSerial btSerial(rxPin, txPin);


void setup()
{
  Serial.begin(9600);
  Serial.println("Arduino with HC-05 is ready");
  btSerial.begin(9600);
  Serial.println("Bluetooth Modul also ready");
}

void loop()
{
  if(btSerial.available())
  {
    c = btSerial.read();
    Serial.write(c);
  }
  if(Serial.available())
  {
    c = Serial.read();
    Serial.write(c);
    btSerial.write(c);
  }

  delay(3000);
  btSerial << Temperatur << ',' << 18.6 << ';' << endl;

  delay(3000);
  btSerial << Feuchtigkeit << ',' << 54.77 << ';' << endl;
}


Ich habe das hc--05 Modul jetzt so angeschlossen:
Rx -> Pin 4
Tx -> Pin 3
Gnd -> Gnd
Vcc -> 5V
EN -> nicht

Auf meinem Slave ist folgender Code drauf:

Code: [Select]

#include <CmdMessenger.h>
#include <Streaming.h>
#include <SoftwareSerial.h>

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

#define rxPin 3
#define txPin 4

SoftwareSerial btSerial(rxPin, txPin);

CmdMessenger cmdMessenger {btSerial};

void setup()
{
  Serial.begin(9600);
  btSerial.begin(9600);
  Serial.println("Arduino with HC-06 is ready");
  Serial.println("BTSerial started at 9600");
  Serial << "Start: "<< __FILE__ << endl;

 
  cmdMessenger.attach(Temperatur, [](){
                                         float t = cmdMessenger.readFloatArg();
                                         Serial << "Temperatur " << t << " C" << endl;
                                      });
                                     
  cmdMessenger.attach(Feuchtigkeit, [](){
                                           float f = cmdMessenger.readFloatArg();
                                           Serial << "Feuchtigkeit " << f << " %" << endl;
                                        });
}

void loop()
{
  if(btSerial.available())
  {
    btSerial.write(Serial.read());
  }
  if(Serial.available())
  {
    Serial.write(btSerial.read());
  }
  cmdMessenger.feedinSerialData();
}


Das hc-06 Modul ist so angeschlossen:
Rx -> Pin 4
Tx -> Pin 3
Gnd -> Gnd
Vcc -> 3.3V

Ich hoffe ich habe alles notwendige geschrieben. Falls ich irgendwas vergessen habe zu schreiben, freue ich mich auf Rückmeldung. Ich weiß immer nicht was ihr für Informationen braucht um mir zu helfen.

combie

Quote
btSerial.begin(9600);
mySerial.begin(38400);
Welche Baudrate ist denn nun richtig?
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

adruinoboy

Ich arbeite immer mit der Baudrate 9600. Diese 38400 sind nur in dem Sketch, indem ich die AT-Commands ausgeführt habe. Es scheint auch so funktioniert zu haben. Der Sketch, der jetzt bei mir läuft hat die Baudrate 9600.

adruinoboy

#54
Apr 20, 2020, 11:11 am Last Edit: Apr 20, 2020, 11:15 am by adruinoboy
Auf dem seriellen Monitor schreibt der hc-05 im Abstand von 3 Sekunden ein Fragezeichen??? Ich habe dem das eigentlich nicht gesagt ;)
Die Ausgabe des seriellen Monitors sieht so aus:
Code: [Select]

11:07:04.691 -> Arduino with HC-05 is ready
11:07:04.691 -> Bluetooth Modul also ready
11:07:10.691 -> ⸮⸮⸮⸮⸮⸮⸮


Der hc-06 schreibt auch etwas interessantes im seriellen Monitor:
Die Ausgabe sieht da so aus:

Code: [Select]

11:08:12.408 -> Arduino with HC-06 is ready
11:08:12.408 -> BTSerial started at 9600
11:08:12.455 -> Start: D:\Daniel\Arduino zu Hause\Beispielsketch empfänger\Beispielsketch_empf_nger\Beispielsketch_empf_nger.ino
11:08:14.049 -> Temperatur 0.00 C
11:08:29.111 -> Temperatur 0.00 C
11:08:32.157 -> Temperatur 0.00 C
11:08:41.204 -> Feuchtigkeit 18.00 %
11:08:53.204 -> Temperatur 0.00 C
11:09:08.250 -> Temperatur 54.00 C
11:09:17.297 -> Feuchtigkeit 5.00 %
11:09:53.436 -> Temperatur 0.00 C
11:09:56.436 -> Temperatur 0.00 C
11:10:02.483 -> Feuchtigkeit 1.00 %
11:10:20.529 -> Feuchtigkeit 0.00 %
11:10:26.529 -> Feuchtigkeit 5.00 %


Kann das sein, dass etwas mit den Empfangs- und Sendezeiten nicht passt. Oder muss irgendeine Endsequenz eingetragen werden?

combie

#55
Apr 20, 2020, 12:48 pm Last Edit: Apr 20, 2020, 12:53 pm by combie
Quote
Jetzt habe ich deinen Code hochgeladen:
Das ist nicht mein Code!

Du hast da Zeugs eingebaut.
In beide mein Codes.
Und so selber das Versagen eingeleitet.


Quote
if(Serial.available())
  {
    c = Serial.read();
    Serial.write(c);
    btSerial.write(c);
  }
Das Fragment zerhackt das Protokoll.

Tipp:
Ein Protokoll kann nur "wirken", wenn sich alle daran halten!
Wenn da einer unkultiviert zwischen quatscht, oder  dem Messenger Zeichen klaut, wird es versagen.
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

adruinoboy

#56
Apr 21, 2020, 08:35 am Last Edit: Apr 21, 2020, 09:17 am by adruinoboy
Perfekt, danke. Jetzt funktioniert das. Die Daten werden ausgelesen und sauber in den seriellen Monitor geschrieben.

Eine Frage habe ich noch. In welche Variable wird die Temperatur bzw. die Feuchtigkeit geschrieben?
Ich möchte nähmlich die Temp. und Feuchtigkeit auf einem Display ausgeben.
Das t wurde vorher ja als float deklariert, aber wenn ich das "t" auf dem Dispaly ausgeben möchte, erscheint der Fehler, dass das "t" nicht deklariert sei.

combie

Das t hat einen eingeschränkten Geltungsbereich!

Lesetipp: "C++ variable scope"
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

adruinoboy

Herzlichen Dank. Es funktioniert sehr gut. Der Tipp hat mich zu folgender Lösung gebracht.
Ich freue mich, wenn ihr noch mal drüber schauen könntet, ob es sich um eine gute Lösung handelt.

Das ist mein Sender:

Code: [Select]


#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include "DHT.h"          //DHT Bibliothek laden

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

#define ledR 11
#define ledG 12
#define ledB 13
#define rxPin 3
#define txPin 4
#define DHTPIN 2
#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);
  Serial.begin(9600);
  dht.begin();
    //Festlegen der Ein- und Ausgänge für die BL Verbindung
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  analogWrite(ledB,255);  //Blaue LED wird eingeschaltet
}

void loop()
{
  //Bestätigung zur erfolgreichen Funkanmeldung
  analogWrite(ledR,0);analogWrite(ledG, 255);analogWrite(ledB,0); //LED Grün an

  float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
 
  //Senden der Messwerte
  delay(3000);
  btSerial << Temperatur << ',' << tempaussen << ';' << endl;
 
  delay(3000);
  btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
  /*****************************************/

//Löschen der Messwerte
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
 
  analogWrite(ledR,255);analogWrite(ledG,0);analogWrite(ledB,0); //Rote LED an
}


Und das ist der Empfänger:

Code: [Select]


#include <CmdMessenger.h> //Bibliothek zur BT Verbindung
#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C Bibliothek einbinden

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

#define ledR 11
#define ledG 12
#define ledB 13
#define rxPin 3
#define txPin 4

float t = 0;
float f = 0;

LiquidCrystal_I2C lcd(0x27, 20, 4); //Hier wird festgelegt um welches Display es sich handelt
SoftwareSerial btSerial(rxPin, txPin);

CmdMessenger cmdMessenger {btSerial};

void setup()
{
  Serial.begin(9600);
  btSerial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;

 
  cmdMessenger.attach(Temperatur, [](){
                                         t = cmdMessenger.readFloatArg();
                                         Serial << "Temperatur " << t << " °C" << endl;
                                      });
                                     
  cmdMessenger.attach(Feuchtigkeit, [](){
                                           f = cmdMessenger.readFloatArg();
                                           Serial << "Feuchtigkeit " << f << " %" << endl;
                                        });
                                       
 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()
{
  analogWrite(ledR,0);analogWrite(ledG,255);analogWrite(ledB,0); //Grüne LED an
 
  cmdMessenger.feedinSerialData();
 
  lcd.setCursor(0, 0);
  lcd.print("          ");
  lcd.setCursor(0, 0);
  lcd.print(t,1);
  lcd.print(" C");
  lcd.setCursor(0, 1);
  lcd.print("          ");
  lcd.setCursor(0, 1);
  lcd.print(f,1);
  lcd.print(" %");
  delay(5000);      //5 Sekunden Pause
  analogWrite(ledR,255);analogWrite(ledG,0);analogWrite(ledB,0);     //Rote LED an
}

combie

Wie wäre es, wenn du alle delay() entsorgst, und statt dessen den Nachtwächter zum Einsatz bringst?
Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Go Up