PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RF433 Mhz Sender / Receiver - Übertragen von Werten



piggituX
06.02.2017, 17:01
Hi,

ich baue gerade eine Temperatur Überwachung und habe das Ganze nun erweitert um die Werte via RF433 MHz zu übertragen.

Vom Prinzip funktioniert das Ganze, aber irgendwie will es mir nicht gelingen, das die Werte sauber angekommen.
Ich benutze die VirtualWire Lib


funktionierter Sender-Programm-Auszug:



.
.
.
.
const char *toSend = "24,48,1009";
vw_send((uint8_t *)toSend, strlen(toSend));
vw_wait_tx();
delay(200);

.
.
.
.


funktionierter Empfänger-Programm-Auszug:


.
.
.
.
if (vw_get_message(buf, &buflen)) // check to see if anything has been received
{
int i;
for (i = 0; i < buflen; i++)
{
Serial.print((char)buf[i]); // the received data is stored in buffer
StrReceived[i] = char(buf[i]); // data to array
}
// split data into array sensorData
sscanf(StrReceived, "%d,%d,%d", & sensor[0], & sensor[1],& sensor[2]); // Converts a string to an array

// }

// for (int i = 0; i < maxSensorData; i++){ // nice output
// Serial.print("Sensor"); Serial.print(i); Serial.print(":");
// Serial.print(sensor[i]); Serial.print("\t");
// }
Serial.println(""); // linefeed
// reset variable StringReceived
// memset(StrReceived, 0, sizeof(StrReceived));
// delay(1000);
}

display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Temperatur: ");
display.print(sensorData[0]);
display.println(" *C");
// display.display();
// display.clearDisplay();

display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Pressure: ");
display.print(sensorData[2]);
display.println(" hPa");

display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Approx. Alt: ");
// display.print(bme.readAltitude(SEALEVELPRESSURE_HP A));
display.println(" m");

display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Humidity: ");
display.print(sensorData[1]);
display.println(" %");
display.display();
delay(5000);
display.clearDisplay();


}
.
.
.
.


wenn ich nun den statischen String umbaue, um die Messwerte zu übertragen funktioniert es nicht mehr.

nicht funktionierter Sender-Programm-Auszug:



.
.
.
.
void Read_Sensor4() {
alt = (bme.readAltitude(SEALEVELPRESSURE_HPA));
//alt = 300;
itoa(alt, msg1, 10);
}


void Send_Data() {
//strcat(msg1, msg0);
//strcat(msg1, msg2);
//strcat(msg3, msg0);
//strcat(msg3, msg4);

strcat(toSend, msg1);
strcat(toSend, msg0);
strcat(toSend, msg2);

vw_send((uint8_t *)toSend, strlen(toSend));

vw_wait_tx();
delay(200);

.
.
.
.


ich sehe zwar im Monitor, das die Werte ausgelesen werden und, aber es kommt nichts mehr an... interessant je länger es läuft desto länger wird die Zeile ich weiss nur nicht ob es am Monitor liegt oder ob es ein Fehler ist. er bufft die irgendwie zwischen. jemand ähnlich Erfahrungen gemacht ? oder fehlt mir nur Programm Verständnis

cYa

piggituX
06.02.2017, 22:45
bin nun ein Stückchen weiter, aber generell ist das RF433 doch echt murks, was die Reichweite angeht und gute Übertragung :)

Rabenauge
06.02.2017, 23:50
https://alexbloggt.com/fenstersensoren-arduino/

Da steht, dass man bessere Empfänger benutzen sollte...

piggituX
07.02.2017, 07:18
moin,

was mich gerade so nervt ist, schicke ich eine statische Messung kann ich locker 10m entfernt sein, und das kommt an. Auch das Senden eines einfachen On / Off funktioniert ohne Probleme ...... nur wenn man mehr als das schickt , will es nicht so richtig.

vielleicht sollte ich die andere Lib testen.

