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