Senden von Temperatur und Luftfeuchtigkeit mit Zigbee

Danke für eure Tipps. Ich habe mich mit dem Löten mehr befasst und einige Übungen gemacht. Jetzt funktionieren plötzlich meine Totgeglaubten Co2-Sensoren wieder. Also danke an alle, die mir Hilfe geleistet haben. Wenn ich so weit bin, dass ich die HC-12 Module gelötet habe, melde ich mich wieder.

Super dass es jetzt funktioniert.

Danke für die Rückmeldung und weiterhin viel Erfolg.

Hallo,

jetzt ist es soweit. Ich habe meine HC-12 Module gelötet. Das hat echt besser geklappt als erwartet. Die funktionieren sehr gut und senden und empfangen aus dem seriellen Monitor alles, was ich schreibe.

Jetzt will ich zwei Messwerte senden. Also einmal die Temperatur und die Luftfeuchtigkeit. Ich hatte das vor einigen Jahren mit HC-05 und HC-06 Modulen ausgeführt und der endgültige Sketch sah so aus:

#include     //Bibliothek zur BT Verbindung
#include 
#include "DHT.h"          //DHT Bibliothek laden

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

float tempaussen = 0;
float feuchteaussen = 0;

#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();
}

void loop()
{
      //Auslesen der Temp. und Feuchtigkeit
    tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
    feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert

      //Senden der Messwerte
    btSerial << Temperatur << ',' << tempaussen << ';' << endl;
    btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;

//Löschen der Messwerte
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
}

Das hat sehr gut funktioniert. Ich habe den Sketch dann auch für meine HC-12 Module übertragen, aber das hat nicht funktioniert. Der kann den Befehl << Temperatur ... nicht ausführen. Ich schicke mal, wie ich den Sketch angepasst habe, damit ihr mir genauer helfen könnt.

#include 
#include 
#include "DHT.h"          //DHT Bibliothek laden

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

unsigned long BT_timestore;   //Variable Speicher für Systemzeit
float tempaussen = 0;
float feuchteaussen = 0;

#define DHTPIN 2        //DHT22 wird am Pin2 ausgelesen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
 Serial.begin(9600);             // Serial port to computer
 HC12.begin(9600);               // Serial port to HC12
}
void loop()
{
  tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert

  while (HC12.available())
  {// If HC-12 has data
  Serial.write(HC12.read());      // Send the data to Serial monitor
  //Senden der Messwerte
  HC12.write << Temperatur << ',' << tempaussen << ';' << endl;
  HC12.write << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
  }
  while (Serial.available())
  {      // If Serial monitor has data
  HC12.write(Serial.read());      // Send that data to HC-12
  }
  delay(1000);
}

Wenn du es mit Streaming machen möchtest, musst du auch die Library dazu einbinden.

Was ich allerdings nicht verstehe, du fragst die serielle zum HC12 nach Daten ab und willst dann erst per Streaming senden. Das kommt mir ein wenig konfus vor.

Hallo HotSystems,

ich hatte vorher vergessen die Bibliothek einzubinden. Dafür hatte ich die "SoftwareSerial" zwei mal reingeschrieben. Das habe ich jetzt geändert. Danke für den Tipp, dass ist natürlich quatsch. Ich habe damit also diesen Sketch hier:

#include     //Bibliothek zur BT Verbindung
#include 
#include "DHT.h"          //DHT Bibliothek laden

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

unsigned long BT_timestore;   //Variable Speicher für Systemzeit
float tempaussen = 0;
float feuchteaussen = 0;

#define DHTPIN 2        //DHT22 wird am Pin2 ausgelesen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
 Serial.begin(9600);             // Serial port to computer
 HC12.begin(9600);               // Serial port to HC12
}
void loop()
{
  tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert

  while (HC12.available())
  {// If HC-12 has data
  Serial.write(HC12.read());      // Send the data to Serial monitor
  //Senden der Messwerte
  HC12.write << Temperatur << ',' << tempaussen << ';' << endl;
  HC12.write << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
  }
  while (Serial.available())
  {      // If Serial monitor has data
  HC12.write(Serial.read());      // Send that data to HC-12
  }
  delay(1000);
}

