Arduino Wetterdaten per Funk übertragen

Hallo Liebes Forum,
ich wollte mit hilfe eines Temperatur- / Luftfeuchtigkeitssensor, DHT22 die wetterdaten vom Arduino Mega mit hilfe des DEBO 433 MHz RX/TX Modul an mein Arduino Uno senden und am Seriellen Monitor anzeigen lassen. Ich habe für beide Arduinos ein Code zum messen und Senden der Wetterdaten erstellt.

Arduino Mega, zum auslessen der Wetterdaten und zum Senden:

#include <RCSwitch.h> // 433 MHz RX/TX Sendemodul
RCSwitch mySwitch = RCSwitch();

#include "DHT.h"
#define DHTPIN 2 //Sensor = Pin 2
#define DHTTYPE DHT22    // Temperatur-Luftfeuchtigkeitssensor, DHT22
DHT dht(DHTPIN, DHTTYPE); //Wird mit „dth“ angesprochen



void setup()
{
    dht.begin(); //DHT22 Sensor startet
    mySwitch.enableTransmit(10); //wird an Pin 10 angeschlossen
}

void loop()
{
    delay(2000); //Zwei Sek. warten bis zur Messung (Sensor ist langsam)
    float Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
    float Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
    mySwitch.send(Temperatur, Luftfeuchtigkeit);
    delay(5000); //5 Sek. warten zum schonen des Akkus

Arduino Uno, zum Empfangen der Daten:

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {
  mySwitch.enableReceive(0);  // Empfänger ist an Interrupt-Pin "0" - Das ist am UNO der Pin2
}

void loop() {
  if (mySwitch.available())  // Wenn ein Code Empfangen wird...
  {
    int Luftfeuchtigkeit = mySwitch.getReceivedValue();
    int Temperatur = mySwitch.getReceivedValue();  // Empfangene Daten werden unter der Variable "value" gespeichert.
    Serial.print(Temperatur);
    Serial.print(Luftfeuchtigkeit);
  }
  mySwitch.resetAvailable();  // Hier wird der Empfänger "resettet"
}

Alerdings bekomme ich am Serellen Monitor nichts angezeigt, ich komme einfach nicht dahinter worann es legen könnte.
Im Code ist mir nichts aufgefallen, falls am Code was nicht stimmen sollte bitte ich um verständniss, da ich erst seid neustem angefangen habe mit dem Arduino zu arbeiten

Vielen dank für eure Hilfe und unterstützung, im vorraus :grin:

Hallo,
die Library RCSwitch ist wie der Name andeutet, zum Schalten gedacht.
Um Daten zu übertragen ist die Library VirtualWire, oder besser, weil neuer, die Library RadioHead gedacht und besser geeignet. Z.B. kann der Sender mit float-Werten direkt nichts anfangen. Evtl. kürzt er die Ausgabe oder sendet nichts.
Das müsste dann als Fehlermeldung angezeigt werden.

Zeige bitte mal die Sende- und Empfangsmodule als Link, die du verwendest.
Auf jeden Fall sind die HC-12 besser für deine Anwendung geeignet.

Das Problem ist, das ich nur diese Sende/empfangsmodule nutzen kann "LINK"
da ich dieses Projekt (Freizeitmäßig) in der Ausbildung mache und dort nur die Möglichkeit haben bei reichelt und bei Connrad zu bestellen, dort gibt es die HC-12 Module leider nicht.


Alternativ werde ich die HC-12 Module Privat Kaufen

fehlermeldung gibt es tatsächlich garkeine

Ich hab auch mal sowohl die radiohead als auch die rcSwitch bibliothek ausprobiert. Code für sender und empfänger ist hier drin:

Kannst durch aus-/einkommentieren die eine oder andere lib testen. Ich sehe bei dir keine wahl der pins. Würde also auf den hardwareaufbau tippen. Hatte bei mir auch kurz gedauert bis man das alles richtig zugeordnet hat. Würde erstmal nicht sofort die Hardware über den Haufen werfen und neues bestellen. Für nen tischaufbau sollte das reichen und es sollte was ankommen. Am besten ne skizze vom Aufbau (Schaltplan) machen und dreifach damit den Aufbau abgleichen :grin:

Dann solltest du das in der IDE einstellen, z.B. so:

Und ok, wenn du keine anderen Module verwenden kannst, gehen die auch. Halt nicht sehr zuverlässig. Auch größere Reichweiten sind kaum möglich.
Aber nochmal, verwende die andere Library. Damit wird es funktionieren.

Ich sehe in Deinen Skech aber noch ein weiteres Problem: Senden willst Du FLOAT, aber im Empfänger weisst du den empfangenen Wert einem INT zu. Also selbst wenn Du den Floatwert gesendet bekommst, beim Empfang gehen Dir die Nachkommastellen verloren, wenn Du das Empfangene einem int zuweist. Also entweder sender und empfäneg als float (wenn das die lib zulässt) oder beides als int. wenn das mit loat von der lib nicht geht, und Du die Nachkommastellen benötigst, Kannst den Wert vor dem senden mit 10 oder 100 multiplizieren (so dass keine Nachkommastele mehr vorhanden ist) Und nach dem Empfangenden it wieder durch den gleichen Faktor dividieren und nem float zuweisen, damit Du wieder den oroiginal Wert bekommst.

ich habe die andere Library eingebunden, so wie ich das verstehe benötigt mann für die andere Library (RadioHead) wohl das HC-12 Modul
da mein Modul nicht die Pins hat für:

//             /*uint8_t rxPin*/9, 
//             /*uint8_t txPin*/8, 
//             /*uint8_t pttPin*/10);

zudem bekomme ich dann folgende Fehlermeldung, siehe Bild

So wie ich die fehlermeldung verstehe weiß das Pogramm nichts mehr anzufangen mit "mySwitch"
Wie muss ich das abändern, das mySwitch jetzt Radiohead ist ?

Hallo,

bitte keine Bilder Posten. Die kann nicht jeder (Handy o.ä.) sehen.
Immer den Sketch und Fehlermeldungen direkt in Code-Tags posten.

Du musst auch den Sketch an die Library anpassen. Sieh dir dazu die Beispiele in der Library an.
Da ist alles ganz genau hinterlegt.
Und die Pinbezeichnung bezieht sich auf den Uno bzw. Mega, nicht auf den Sender oder Empfänger. Auch hat das nichts mit dem HC-12 zu tun.
Sorry dafür, vergiss erst mal den HC-12.

Hier Library RadioHead gehst du in ASK und siehst dir die Beispiele an.

Wenn man nichtmehr benutzt ja, habe aber nicht in Code geschaut, ist mir alles zu klein am telefon :wink:

ich hab es mir zu Herzen genommen und angesehen, (sorry wenn ich so oft nachfragen muss, ich habe noch nicht so oft mit dem Arduino gearbeitet)
ich habe das Beilspiel von github angeschaut und versucht es mit meinem Sketch zu kombienieren, allerdings bekomme ich folgende fehlermeldung:

warning: statement has no effect [-Wunused-value]
const char *msg = "Temperatur"; "Luftfeuchtigkeit";
^
warning: unused variable 'Luftfeuchtigkeit' [-Wunused-variable]
uint8_t Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
^~~~~~~~~~~~~~~~
warning: unused variable 'Temperatur' [-Wunused-variable]
uint8_t Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
^~~~~~~~~~
warning: statement has no effect [-Wunused-value]
const char *msg = "Temperatur"; "Luftfeuchtigkeit";
^
warning: unused variable 'Luftfeuchtigkeit' [-Wunused-variable]
uint8_t Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
^~~~~~~~~~~~~~~~
warning: unused variable 'Temperatur' [-Wunused-variable]
uint8_t Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
^~~~~~~~~~

Der neue Code sieht so aus:

#include <RH_ASK.h>
#include <SPI.h> 
#include "DHT.h"
#define RHPIN 0
#define DHTPIN 2 //Sensor = Pin 2
#define DHTTYPE DHT22    // Temperatur-Luftfeuchtigkeitssensor, DHT22
DHT dht(DHTPIN, DHTTYPE); //Wird mit „dth“ angesprochen

RH_ASK driver;

void setup()
{
    if (!driver.init())
    dht.begin(); //DHT22 Sensor startet
}

void loop()
{
    delay(2000); //Zwei Sek. warten bis zur Messung (Sensor ist langsam)
    uint8_t Luftfeuchtigkeit = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
    uint8_t Temperatur = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
    const char *msg = "Temperatur"; "Luftfeuchtigkeit";
    driver.send((uint8_t *)msg, strlen(msg));
    driver.waitPacketSent();
    delay(180000); //3 Minuten warten, zum schonen des Akkus
}

Da hat sich wohl noch ein fehler eingeschlichen den ich nicht so ganz verstehe

Nimm die "" Zeichen aus den Kommentaren raus :wink:
Der compieler mein es ist Ende mit dem Kommentar.

Mit delay spart man kein Strom die CPU arbeitet weiter nur dein Programm "steht".
Es gibt noch andere Fehler zu beseitigen.
Am Telefon sowas Mache nicht :wink:

Temperatur ist eine Variable, die gleich bei der Definition den Wert der Methode (Funktion) dht.readTemperature() bekommt, aber nicht weiter verwendet wird.
"Temperatur" ist ein fester Text. Den Text kannst du zwar senden, das bringt nur nicht so viel.

Mein Tipp für dein Vorhaben:
Mache es Step by Step....

Baue erstmal die Beispiele aus de Library "RadioHead" für Sender und Empfänger nach.
Wenn das funktioniert, kannst du diese um deine Wetterdaten-Funktionen erweitern.

Wenn die Übertragung funktioniert, bist du sicher das da kein Fehler mehr vorhanden ist.

Du darfst z.B. eine Variable, die ständig andere Werte bekommt, nicht mit const (konstant) definieren. const char *msg = "Temperatur"; "Luftfeuchtigkeit";

habe was für dich :wink:

Wen du das durch hast bau dir was.
Es wird die RCSwitch.h benutzt
Dort ist auch wie man Messdaten überträgt.
Habe die Dinger nicht nur nRF24, und die arbeiten ein wenig anders :roll_eyes:

Ich wollte das jetzt nach bauen mit dem Sketch von Github, dieser Code scheind wohl auch nicht ganz zu stimmen ?

zumindest bekomme ich die fehlermeldung,

n file included from 
#warning RH_LoRaFileOps unfinished [-Wcpp]
 #warning RH_LoRaFileOps unfinished
  ^~~~~~~
warning: unused variable 'i' [-Wunused-variable]
  int i;
      ^

Ich vermute mal, du hast ein falsches Beispiel genommen.

einmal ask_receiver.pde und ask_transmitter.pde

so wie ich weis ist das für ganz anderes, nämlich für Long Range Wide Area Network. ok könnte man auch machen nur wo zu mit Lastwagen Handwagen ziehen :wink: