Probleme bei Funkübertragung 433 MHz

Hallo zusammen,

ich bin neu in diesem Forum und beschäftige mich erst seit Kurzem mit den Arduinos und dessen
Möglichkeiten.
Ich habe bisher div. LEDs zum Blinken und Laufen gebracht, LCD verwendet, div Sensoren lokal
ausgewertet …

Ich scheitere aber nun an einer 433Mhz Funkübertragung bzw. Darstellung am LCD und SerialMonitor
und bräuchte mal bitte einen Tipp (bevor ich die Dinger als Deko an die Wand nagele ;-((( )
Ziel sollte eine Wetterstation werden, die die Daten (Temp. Luftdruck und -feuchte) per 433 Mhz
übertragen kann…
Zum Test und Problemdarstellung habe ich hier nur mein TestProgramm gepostet, das Problem im
Hauptprg. ist aber exakt das gleiche …

Mein Problem ist, dass der Empfang am Uno (Darstellung am LCD und SerialMonitor des Empfängers)
nur eine gewisse Zeit sauber funktioniert.

Mein Nano sendet (stabil) eine Schleife… “Nano sendet: 0-29”
(Ausgabe der Variable im SerialMonitor des Senders immer ok.)

Mein Uno empfängt anfänglich (nach dem Start) IMMER den korrekten String den der Sender momentan
sendet. Wenn ich den Empfänger (Uno) neu starte erhält er den String den der der Sender (Nano) im
SerialMonitor aktuell ausgibt und sendet.

Manchmal früher, mal später wird der String “gekürzt” bzw. wird noch kürzer und bleibt bis zum
Neustart (Reset per Taste) oder erneutem Öffnen des SerialMonitors “gekürzt”.

Das Problem ist bei kurzem (0,5m) oder weiterem (8m) Abstand identisch,
zusätzliche beidseitige Antennen (17,3cm Draht, gerade) und Spannungserhöhung am Sender haben
auch nichts verändert …
auch eine schrittweise Veränderung der Bautrate brachte nichts …

Das Problem tritt unregelmäßig auf, manchmal erst nach 50 korrekt empfangenen Daten …

Auszug SerialMonitordes Empfängers

Erhalte: Nano sendet: 20 korrekte Ausgaben
Erhalte: Nano sendet: 21
Erhalte: Nano sendet: 22
Erhalte: Nano send gekürzte fehlerhaft Ausgabe
Erhalte: Nano send
Erhalte: Nano send
Erhalte: Na weiter gekürzte fehlerhafte Ausgabe
Erhalte: Na
Erhalte: Na
Erhalte: Na

Hinzu kommt, dass !nur im LCD! ein mir unbekanntes Sonderzeichen am Ende der Zahl habe
zB. “Erhalte: Nano sendet: 22x” , wobei an “x” ein mir unbekanntes Zeichen dargestellt wird.

Habe ich einen Fehler im Code (itoa, Char Buffer …??) oder war der Sender und/oder Empfänger zu
billig?
http://www.ebay.de/itm/191627177096?_trksid=p2057872.m2749.l2648&ssPageName=STRK:MEBIDX:IT
Wenn es an der China-Billig-Variante liegen sollte … könnt ihr mir bitte einen guten Sender/Empfänger
empfehlen?
(Frequenz ist egal, 50m sichtfrei + Hauswand müssen überbrückt werden)

hier mein zusammengebastelter Code … (ich bin Anfänger, übe noch ;-))) )

  // Code (Sender) Nano mit 433-Sender an P12

#include <VirtualWire.h>      // Library für Sendemodul

void sendString(String message, bool wait)
{
 byte messageLength = message.length() + 1; 
 // convert string to char array
 char charBuffer[messageLength]; 
 message.toCharArray(charBuffer, messageLength);
 vw_send((uint8_t *)charBuffer, messageLength); 
 if (wait) vw_wait_tx(); 
}


void setup() 
{
 Serial.begin(9600); 
 // virtual wire
 vw_set_tx_pin(12); // pin
 vw_setup(1000);    // bps max. 10000
}


void loop()
{
 int i = 0;
 String Nachricht = "Nano sendet: ";
 char Buffer[2];
   while (i<30)  
   { 
   itoa( i, Buffer, 10 );
   String Message = Nachricht + Buffer;
   sendString(Message, true); 
   delay(3000); 
   i++;
   }
}
// Code (Sender)  Ende
---------------------------------------------