Damit erhalte ich folgende Fehlermeldung:

exit status 1 no match for 'operator<<' (operand types are '' and 'Comand')

Ok, dann solltest du das mal in der "einfachen" Version machen. Z.B. mit dieser Anweisung:

hc12.print(Deine Daten);

Aber ohne das ganze "drumherum".

Und sieh dir diese Beschreibung an.

(deleted)

Peter-CAD-HST: Für diese einfache Anwendung ist ein Streaming nicht sinnvoll.

Aber wie kann ich das mit dem zweiten Arduino sauber auslesen, damit er genau zwischen Temp. und Luftfeuchte unterscheiden kann. Nicht, dass ich auf dem zweiten Arduino so etwas auf dem Display ausgebe:

50,7 °C 20,3 %

Weil die Werte vertauscht wurden.

Ich habe den Sketch jetzt so verändert, wie ihr mir das geraten habt.

#include     //Bibliothek zur BT Verbindung
#include 
#include "DHT.h"          //DHT Bibliothek laden

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

float tempaussen = 0;
float feuchteaussen = 0;

#define DHTPIN 2        //DHT22 wird am Pin2 ausgelesen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
 Serial.begin(9600);             // Serial port to computer
 HC12.begin(9600);               // Serial port to HC12
}
void loop()
{
  tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert

  while (HC12.available())
  {// If HC-12 has data
  Serial.write(HC12.read());      // Send the data to Serial monitor
  //Senden der Messwerte
    HC12.print (Temperatur); // Kommando
    HC12.print (",");        // Abgrenzung
    HC12.print (tempaussen); // Messwert
    HC12.println (";");        // Abgrenzung

    HC12.print (Feuchtigkeit); // Kommando
    HC12.print (",");        // Abgrenzung
    HC12.print (feuchteaussen); // Messwert
    HC12.println (";");        // Abgrenzung
  }
  while (Serial.available())
  {      // If Serial monitor has data
  HC12.write(Serial.read());      // Send that data to HC-12
  }
  delay(1000);
}

Das funktioniert so schon mal, aber nur wenn ich etwas über den seriellen Monitor schicke. Dann sendet er ca. 10 mal die Temp. und die Luftfeuchte und wartet bis ich wieder etwas schreibe. Die Ausgabe sieht so aus:

10:20:32.801 -> Hallo
10:20:41.914 -> 1,21.00;
10:20:41.914 -> 2,49.50;
10:20:41.914 -> 1,21.00;
10:20:41.961 -> 2,49.50;
10:20:41.961 -> 1,21.00;
10:20:41.961 -> 2,49.50;
10:20:41.961 -> 1,21.00;
10:20:41.961 -> 2,49.50;
10:20:42.014 -> 1,21.00;
10:20:42.014 -> 2,49.50;
10:20:42.014 -> 1,21.00;
10:20:42.014 -> 2,49.50;
10:20:42.060 -> 1,21.00;
10:20:42.060 -> 2,49.50;
10:20:42.060 -> 1,21.00;
10:20:42.060 -> 2,49.50;
10:20:42.114 -> 1,21.00;
10:20:42.114 -> 2,49.50;
10:20:42.114 -> 1,21.00;
10:20:42.114 -> 2,49.50;
10:20:42.114 -> 1,21.00;
10:20:42.161 -> 2,49.50;
10:20:42.161 -> 1,21.00;
10:20:42.161 -> 2,49.50;
10:20:42.161 -> 1,21.00;
10:20:42.215 -> 2,49.50;
10:20:42.215 -> 1,21.00;
10:20:42.215 -> 2,49.50;
10:20:42.215 -> 1,21.00;
10:20:42.215 -> 2,49.50;

Ich habe nur einmal "Hallo zurück" los geschickt. Dann schickt er den ganzen Text auf einmal.

