Empfangende Daten vom 433 MHz Sender anders darstellen lassen

Hallo liebes Forum,

Im letzten Beitrag hatte ich versucht gehabt Temperatur/Luftfeuchtigkeitsdaten drahtlos an den Arduino mega zu übermitteln, Was mit Hilfestellung auch Wunderbar funktionierte.
Alerdings werden die Empfangenden Daten wie folgt angezeigt:

22.40
60.20
22.40
60.20
und so weiter...

nun will ich das es wie folgt dargestellt wird in der Seriellen Ausgabe des Empfänger Arduinos:

Outdoor: 22.80 °C
Outdoor: 59.30 %RH

Da wäre meine frage ob man das am Sender oder am Empfänger Arduino einstellt und wie ich da vorangehen soll.

Vielen dank im vorraus :innocent:

Der Sketch zum Senden:

#include <RH_ASK.h>
#include <SPI.h> // Nicht wirklich benötigt, wird jedoch für die Kompilierung benötigt
RH_ASK driver(2000, 11, 12, 0); // Empfänger an Pin 3 und Sender an Pin 4

#include <INTERVAL.h> // Die INTERVAL-Bibliothek ist mir nicht bekannt, möglicherweise benötigen Sie eine andere oder keine zusätzliche Bibliothek

#include "DHT.h"
#define DHTPIN 10 // Sensor am Pin 2 anschließen
#define DHTTYPE DHT22 // Typ des Sensors: DHT22
DHT dht(DHTPIN, DHTTYPE); // Sensor wird mit „dth“ angesprochen

void setup()
{
    dht.begin(); // DHT22-Sensor starten
    Serial.begin(9600); // Debugging nur für serielle Ausgabe
    if (!driver.init())
        Serial.println("RadioHead Initialisierung fehlgeschlagen");
}

void loop()
  {
    INTERVAL(180000UL)  // 20000ms
{
    sendeTemperatur();
    delay(10);
    sendeLuftfeuchtigkeit();
  }
}

void sendeTemperatur()
{
    float Temperatur = dht.readTemperature(); // Temperatur auslesen und in "Temperatur" speichern
    if (!isnan(Temperatur)) // Überprüfen, ob eine gültige Temperatur abgelesen wurde
    {
        char msg[8]; // Puffer groß genug für eine 7-stellige Fließkommazahl
        dtostrf(Temperatur, 6, 2, msg); // In Zeichenkette konvertieren
        driver.send((uint8_t *)msg, strlen(msg));
        driver.waitPacketSent();
        Serial.println("Outdoor: " + String(Temperatur) + " °C");
    }
    else
    {
        Serial.println("Fehler beim Lesen der Temperatur!");
    }
}