oder ich überspinge V2 und gehe gleich zu V3 über und baue es mit nem ESP8622 nochmal neu auf.

Ceos
07.02.2017, 07:48
ESP32, der hat auch BT mit drinne :) aber die Lib ist leider immernoch SEHR Basic, du brauchst schon ein gutes BTLE Buch um die Config für den GATT Server zu verstehen XD

Ein Kollege von mir arbeitet gerade dran eine einfache Lib mit Grundlegenden Funktionen zu implementieren, der hat wesentlich mehr Plan von BTLE.

wkrug
07.02.2017, 08:56
Mit welcher Datenübertragungsrate überträgst Du deine Bits denn?
Je höher die ist, um so empfindlicher wird das Ganze.
Wir haben mal vor ein paar Jahren ein Telemetriesystem mit RFM Modulen gebaut.
http://www.toeging.net/flieger/profi/telemetrie/telemetrie.htm
Das hat über 200...300m Outdoor gut funktioniert.
Auch eine Fehlererkennung bzw. Korrektur sollte bei einer Funkstrecke schon mit drin sein.

piggituX
07.02.2017, 10:32
hi,

das ist ein guter Hinweis, ich habe erstmal den Standard drin mein ich von 2000 bits pro Sekunde


vw_setup(2000); // Bits pro Sekunde

wenn ich nur ne statische Message sende klappt das, wobei ich mich schon frage, wo da der Unterschied liegt, weil ich die Messwerte auch als char Message übertrage.

Oder die China Teile haben so eine grosse Toleranz..... und je länger die laufen desto schlechter werden die :confused:

wkrug
07.02.2017, 16:44
Wenn es mit kurzen Sequenzen geht und mit Langen nicht, könnte es an einer "Überlastung" beim Controller liegen.
Bits werden verschluckt, weil der Controller gerade was anderes macht - Das Problem hatte ich mal bei einer SD-FAT Library.
Kommen die vorderen Bytes richtig an und die späteren nicht mehr?
Das würde auf so einen Fehler hinweisen.
Obwohl man das bei 2000 Bit/s eigentlich nicht schaffen kann.

Ich bin da leider mit dem Arduino nicht so fit, drum kann ich mit Deinem Code relativ wenig anfangen.
Versuch doch mal den Hardware USART zu nutzen und die Empfangsroutine im Interrupt laufen zu lassen.

Peter(TOO)
07.02.2017, 19:40
bin nun ein Stückchen weiter, aber generell ist das RF433 doch echt murks, was die Reichweite angeht und gute Übertragung :)

Wie hast du msg2 deklariert?

piggituX
07.02.2017, 19:48
HI,

so wie msg1 auch mit


const char msg0[] = {","};
char msg1[10];
char msg2[10];

char toSend[140];



liegen sender / empfänger nur 1m auseinander funktioniert es.

ich habe mich ein bisschen an dem Tutorial (http://www.arduino-tutorial.de/funkuebertragung-von-messwerten-mit-dem-rf-link-modul/) lang gehangelt

cYa

piggituX
11.02.2017, 12:39
Ich bekomme das Verhalten nicht gefixed, somit gehen wir gleich auf die IoT Lösung und machen es über ESP8266 :)

die RF433 kommen dann in den Keller als On/Off Funkstrecke für das Licht via BewegungsSensor


32409

Peter(TOO)
11.02.2017, 15:03
char msg1[10];
itoa(alt, msg1, 10);
funktioniert nur richtig, wenn int = 16-Bit lang ist.
Bei 32-Bit int ist der grösste Wert "-2147483648", das sind 11 Zeichen plus /0 am Ende, also 12 Zeichen. msg1 hat aber nur Platz für 10 Zeichen.

piggituX
12.02.2017, 19:20
Nabend.

ok ich teste es nochmal aus, danke , hab ja noch nen DHT22 Sensor da :)