Übrigens: Der 2. Arduino hat noch meinen ersten Sketch.

(deleted)

Danke für deinen Hinweis. ich habe versucht das in meinen Sketch einzubauen.

#include 
#include "DHT.h"          //DHT Bibliothek laden

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

unsigned long BT_timestore;        //Variable Speicher für Systemzeit
float tempinnen = 0;
float feuchteinnen = 0;
String Temperatur = "";            // a String to hold incoming data
String Luftfeuchte = "";           // a String to hold incoming data
bool stringtempComplete = false;   // wheter the string is complete
bool stringfeuchteComplete = false;// wheter the string is complete

#define DHTPIN 2        //DHT22 wird am Pin2 ausgelesen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
 Serial.begin(9600);             // Serial port to computer
 HC12.begin(9600);               // Serial port to HC12
 //reserve 200 byzes for the Temp. und Luftfeuchte
 Temperatur.reserve(200);
 Luftfeuchte.reserve(200);
}

void loop()
{
  tempinnen = dht.readTemperature(); //Temperatur innen wird gemessen und gespeichert
  feuchteinnen = dht.readHumidity(); //Luftfeuchte innen wird gemessen und gespeichert

  while (HC12.available())        // If HC-12 has data
  {
  Serial.write(HC12.read());      // Send the data to Serial monitor
  //Senden der Messwerte
    HC12.print (Temperatur);   // Kommando
    HC12.print (",");          // Abgrenzung
    HC12.print (tempaussen);   // Messwert
    HC12.println (";");        // Abgrenzung

    HC12.print (Feuchtigkeit);  // Kommando
    HC12.print (",");           // Abgrenzung
    HC12.print (feuchteaussen); // Messwert
    HC12.println (";");         // Abgrenzung
  }
  while (Serial.available())
  {      // If Serial monitor has data
  HC12.write(Serial.read());      // Send that data to HC-12
  }
  if (stringtempComplete)
  {
    Serial.println(Temperatur);
    //clear the string:
    Temperatur = "";
    stringtempComplete = false;
  }

  if (stringfeuchteComplete)
  {
    Serial.println(Luftfeuchte);
    //clear the string:
    Luftfeuchte = "";
    stringfeuchteComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    Temperatur += inChar;
    Luftfeuchte += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringtempComplete = true;
      stringfeuchteComplete = true;
    }
  }
}

Probleme macht jetzt diese Zeile: String Temperatur = "";

Die Fehlermeldung sieht so aus: exit status 1 'String Temperatur' redeclared as different kind of symbol

Du willst doch mit diesem Sketch die Daten senden ?

Dann solltest du das mal vom auslesen der seriellen Schnittstelle und des HC-12 trennen.

Also schmeiß alles raus und sende nur die Daten.

Ja, ich habe meine ganzen Informationen in Sketche aufgeteilt. Der eine soll senden, der andere nur aus lesen. Also Meine Sender sieht jetzt so aus:

#include     //Bibliothek zur BT Verbindung
#include 
#include "DHT.h"          //DHT Bibliothek laden

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

unsigned long BT_timestore;        // Variable Speicher für Systemzeit

#define DHTPIN 2        // DHT22 wird am Pin2 ausgelesen
#define DHTTYPE DHT22   // Es handelt sich um den DHT22 Sensor

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
DHT dht(DHTPIN, DHTTYPE);    // Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
 Serial.begin(9600);             // Serial port to computer
 HC12.begin(9600);               // Serial port to HC12
}

void loop()
{
  tempaussen = dht.readTemperature(); // Temperatur innen wird gemessen und gespeichert
  feuchteaussen = dht.readHumidity(); // Luftfeuchte innen wird gemessen und gespeichert

  while (HC12.available())        // If HC-12 has data
  {
  //Senden der Messwerte
    HC12.print (Temperatur);   // Kommando
    HC12.print (",");          // Abgrenzung
    HC12.print (tempaussen);   // Messwert
    HC12.println (";");        // Abgrenzung

    HC12.print (Feuchtigkeit);  // Kommando
    HC12.print (",");           // Abgrenzung
    HC12.print (feuchteaussen); // Messwert
    HC12.println (";");         // Abgrenzung
  }
  while (Serial.available())
  {      // If Serial monitor has data
  HC12.write(Serial.read());      // Send that data to HC-12
  }
}