// Code (Empfänger) Uno mit 433-Empfänger an P8 und LCD Display
#include <VirtualWire.h>
byte message[VW_MAX_MESSAGE_LEN];          // a buffer to store the incoming messages
byte messageLength = VW_MAX_MESSAGE_LEN;   // the size of the message

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
 Serial.begin(9600);  
 vw_set_rx_pin(8);
 vw_setup(1000);     // bps max. 10000
 vw_rx_start();
 lcd.begin(16, 2);   //Anzahl Spalten, Zeilen des LCD
}


void loop()
{
 if (vw_get_message(message, &messageLength)) // non-blocking
 {
   Serial.print("Erhalte: ");
   lcd.setCursor(0, 0);  //Spalte, Zeile
   for (int i = 0; i < messageLength; i++)
   {
   Serial.write(message[i]);
   lcd.write(message[i]); 
   }
   Serial.println();
 }
 //lcd.clear();      // LCD löschen 
 //lcd.print("                 ");
}
// Code (Empfänger) Ende

Danke

Herzlich willkommen im Forum.

Erste Anmerkung:
Der Empfänger ist tatsächlich sehr schlecht.
Auf dem “platten” Land hast du damit wahrscheinlich keine Problem, aber in einer größeren Stadt wirst du damit zu viel “Müll” empfangen und damit bei der von dir gewünschten Reichweite Probleme bekommen, bzw. nicht richtiges empfangen. Die Technik ist aus den 20er Jahre (Pendler) und heute nicht mehr stand der Technik.

Soweit ich den Code überschaue, ist der ok.
Du solltest diesen aber in Code-Tags “</>” hier einsetzen. Das kannst du auch jetzt noch machen. Bearbeite einfach deinen Post. Dann wird dieser lesbarer.

Meine Empfehlung, nimm diesen Empfänger:
http://www.amazon.de/Sensitivity-Wireless-Control-Receiver-Vorstand/dp/B00EQ1UK68/ref=pd_sim_21_1?ie=UTF8&refRID=1DTHF17JVPRJPVN5HVWD&dpSrc=sims&dpST=AC_UL160_SR160%2C160
Damit wirst du auch die gewünschte Reichweite erzielen.

Das zusätzliche Problem ist die schnelle Übertragung.
Erhöhe die Pause beim Senden. Du solltest max. alle 10 Sek. senden und dann zur Sicherheit jede Aussendung 2bis3 mal senden. Das liegt daran, dass das verwendete Frequenzband von jedem genutzt werden darf und du immer Störungen haben kannst.

Ach und eine weitere Fehlerquelle kann der SerialMonitor sein, der den Empfang auch verzögert.
Schalte den mal beim Empfänger aus. Du zeigst ja eh im LCD das Signal an.

Versuche auf die String's zu verzichten

ardubu: Versuche auf die String's zu verzichten

Ich kann mir nicht vorstellen, das die Strings das Problem sind.

Ich sende auch Strings, nur bei ihm wird es die Zeit sein. Er sendet zu schnell und da ist der Empfänger noch nicht fertig.

Er könnte auch die Datenübertragung erhöhen, auf 2000 setzen.

Ich sende auch Strings, nur bei ihm wird es die Zeit sein. Er sendet zu schnell und da ist der Empfänger noch nicht fertig.

Er sendet max 16 Byte, dass sollte bei 1000 bps nach ca. 8ms erledigt sein, vorm Nächsten senden macht er 3 sec. Pause

ardubu: Er sendet max 16 Byte, dass sollte bei 1000 bps nach ca. 8ms erledigt sein, vorm Nächsten senden macht er 3 sec. Pause

Theorie und Praxis!

Das mag in der Theorie stimmen, aber in der Praxis sieht es bei diesen Modulen leider anders aus. Ich habe da schon einiges an Zeit reingesteckt und kennen lernen müssen, das hier Pausen wichtig sind. Erst recht bei den billigen "Müll"-Empfängern.

Ich vermute, dass der TO sehr viel Störungen in seinem 433 MHz-Umfeld hat, die das Ganze negativ beeinflussen.

Er wird mit einem besseren Empfänger und einer größeren Pause (ist auch Pflicht, da ISM-Band) zwischen den Aussendungen bessere Ergebnisse erzielen.

Vorab erst mal Danke für eure Tipps ...

werde ich nach Weihnachten testen und berichten ;-))) Sollte ich Sender UND Empfänger tauschen, oder "reicht" der verlinkte Empfänger ? Sorry habe davon noch keine Ahnung - passt das zusammen?

