Funkübertragung von Messwerten durch Abfrage ( Master ; Slave)

Hallo zusammen ,

Ich arbeite momentan an einem Projekt bei dem ich vier Messwerte von Potis (die jeweils an einem Arduino Nano angeschlossen sind ) per funk (433 Mhz) an eine zentrale Empfangseinheit schicken möchte.

Ich möchte die Platinen mit einer ID versehen um sie einzeln nach der Reihe abfragen zu können.

Meine Frage ist , wie schaff ich die einzelabfragen , das ich quasi jedem Sender sagen kann jetzt sendest du deinen Wert an die zentrale Einheit ?

Mit dem bereits bestehenden Code funktioniert das Senden, leider nicht in einer gewünschten Reihenfolge.

Danke schon im Voraus

Sender_neu9.0.ino (1.7 KB)

Setze deinen Sketch bitte direkt im Forum in Code-Tags rein, dann kann dieser auch auf mobilen Geräten gelesen werden und damit steigt die Zahl der Helfenden.

Was für Funkmodule verwendest du ?
Bitte Hyperlinks posten.
Und wenn es richtig funktionieren soll, musst du vom Master nacheinander eine Aufforderung an die Slaves senden. Die dann anschließend das Signal senden.
Somit brauchst du Transceiver für beide Seiten.

Hi

Setze Deinen Sketch bitte in Code-Tags (geht auch nachträglich, unter 100 Post's aber nur alle x Minuten).

Der Code sieht so aus, daß dort NUR die Sende-Routine enthalten ist.
Wie erhoffst Du Dir darüber eine geordnete Reihenfolge?

Solange die Platinen nicht selber zuhören, welche Nummer gerade geschwätzt hat, wissen Diese gar nicht, daß Sie derzeit Sendepause haben.

Würde sogar so weit gehen, daß die Zentral-Einheit die Daten explizit bei den Außen-Einheiten anfragt.

  • Sensor 1, schick mir Deinen Wert!
  • Hier Sensor 1, Wert ist 123.
  • Sensor 2, schick mir Deinen Wert!
    ....
  • Sensor 2, schick mir Deinen Wert!
    ....
  • für's Log-Buch, Sensor 2 defekt
  • Sensor 3, schick mir Deinen Wert!
  • Hier Sensor 3, Wert ist 12.

Also eine Art Protokoll, daß die Sensoren erkennen, daß Sie gemeint sind und die Zentral-Einheit sieht, Wer Da was gesendet hat.

Die ID wird im Code fest gelegt, oder ist von Außen einstellbar?
Letzteres könnte man mit 2 freien Pinnen (=4 verschiedene Kombinationen, also 4 Sensoren unterscheidbar) erreichen und könnte auf diese 4 Sensoren dann identischen Code aufspielen.
(sofern die Sensoren auch Alle das Gleiche erfassen sollen, klar)

MfG

PS: ... wer langsam macht, kommt auch zur Stadt ...
oder
... zu langsam :wink:

Hallo ,

hier ist der Link zu den Funkmodulen: (433Mhz)

Und hier der Sketch den ich einstweil habe :

#include <VirtualWire.h>

byte id = 3; //Platinen ID
const int poti1Pin = A0;

char msg[16];
char empfmsg[16];


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  vw_setup(2000);
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  vw_set_tx_pin(3);

  vw_set_rx_pin(6);
  vw_rx_start();       // Start the receiver PLL running

}

void loop() {
  // put your main code here, to run repeatedly:
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  formatProtokoll(id, analogRead(A0)); //daten Senden
  //formatgetdataProtokoll(byte getid); //Master fragt Messkanal ab  (id = Messkanal)
  debugPrintProtokoll();

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {

    for (int i = 0; i < buflen; i++)
    {
      empfmsg[i] = char(buf[i]);

    }
  }
  Serial.println(empfmsg);






  //delay(1000);

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

  vw_wait_tx();
  delay(200);

}

void debugPrintProtokoll()
{
  Serial.print("Sender: ");
  for (int i = 0 ; (i < 16) && msg[i] != 0; i++) { // Poti1String.length()
    Serial.print(msg[i] ) ;
  }

  Serial.println("");

}

void formatgetdataProtokoll(byte getid)//abfrage 
{
  for (int i = 0; i < 16; i++) msg[i] = 0;
  msg[0] = 'i';
  msg[1] =  '0';
  msg[2] =  '0';
  msg[3] = 'g';
  msg[4] = (getid % 100) / 10 + '0';
  msg[5] = getid % 10 + '0';
  msg[6] = '0';
  msg[7] = ';';
}