Mein Empfänger so:

#include     //Bibliothek zur BT Verbindung
#include 
#include "DHT.h"          //DHT Bibliothek laden

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

unsigned long BT_timestore;        //Variable Speicher für Systemzeit
float tempinnen = 0;
float feuchteinnen = 0;
String Temperatur = "";            // a String to hold incoming data
String Luftfeuchte = "";           // a String to hold incoming data
bool stringtempComplete = false;   // wheter the string is complete
bool stringfeuchteComplete = false;// wheter the string is complete

#define DHTPIN 2        //DHT22 wird am Pin2 ausgelesen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
 Serial.begin(9600);             // Serial port to computer
 HC12.begin(9600);               // Serial port to HC12
 //reserve 200 byzes for the Temp. und Luftfeuchte
 Temperatur.reserve(200);
 Luftfeuchte.reserve(200);
}

void loop()
{
  tempinnen = dht.readTemperature(); //Temperatur innen wird gemessen und gespeichert
  feuchteinnen = dht.readHumidity(); //Luftfeuchte innen wird gemessen und gespeichert

  while (HC12.available())        // If HC-12 has data
  {
  Serial.write(HC12.read());      // Send the data to Serial monitor
  //Senden der Messwerte
    HC12.print (Temperatur);   // Kommando
    HC12.print (",");          // Abgrenzung
    HC12.print (tempaussen);   // Messwert
    HC12.println (";");        // Abgrenzung

    HC12.print (Feuchtigkeit);  // Kommando
    HC12.print (",");           // Abgrenzung
    HC12.print (feuchteaussen); // Messwert
    HC12.println (";");         // Abgrenzung
  }
  while (Serial.available())
  {      // If Serial monitor has data
  HC12.write(Serial.read());      // Send that data to HC-12
  }
  if (stringtempComplete)
  {
    Serial.println(Temperatur);
    //clear the string:
    Temperatur = "";
    stringtempComplete = false;
  }

  if (stringfeuchteComplete)
  {
    Serial.println(Luftfeuchte);
    //clear the string:
    Luftfeuchte = "";
    stringfeuchteComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    Temperatur += inChar;
    Luftfeuchte += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringtempComplete = true;
      stringfeuchteComplete = true;
    }
  }
}

Und wozu hast du im Sender diese Anweisung ?

while (HC12.available())        // If HC-12 has data

Die brauchst da nicht. Und im Empfänger sehe ich da auch Optimierungspotential.

Danke. Beim Sender gibt es keine Probleme beim Hochladen.

Ich freue mich sehr, wenn du mich langsam durch deine Optimierungsschritte leiten könntest. Ich würde gerne einen optimalen Sketch haben und dabei etwas lernen.

Der Empfänger hat beim Hochladen folgendes Problem:

exit status 1 'String Temperatur' redeclared as different kind of symbol

Der Fehler bezieht sich auf diese Zeile: String Temperatur = "";

Ich verstehe das Problem nicht.

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

String Temperatur = "";

void setup() {}
void loop() {}

Problem

Neben Umbenennen hilft auch

enum class Comand {
              Temperatur  ,
              Feuchtigkeit 
            };

String Temperatur = "";
Comand typ = Comand::Temperatur;
void setup() {}
void loop() {}

erfordert Comand::Temperatur bei Bedarf

adruinoboy: Danke. Beim Sender gibt es keine Probleme beim Hochladen.

Ich freue mich sehr, wenn du mich langsam durch deine Optimierungsschritte leiten könntest. Ich würde gerne einen optimalen Sketch haben und dabei etwas lernen.

