Forum: Mikrocontroller und Digitale Elektronik Atmega8 + 433 MHz emp = übertragungsproblem


von DAVID B. (bastler-david)


Lesenswert?

Hallo
Mein vorhaben ist ich habe mir ein Multitool selber gebaut (Spannung 
/strom /tempratur und so weiter).
Jetzt ist mein vorhaben diese werte über 433 MHz zu einen Display zu 
senden.
Das alleine ist noch kein akt und steht auch schon.
mein Problem ist jetzt beim Empfänger.

Da ich mehrere werte übertragen will/muss habe ich es so gemacht zuerst 
sendet der sender die zahlen 1111/2222/3333 zum zuordnen.
und später nach 500 ms den eigentlichen wert.
Das geht auch.

ABER  beim empfangen,
Wird der wert zb 1111 auch empfangen Problem JETZT bekomme ich es nicht 
hin das der Empfänger 450 ms wartet und den Empfänger speicher erneut 
ausliest.

Soll heißen ich sehe auf dem Display immer nur den ersten wert zb 1111.
Wenn jemand eine hilfreiche Idee dazu hätte wäre ich sehr dankbar.
Habe es schon mit mySwitch.resetAvailable(); nach jeden wert versucht 
ändert aber nix.

Am sender liegt es nicht der sendet genau was er soll:
15 sek warten
(1111  500ms  WERT xyz)
15 sek warten
( 2222  500ms  WERT xyz)
15 sek warten
( 3333  500ms  WERT xyz)
15 sek warten
( 4444  500ms  WERT xyz)

sieht man am seriellen Port gut.

Mein Letzer CODE wäre dieser:
void loop() {

  if (mySwitch.available()) {
    value = mySwitch.getReceivedValue();

    if (value == 0) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(F("Verb. Fehlerhaft"));
      lcd.setCursor(0, 1);
      lcd.print(F("                "));
    }
    else if (value == 1111) { // Akku Spannung
      delay(450);
      lcd.clear();
      value = mySwitch.getReceivedValue();
      lcd.setCursor(0, 1);
      lcd.print( value);
      lcd.setCursor(4, 1);
      lcd.print(F("Akku Spannung"));
      if (value <= 360) {
        digitalWrite(10, HIGH);
      }
      if (value >= 361) {
        digitalWrite(10, LOW);
      }
    }
    else if (value == 2222) { // Messspannung
      lcd.clear();
      delay(450);
      value = mySwitch.getReceivedValue();
      lcd.setCursor(0, 0);
      lcd.print(F("Mess    Spannung"));
      lcd.setCursor(0, 1);
      lcd.print(value / (100));
      lcd.setCursor(6, 1);
      lcd.print(F("      Volt"));
    }
    else if (value == 3333) { // Messstrom
      lcd.clear();
      delay(450);
      value = mySwitch.getReceivedValue();
      lcd.setCursor(0, 0);
      lcd.print(F("Gemessener Strom"));
      lcd.setCursor(0, 1);
      lcd.print(value / (100));
      lcd.setCursor(6, 1);
      lcd.print(F("    Ampere "));
    }
    else if (value == 4444) { // Temp
      lcd.clear();
      delay(450);
      value = mySwitch.getReceivedValue();
      lcd.setCursor(0, 0);
      lcd.print(F("Ges. Temperatur"));
      lcd.setCursor(0, 1);
      lcd.print(value / (100));
      lcd.setCursor(6, 1);
      lcd.print(F("    C "));
    }
    mySwitch.resetAvailable();
  }
}


DANKE

von DAVID Frager (Gast)


Lesenswert?

DAVID -. schrieb:
> 433 MHz emp

Was ist das? Verstehe ich nicht.

Welche Software verbirgt sich hinter der Instanz <mySwitch>?

von DAVID B. (bastler-david)


Lesenswert?

Als Grund Gedanke liegt folgernder link zugrunde.
https://funduino.de/nr-03-433mhz-funkverbindung

von DAVID Frager (Gast)


Lesenswert?

DAVID -. schrieb:
> Als Grund Gedanke liegt folgernder link zugrunde.

Das beantwortet nicht was  "433 MHz emp" ist.

Die verwendete Library ist vermutlich Mist. Die einzige
die ich kenne die wirklich gut arbeitet heisst VirtualWire.
Aber das willst du sicher nicht hören. Du willst hören dass
alles in Ordnung ist, kein Fehler und alles in Butter. Ich
durchforste jedenfalls diesen Wust an C-Code der Library
nicht.

von DAVID B. (bastler-david)


Lesenswert?

Danke für deine mühe!
Ich erwarte natürlich nicht das du dir irgendwas durchliest wo zu du 
keine lust hast.

Meine sorge ist zurzeit nur ob ich mir keinen zusätzlichen ärger mache 
wenn ich beim SENDER die RCSwitch library (wegen Funk Steckdosen) nutze 
und beim empfänger dann VirtualWire.
Ich bin auch nicht auf die Library festgesetzt VirtualWire werde ich mir 
morgen mal ansehen.
Und wenn ich hören will das alles ok ist könnte ich das auch selber zu 
mir sagen hilft mir aber nicht.

oder ziehen wir das mal anderes auf welche Möglichkeiten einer 
zuordnungsbaren Übertragung gibt es noch ?
Kann ich die Übertragungen irgend wie speichern ?

Die gesendeten werte sollen zugeordnet werden können und sollten nicht 
durchein andere kommen.

PS:
emp sollte eigendlich mal >empfänger< werden aber woll zuspät gesehen 
und jetzt kann ichs nicht mehr ändern.

von Georg M. (g_m)


Lesenswert?

Ich würde alles zusammen senden, ohne Pausen, und dann nach dem Empfang 
aufteilen (decodieren).


PS
Es gibt mehrere Libraries:

VirtualWire library
RadioHead library
rc-switch library
RFTransmitter library
RFReceiver library

https://andreasrohner.at/posts/Electronics/New-Arduino-library-for-433-Mhz-AM-Radio-Modules/

von DAVID B. (bastler-david)


Lesenswert?

hmm ok wie könnte das aussehen das zusammen senden ?(so code mäsig muss 
das in extra klammern oder einfach so vor dem Komma ?)

also die RFReceiver library ist nicht mit atmega8 kompatibel.

Und bei VirtualWire ist es Woll nicht so einfach zahlen zusenden welche 
sich ändern können.

#include <VirtualWire.h>
int s0 = (3333);
int s1 = (1234);

void setup()
{
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  vw_set_tx_pin(10);
}

void loop()
{
  vw_send(s0);
  vw_wait_tx();
   vw_send(s1);
  vw_wait_tx();
  delay(2000);
}


 error: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' 
[-fpermissive]

von Rechenschüler (Gast)


Lesenswert?

DAVID -. schrieb:
> Und bei VirtualWire ist es Woll nicht so einfach zahlen zusenden welche
> sich ändern können.

Übersetzt heisst das: ich bin nicht in der Lage Zahlen in
einzelne Bytes zu zerlegen um sie über einen wie auch immer
gearteten Byte-seriellen Übertragungsweg zu schicken.

Da wirst du wohl noch etwas Grundlagen lernen müssen.

Aber bitte gib nicht der VirtualWire Lib die Schuld dass
es nicht funktioniert.

von Georg M. (g_m)


Lesenswert?

DAVID -. schrieb:
> hmm ok wie könnte das aussehen das zusammen senden ?

Wenn ich weiß, wie ich die Daten zusammengefügt habe, dann kann ich 
später alles wieder fehlerfrei trennen.
Das wäre vielleicht für die Anderen ein Geheimnis, aber nicht für mich.


Z.B.  20171217 bedeutet 2017-12-17 wenn wir so trennen: xxxx-xx-xx 
(4-2-2).
Es könnte aber auch anders sein: 20-171-217 (xx-xxx-xxx, 2-3-3).



.

: Bearbeitet durch User
von DAVID B. (bastler-david)


Lesenswert?

Das zerlegen geschaltet sich für MICH schwieriger.
Das senden von werten mit Komma konnte ich so lösen (4,20 *10 = 420 
(senden) 420 / 10 = 4,20 so weit kein Problem.
Was aber das zerlegen von werten angeht das verbirgt sich mir seit 
Monaten.

Was dein beispiel angeht kann ich mir nicht vorstellen wie das ablaufen 
soll.
Hab mal bissel rum versucht.

eine mögliche Idee welche ich hatte welche aber NICHT aufgeht war.
Die werte auf zuteilen und auswerten zulassen anhand ihrer länge:

MAX
Akku 420 *1 = 420
VM 200 *10 = 2 000
A 200 *100 = 20 000
Temp 125 *1000 = 125 000

Problem die werte können auch kleiner sein so mit verändert sich die 
länge massiv und ein zuordnen ist nicht mehr möglich

Minmal
360 *1 = 360
V1 *10 = 10
A1 *100 = 100
Temp 0 *1000 = 0

AHHH nein habe eine bessere Möglichkeit.
Ich werde einen 2ten sender und Empfänger verbauen habe noch 315MHz da.
Damit sende ich die Akku Spannung mit 433 MHz und den Messwert mit 
315MHz.
Noch einen Taster wo ich zwischen den werten die ich senden will ( 
Volt/Ampere/Temperatur )umschalten kann und fertig.

Danke euch für eure Hilfe.

von Michael U. (amiga)


Lesenswert?

Hallo,

DAVID -. schrieb:
> Ich werde einen 2ten sender und Empfänger verbauen habe noch 315MHz da.
> Damit sende ich die Akku Spannung mit 433 MHz und den Messwert mit
> 315MHz.

falls Du in Deutschland wohnst: 315MHz sind hier NICHT zugelassen und es 
kann durchaus teuer werden, wenn man damit was stört.

Ansonsten: übertrage die Daten (vorerst) generell als lesbare Texte, 
mache also diesen Teil auf der Senderseite. Formatiere die Daten auch 
dort passend für Deine Anzeige, füge also Leerzeichen hinzu oder Nullen 
wo nötig.
Der Vorteil ist, daß Du Dir das Ergebnis seriell ausgeben lassen kannst 
und sofort siehst, ob es da Probleme gibt.

Befasse Dich mit Stringverarbeitung in C
https://www.mikrocontroller.net/articles/String-Verarbeitung_in_C

Da Du wohl in der Arduino-Umgebung unterwegs bist, schaue Dir auch die 
String-Klasse an
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
eine vollstäbdige deutsche Beschreibung wirst Du aber wohl nicht finden.

Vorteil der String-Klasse: viele fertige Funktionen, gut zu testen.
Nachteil: höherer Ram-Verbrauch, das kann auf den kleinen AVR schnell 
Probleme machen, wenn man damit halbe Romane bearbeitet...

Befasse Dich mit der Übertragung bei den einfachen Funkmodulen.
Man kann da nicht einfach irgendwas reintüten und hoffen, daß es am 
anderen Ende einfach wieder rauskommt.

Nutze vorerst fertige Bibliotheken, VirtualWire wurde schon genannt.
Dann kannst Du Deine zusammengebastellte serielle Ausgabe so 
rüberschicken und im Empfänger nutzen.
Du kannst dann aber eben auch auf Empfängerseite aus der IDE stattdessen 
seriell Testdaten schicken und schauen, daß Deine Displanzeige damit 
klarkommt.

Nicht alles auf einmal, schrittweise einzelne Blöcke testen und dann 
zusammenfügen.

Gruß aus Berlin
Michael

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.