void formatProtokoll(byte id, int data)//senden der daten
{
  for (int i = 0; i < 16; i++) msg[i] = 0;
  msg[0] = 'i';
  msg[1] = (id % 100) / 10 + '0';
  msg[2] = (id % 10)  + '0';
  msg[3] = (data % 10000) / 1000 + '0';
  msg[4] = (data % 1000) / 100 + '0';
  msg[5] = (data % 100) / 10 + '0';
  msg[6] = data % 10 + '0';
  msg[7] = ';';



}

@Postmaster-ino

Das mit dem Protokoll hatte ich mir genau so vorgestellt wie du es beschreibst , leider weis ich nicht wie ich sie dazu bringe zu zu hören und dann Senden wenn ich sie frage

Und die ID möchte ich fix für jedes Modul haben , also im Code für jedes Modul eine andere ID zuweisen.

Danke nochmals für die schnellen Antworten.

Joules32:
hier ist der Link zu den Funkmodulen: (433Mhz)
MX-05V 433MHz RF Funkmodul / Sender + Empfänger | Roboter-Bausatz.de

Für dein Vorhaben sind die Teile die schlechteste Lösung. Der Empfänger taugt nix und du solltest wie ich schon schrieb, dafür Transceiver (Sender und Empfänger) einsetzen.

Wenn es 433 MHz sein soll, dann empfehle ich HC-12.
Mit denen habe ich sehr gute Erfahrung gemacht und die lassen sich auch leicht programmieren und einbinden. Und sind für dein Vorhaben gut geeignet.

Können sich die einzellnen Sende- und Empfangsmodule untereinder stören ? , weil mit der Reichweite bin ich bis jetzt sehr zufrieden (muss maximal 6 meter weit gehn) .

Gibt es eine möglichkeit diese Module weiter zu verwenden , habe nämlich sehr viele davon schon zu Hause liegen?

Das größere Problem ist das ich nicht weis wie ich die einzelnen Module nach ihren Werten abfrage.

PS: Habe im Anhang ein Foto von meinem momentanen Aufbau reingestellt

Joules32:
Können sich die einzellnen Sende- und Empfangsmodule untereinder stören ? , weil mit der Reichweite bin ich bis jetzt sehr zufrieden (muss maximal 6 meter weit gehn) .

Gibt es eine möglichkeit diese Module weiter zu verwenden , habe nämlich sehr viele davon schon zu Hause liegen?

Das größere Problem ist das ich nicht weis wie ich die einzelnen Module nach ihren Werten abfrage.

PS: Habe im Anhang ein Foto von meinem momentanen Aufbau reingestellt

Wie, du willst es auf einer Zigarettenschachtel aufbauen ?

Die Empfänger können sich untereinander stören. Für deine Anwendung solltest du bessere Module nehmen.
Auch kann der Empfänger leicht durch andere Elektronik gestört werden und du bekommst falsche oder keine Daten übermittelt.

Wenn du viele davon hast, hättest du dich vorher informieren sollen.
Aber setze sie ein und lerne, du wirst nicht glücklich.
Du kannst natürlich auch ein Protokoll erstellen, welches evtl. Fehler ignoriert.
Nur wird das richtig aufwändig.

Edit:
Und was meinst du damit, "die einzelnen Module nach Werten abfragen" ?

Haha nein sie musste nur für eine größenabschätzung des Gehäuses her halten. :wink:

Okay danke , dann werde ich deinen Rat befolgen und mir die HC-12 für das Projekt holen , weil das Risiko das ich keine , bzw falsche Werte bekomme möchte ich nicht haben.

Danke nochmals für den super Tipp

Joules32:
Haha nein sie musste nur für eine größenabschätzung des Gehäuses her halten. :wink:

Okay danke , dann werde ich deinen Rat befolgen und mir die HC-12 für das Projekt holen , weil das Risiko das ich keine , bzw falsche Werte bekomme möchte ich nicht haben.

Danke nochmals für den super Tipp

Gerne,
und wie schon geschrieben, die sind rel. einfach zu verwenden und haben Sender und Empfänger in einem.
Zudem arbeiten die mit einer besser geeigneten Modulationsart (FSK) die nicht so störanfällig ist.

Wenn du später mal Funksteckdosen schalten möchtest, kannst du die vorhandenen Sender dafür verwenden.

Danke @Hotsystems

Ich werde bis die neuen HC-12 da sind mit den alten versuchen weiter zu kommen .

