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
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.
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
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:
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 ?
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.
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
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
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";
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