void sendeLuftfeuchtigkeit()
{
    float Luftfeuchtigkeit = dht.readHumidity(); // Luftfeuchtigkeit auslesen und in "Luftfeuchtigkeit" speichern
    if (!isnan(Luftfeuchtigkeit)) // Überprüfen, ob eine gültige Luftfeuchtigkeit abgelesen wurde
    {
        char msg[8]; // Puffer groß genug für eine 7-stellige Fließkommazahl
        dtostrf(Luftfeuchtigkeit, 6, 2, msg); // In Zeichenkette konvertieren
        driver.send((uint8_t *)msg, strlen(msg));
        driver.waitPacketSent();
        Serial.println("Outdoor: " + String(Luftfeuchtigkeit) + " %""RH");
    }
    else
    {
        Serial.println("   }
    else
    {
        Serial.println("Fehler beim Lesen der Luftfeuchtigkeit!");
    }
}

Der Sketch zum Empfangen:

#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile
RH_ASK driver(2000, 11, 12, 0); //Empfänger an 3 und Sender an 4

void setup()
{
  Serial.begin(9600);  // Debugging only
  if (!driver.init()) Serial.println("init failed");
  else Serial.println("Alles OK");
}

void loop()
{
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  uint8_t buflen = sizeof(buf);

  static char StringReceived[15];
  if (driver.recv(buf, &buflen)) // Non-blocking
  {
    int i;
    //driver.printBuffer("Got:", buf, buflen);
    for (i = 0; i < buflen; i++)
    {
      StringReceived[i] = char(buf[i]);
    }
    Serial.println(StringReceived);
    
  }
}

Hallo,
ich hatte dir doch schon den Vorschlag gemacht, es im seriellen Monitor zu machen.

Z. B. so:

Serial.print("Temperatur: ");
Serial.print(StringReceived);
Serial.println("°C");

sowas änliches hatte ich schon versucht gehabt, auch mit ähnlichen Codes. Das Problem was dann das dies nie richtig dargestellt wurde.

So sahr das dann immer aus, oder Ähnlich

Temperatur:  °C
Temperatur:  2°C
Temperatur:  26°C
Temperatur:  26.°C
Temperatur:  26.4°C
Temperatur:  26.40°C
 26.40
Temperatur:  26.40°C
Temperatur:  26.40°C
Temperatur:  26.40°C
Temperatur:  26.40°C
Temperatur:  26.40°C
Temperatur:  26.40°C
 26.40
Temperatur:  26.40°C

So sieht das dann ungefähr aus, in dem fall steht die Luftfeuchtigkeit auch unter Temperatur
Outdoor: 45.30°C
Outdoor: 45.30%RH

Ähnlich kann auch Fehler haben.

Dann zeig doch wie der Empfänger Sketch aussieht.

#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile
RH_ASK driver(2000, 11, 12, 0); //Empfänger an 3 und Sender an 4

void setup()
{
  Serial.begin(9600);  // Debugging only
  if (!driver.init()) Serial.println("init failed");
  else Serial.println("Alles OK");
}

void loop()
{
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  uint8_t buflen = sizeof(buf);

  static char StringReceived[15];
  if (driver.recv(buf, &buflen)) // Non-blocking
  {
    int i;
    //driver.printBuffer("Got:", buf, buflen);
    for (i = 0; i < buflen; i++)
    {
      StringReceived[i] = char(buf[i]);
      
    }
Serial.print("Temperatur: ");
Serial.print(StringReceived);
Serial.println("°C");
Serial.print("Luftfeuchtigkeit: ");
Serial.print(StringReceived);
Serial.println("%RH");

  }
}

Da sieht die ausgabe dann so aus:
Temperatur: 45.70°C
Luftfeuchtigkeit: 45.70%RH

Ok...sorry.
Hatte übersehen, dass du zwei Werte direkt hintereinander sendest.
Das muss dann anders gelöst werden.

Ich werd mal schauen.
Evtl. hat da ja noch jemand hier direkt eine Lösung parat.

Hallo,
habe da eine Lösung, bitte die Kommentare beachten !!
Die Lösung ist für die Temperatur, für Luftdruck kannst du ja anpassen.

// Im Empfänger-Sketch diesen Wert höher setzen:
static char StringReceived[20];

// Diesen Teil im Sender anpassen
void sendeTemperatur()
{
  float Temperatur = dht.readTemperature(); // Temperatur auslesen und in "Temperatur" speichern
  if (!isnan(Temperatur)) // Überprüfen, ob eine gültige Temperatur abgelesen wurde
  {
    char msg[8]; // Puffer groß genug für eine 7-stellige Fließkommazahl
    dtostrf(Temperatur, 6, 2, msg); // In Zeichenkette konvertieren

// einfügen ------------------------------------------------------------
    char result[30] = "Outdoor: ";
    strcat (result, msg);
    strcat (result, " °C ");
    Serial.println(result);
    driver.send((uint8_t *)result, strlen(result));
// Ende einfügen ------------------------------------------------------------
    // driver.send((uint8_t *)msg, strlen(msg));  dies entfernen
    driver.waitPacketSent();
    Serial.println("Outdoor: " + String(Temperatur) + " °C");
  }
  else
  {
    Serial.println("Fehler beim Lesen der Temperatur!");
  }
}

Am einfachsten im Serial.print pausen einfügen, plus mit If arbeiten
Bestimmt irgend wann nutzt du ein Display da kommst du nicht drüber formatieren lernen, ein wenig muß man selber üben :wink:

Hallo,

ich habe dies alles übernommen und dementsprechend in meine Sketches integriert. Funktioniert wunderbar.

Allerdings habe ich den Sketch etwas angepasst und die zweite Nachkommastelle der Zahlen entfernt zur besseren Lesbarkeit. Allerdings werde ich später die 2€ Sende/Empfangsmodule durch etwas hochwertigeres ersetzten, da manchmal nur die Temperaturdaten empfangen werden und umgekehrt, immer dann wenn die Antennen nicht genau auf einander gerichtet sind, in einer Entfernung von 80cm. Ich bin von den Modulen nicht begeistert.

Aber an dieser stelle schonmal vielen dank @HotSystems

Hier der angepasste geänderte Code:

#include <RH_ASK.h>
#include <SPI.h> // Nicht wirklich benötigt, wird jedoch für die Kompilierung benötigt
RH_ASK driver(2000, 11, 12, 0); // Empfänger an Pin 3 und Sender an Pin 4

#include <INTERVAL.h> // Die INTERVAL-Bibliothek ist mir nicht bekannt, möglicherweise benötigen Sie eine andere oder keine zusätzliche Bibliothek

#include "DHT.h"
#define DHTPIN 10 // Sensor am Pin 2 anschließen
#define DHTTYPE DHT22 // Typ des Sensors: DHT22
DHT dht(DHTPIN, DHTTYPE); // Sensor wird mit „dth“ angesprochen

void setup()
{
    dht.begin(); // DHT22-Sensor starten
    Serial.begin(9600); // Debugging nur für serielle Ausgabe
    if (!driver.init())
        Serial.println("RadioHead Initialisierung fehlgeschlagen");
}

void loop()
  {
    INTERVAL(180000UL)  // 20000ms
{
    sendeTemperatur();
    delay(5);
    sendeLuftfeuchtigkeit();
  }
}

void sendeTemperatur()
{
  float Temperatur = dht.readTemperature(); // Temperatur auslesen und in "Temperatur" speichern
  if (!isnan(Temperatur)) // Überprüfen, ob eine gültige Temperatur abgelesen wurde
  {
    char msg[8]; // Puffer groß genug für eine 7-stellige Fließkommazahl
    dtostrf(Temperatur, 4, 1, msg); // In Zeichenkette konvertieren
    char result[30] = "OUT: ";
    strcat (result, msg);
    strcat (result, " °C");
    Serial.println(result);
    driver.send((uint8_t *)result, strlen(result));
    driver.waitPacketSent();
  }
  else
  {
    Serial.println("Fehler beim Lesen der Temperatur!");
  }
}

void sendeLuftfeuchtigkeit()
{
    float Luftfeuchtigkeit = dht.readHumidity(); // Temperatur auslesen und in "Temperatur" speichern
  if (!isnan(Luftfeuchtigkeit)) // Überprüfen, ob eine gültige Temperatur abgelesen wurde
  {
    char msg[8]; // Puffer groß genug für eine 7-stellige Fließkommazahl
    dtostrf(Luftfeuchtigkeit, 4, 1, msg); // In Zeichenkette konvertieren
    char result[30] = "OUT: ";
    strcat (result, msg);
    strcat (result, " %RH");
    Serial.println(result);
    driver.send((uint8_t *)result, strlen(result));
    driver.waitPacketSent();
  }
  else
  {
    Serial.println("Fehler beim Lesen der Luftfeuchtigkeit!");
  }
}

Über die Qualität des Empfängers hatte ich dir ja schon etwas geschrieben. Mit einem besseren Empfänger wird das deutlich besser. Auch deine Antennen sind verbesserungswürdig.
Gut daß es jetzt funktioniert und danke für die Rückmeldung.
Dann kannst du dies ja auch wieder als gelöst markieren.

ja das habe ich tatsächlich vorgehabt. Ich will dieses Display verwenden. Das Problem ist dass, das Display fast den ganzen Arduino in besitz nimmt. Da ich aber den SD-Karten Slot nicht benötige werde ich mit hilfe dierser Pins, LINK1 LINK2 den Platz auf den Arduino abgreifen für den Empfänger und den Sensor. Zusätzlich habe ich mir dieses Buch bestellen lassen für weitere zukünftige Projekte mit dem Arduino

Du bist sehr reicher Mann, solche sachen kauft man nicht bei Ama auch wem man Prime hat .

Zu dem Display, A4 = Resett mit Resett am Arduino und bei der Initialisierung -1eintragen, sonst ist I2C belegt.
meistens hat der den ST7796 verbaut, ist ein Display vom LCD Wicki, dort ist auch Treiberfür den, ob wohl die UTFT sollte den auch kennen

Schön wäre es, mein Vorteil ist das ich das alles über die Ausbildung Finanziell regeln kann.
Solche Projekte werden, sofern sie die Ausbildungsinhalte betreffen auch gerne unterstützt.
Allerdings ist das Buch nur eine Leihgabe, da es jetzt der Ausbildung gehört :grin:

Dieses Buch habe ich auch in anderen Online Schops gesucht, auch auf Seiten wie Thalia usw. Der Preis ist ein Fester Preis und leider nicht billiger zu finden.

ist die RadioHead (<RH_ASK.h>) Library mit den HC-12 Modulen kompaktibel ?
ich hab mich zu dem Modul gerade belesen, sie werden von einigen echt positiv gelobt

Für die HC-12 Transceiver brauchst du keine Library und meines Wissens nach ist die nicht kompatibel dazu.

Edit:
Ok, es gibt in den Beispielen einen "seriellen" Eintrag. Evtl. funktioniert es damit, aber nie getestet, da wie schon geschrieben, eine Library nicht nötig ist.
Ausnahme, wenn man einen Controller mit nur einer seriellen Schnittstelle verwendet, dann wird noch die "SoftwareSerial" benötigt. Damit wird eine weitere serielle zur Verfügung gestellt.
Diese verwendest du um die HC-12 zu steuern.

Das solltest du dir nochmal überlegen.
Einfacher wird es, wenn du ein Display mit eine seriellen SPI-Schnittstelle verwendest.
Diese TFT-Displays benötigen wesentlich weniger Pins und sind auch preiswerter.
Z.B. dieses hier, nur mal als Beispiel. :wink:
Und die sind auch deutlich einfacher zu verwenden.

Der 3,5 ist doch der gleicher :joy:

Welchen genau meinst du ?
Der Link vom TO def. nicht.

Mein Display ist doch auch 3,5" TFT, die Rückseite beider Displays ist zu 90% gleich.

AHH, bei Reichelt Mein link steht LCD, und auf der Platine Steht TFT, sehr verwirrend zugegeben