Die Häufigkeit der Sendungen hatte ich vorher testweise schon mal auf 6000millis, (später Echtbetrieb > 5-10Min.) und nur heruntergesetzt um den Test zu beschleunigen, werde ich aber mal deutlich erhöhen

Danke ... bis denne

Der vorhandene Sender passt zum neuen Empfänger.

wenn du nicht ganz so viel für den Empfänger ausgeben willst, tut's der auch ganz gut: RXB12 433MHz Empfänger

ardubu: wenn du nicht ganz so viel für den Empfänger ausgeben willst, tut's der auch ganz gut: RXB12 433MHz Empfänger

Ja, billiger geht immer, aber achte bitte auch auf die Qualität.

Der arbeitet auch mit einer quarzstabilisierten ZF im Gegensatz zum LC Schwingkreis des XY-MK-5V

ardubu:
Der arbeitet auch mit einer quarzstabilisierten ZF im Gegensatz zum LC Schwingkreis des XY-MK-5V

Dann sieh dir den Empfänger genau an.
Da kann man nicht von Qualität sprechen, ich sehe da keinerlei Filter für die ZF, das bedeutet keine Großsignalfestigkeit, ähnlich schlecht wie ein Pendler. Und lt. Angabe eine deutlich geringere Empfindlichkeit gegenüber meinem Beispiel.

Also auch hier meine Empfehlung, Abstand nehmen.
Warum für nur 3,50€ Mehrkosten auf Qualität verzichten.

Aber egal, der TO muss dies entscheiden.

Ich habe mal die Schaltung von oben mit dem billigen Sender und Empfänger nachgebaut und die Sketche von oben hochgeladen, läuft seit einer Stunde, ohne Probleme, ich kann deinen Fehler nicht nachvollziehen. Ich habe sogar das Senden auf einmal je Sekunde erhöht, auch da gibt es keine Probleme.

Nachtrag: Wenn der Fehler bei dir weiterhin auftritt, verbinde dach mal den Pin 12 des Nano mit dem Pin 8 des Uno und GND mit GND, dann siehst du ob es am Funkmodul liegt

@ardubu Dann hast du durchaus Glück, dass in deiner Nähe keine 433MHz Störungen sind. Wenn die vorhanden sind, wird es deutlich schwieriger.

Allerdings wirst du mit dem "billigen" Empfänger keine 50 Meter Reichweite erzielen. Ich habe es bei mir nie erreicht.

Dein Problem hat mir keine Ruhe gelassen. Beim Vergleich meines Sketches mit deinem ist mir aufgefallen das ich den ganzen LCD Teil rausgelassen habe und die Deklaration der Variablen byte message[VW_MAX_MESSAGE_LEN] und byte messageLength = VW_MAX_MESSAGE_LEN; lokal in der Loop vorgenommen habe, daher werden sie in jedem Loopdurchlauf auf 0 gesetzt und bei dir nicht. Nachdem ich sie auch global deklariert habe, konnte ich deinen Fehler nachvollziehen.

Und zu welchem Ergebnis kommst du jetzt? Das interessiert mich sehr.

Und zu welchem Ergebnis kommst du jetzt? Das interessiert mich sehr.

Das die genannten Variablen entweder lokal in der Loop deklariert werden müssen, oder in der Loop auf 0 gestezt werden müssen, damit es zu keinem Überlauf kommt.

Das ist einleuchtend, mich wundert allerdings dass der empfangene Text nicht sofort gekürzt wird. Das würde bei einem Überlauf normal sofort eintreten.

Das würde bei einem Überlauf normal sofort eintreten.

Das tritt auch sofort beim Überlauf ein, aber der Überlauf kommt erst mit dem 256sten Bit

ardubu: Die Deklaration der Variablen byte message[VW_MAX_MESSAGE_LEN] und byte messageLength = VW_MAX_MESSAGE_LEN; lokal in der Loop vorgenommen habe....

Danke Ardubu,

das Verlegen der og. Variablen in die Loop hat das Problem beseitigt ;-)))).

Ich habe (nach einem breitem Grinsen) meine Testzählschleife auf 50000 hochgesetzt und es läuft und läuft .. fehlerfrei. Reichweite (Sender mit 9V und 17cm Drahtantenne) ca. 12m frei Strecke + Hauswand)

Der Sender verträgt 12 V, Antenne kann auch noch optimiert werden ... da geht noch was ;-))))

Danke, aber auch für die anderen Tipps