Ich hätte da halt nur die Frage an euch wie so ein Protokoll aussehen muss damit ich anhand von meinem Code , jedes Modul als Master nacheinader abfragen kann und der Slave mir dann seinen Wert schickt , so wie es postmaster-ino gemeint hat.

Mfg

Hi

Das lässt Du so aussehen, wie Du Das Dir denkst - ist wirklich so, Da gibt es keine Vorschrift.
Selber würde ich jeden µC eine ID geben, der Master hat 0x00, die Slaves 0x01…0xFE
0xFF würde ich als ‘Rundumruf’ (Broadcast) definieren.

Dann bestimmst Du, daß eine Nachricht folgenden Aufbau hat:
Sender, Empfänger, Art, Anzahl, Nutzbyte 1, …, Nutzbyte n

Sender und Empfänger sind die ID’s der beteiligten µCs - wenn 00 an 01 senden will, dann 00,01,??,??,…
Art ist der Befehl oder die Antwort eines Befehl, was in der Art:
00 generiere Messwert
01 sende Messwert
02 Messwert noch nicht fertig
03 fertiger Messwert

00 und 01 wären die Befehle, Die der Master schickt und Welche die Slaves interpretieren können müssen.
Messwert generieren ist in die Richtung gedacht, daß z.B. DS18B20 (1-wire Temperatur-Sensoren) bis zu 750ms für eine Messung brauchen und vorher, bestenfalls, eine alte Messung zurück geben.
Mit 01 wird dem Slave befohlen, den eigenen Messwert rauszurücken.
Der Slave sendet
ID,00,02,…
Slave ID an Master: Messwert noch nicht fertig.
Wenn der Messwert fertig ist
ID,00,03,04,10,11,12,13
Slave LD an Master: aktueller Messwert, 4 Byte lang, Bytes 10,11,12,13

Da kann man dann auch noch eine Prüfsumme mitschicken, wie Du Diese berechnest, bleibt Dir überlassen (XOR bietet sich an, richtige Prüfsummen verschieben die Bits auch noch, siehe CRC).

Bei meinen im Haus verteilten Sensoren werden für Art auch Werte zwischen 3 und (müsste nachsehen) gesendet, die Nutzdaten variieren, sind aber momentan noch fest im Code verdrahtet und will überarbeitet werden.

  • Temperatur DS18B20
  • Temepratur BME280
  • Luftdruck BME280
  • Luftfeuchte BME280
  • Temperatur DHT22
  • Luftfeuchte DHT22
  • Laufzeit HC-SR04
    … allerdings drahtgebunden, per CAN, die Module gibt es günstig (<1,50/Stück), beinhaltet Arbitrierung/Priorisierung, ist Multi-Master-fähig und braucht nur zwei Drähte (Differenziale Übertragung).

Angedacht sind noch Befehle, womit ich die ID beeinflussen kann - und irgendwann, daß ich den SLave ‘umfunktionieren’ kann - in der Art: neuer Sensor an Pin D11, Typ DHT22 … aber, bevor ich Deinen Thread ganz karpere: wohl noch Zukunftsmusik

MfG

postmaster-ino hat es schon sehr schön beschrieben.
Ich würde es etwas einfacher aufschreiben.

Alle Slaves messen ständig ihre Daten und legen diese in einer Variablen ab.

Der Master sendet mit der Slaves-ID eine Aufforderung an den entsprechenden Slave die Messdaten zu senden.
Der angesprochene Slave sendet die in der Variablen vorhandenen Daten mit seiner ID an den Master.

Nach dem Empfang der Daten fordert der Master den nächsten Slave (per ID) auf, usw.

Natürlich kann man hier noch die schon erwähnte Prüfsumme mit einbauen.

Diese Prinzip funktioniert bei mir mit einer Art "Rolladen-Kontrolle" an den Terassentüren und Fenstern im Erdgeschoss. Da sich das bisher gut bewährt hat, kommen demnächst noch die Eingangstüren hinzu.

Wenn du was stabiles bauen willst nimm nrf24l01 2.4 Ghz funkt.
Gute Reichweite, stabiles Protokoll geringer Strombedarf und nicht teuer.
Reichweite kann man in Stufen steigern.
a) Zwei (oder n) einfache Module.
b) Der Empfänger Modul mit externer Antennen und Verstärkerchip, die Slaves sind die einfachen Module.
c) Alle Teilnehmer mit externer Antenne und Verstärkerchip.

Der interne Stack der Chips sorgt für Retransmissions im Fehlerfall und der Sender kriegt einen Status ob der
Empfänger ihn gehört hat.

Ulli