Wenn es beim Hochladen keine Problem gibt, heißt es nicht, dass es auch funktioniert.

Warum siehst du dir nicht die Beispiele an, die ich in Post #26 verlinkt habe. Da ist alles sehr genau beschrieben und funktioniert.

Du musst beim Senden nicht vorher den Empfänger auf Daten abfragen.

Ich habe meinen Sketch laut den Hinweisen von Michael_x angepasst. Ich muss ja für die Temperatur als auch für die Feuchtigkeit den Comand typ erstellen. Bei der Temperatur meckert das Programm nicht, aber bei der Feuchtigkeit. Mein Sketch sieht so aus:

#include     //Bibliothek zur BT Verbindung
#include 
#include "DHT.h"          //DHT Bibliothek laden

enum class Comand {
              Temperatur ,
              Feuchtigkeit 
            }; 

unsigned long BT_timestore;        //Variable Speicher für Systemzeit
float tempinnen = 0;
float feuchteinnen = 0;
String Temperatur = "";            // a String to hold incoming data
Comand typ = Comand::Temperatur;   // Wird nur bei Bedarf erzeugt
String Luftfeuchte = "";           // a String to hold incoming data
Comand typ = Comand::Luftfeuchte;  // Wird nur bei Bedarf erzeugt
bool stringtempComplete = false;   // wheter the string is complete
bool stringfeuchteComplete = false;// wheter the string is complete

#define DHTPIN 2        //DHT22 wird am Pin2 ausgelesen
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
 Serial.begin(9600);             // Serial port to computer
 HC12.begin(9600);               // Serial port to HC12
 //reserve 200 byzes for the Temp. und Luftfeuchte
 Temperatur.reserve(200);
 Luftfeuchte.reserve(200);
}

void loop()
{
  tempinnen = dht.readTemperature(); //Temperatur innen wird gemessen und gespeichert
  feuchteinnen = dht.readHumidity(); //Luftfeuchte innen wird gemessen und gespeichert

  while (HC12.available())        // If HC-12 has data
  {
  Serial.write(HC12.read());      // Send the data to Serial monitor
  //Senden der Messwerte
    HC12.print (Temperatur);   // Kommando
    HC12.print (",");          // Abgrenzung
    HC12.print (tempinnen);   // Messwert
    HC12.println (";");        // Abgrenzung

    HC12.print (Feuchtigkeit);  // Kommando
    HC12.print (",");           // Abgrenzung
    HC12.print (feuchteinnen); // Messwert
    HC12.println (";");         // Abgrenzung
  }
  while (Serial.available())
  {      // If Serial monitor has data
  HC12.write(Serial.read());      // Send that data to HC-12
  }
  if (stringtempComplete)
  {
    Serial.println(Temperatur);
    //clear the string:
    Temperatur = "";
    stringtempComplete = false;
  }

  if (stringfeuchteComplete)
  {
    Serial.println(Luftfeuchte);
    //clear the string:
    Luftfeuchte = "";
    stringfeuchteComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    Temperatur += inChar;
    Luftfeuchte += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringtempComplete = true;
      stringfeuchteComplete = true;
    }
  }
}

Die Fehlermeldung lautet:

exit status 1 redefinition of 'Comand typ'

Ich verstehe das nicht. Wenn ich die Zeile als Kommentar vernachlässige: // Comand typ = Comand::Luchtfeuchte; Meckert er, dass Feuchtigkeit nicht definiert ist.

Freue mich über weitere Hilfestellungen.

Lt. welchen Hinweisen ?
Kannst du das nicht zitieren oder beischreiben ?

HotSystems: Warum siehst du dir nicht die Beispiele an, die ich in Post #26 verlinkt habe. Da ist alles sehr genau beschrieben und funktioniert.

Auf der Seite finde ich am Ende nur ein Beispiel zur Parametrierung des HC-12 Moduls. Ich wüsste nicht, wie ich das für mich anwenden könnte.

Ich freue mich, wenn du mich eines besseren Belehren könntest.