433mhz RC-switch value speichern?

Hallo, ich bin langsam am verzweifeln, und finde keine genaueren Informationen über die Funktion mySwitch.getReceivedValue().

Das ReceiveDemoAdvanced gibt den Dez-Wert, BitLänge, Binär, Tri-State, Pulslänge und Protokoll aus, funktioniert einwandfrei.

Aber zb: wert = mySwitch.getReceivedValue() funktioniert nicht, ebenso tft.print(mySwitch.getReceivedValue()), es wird irgendeine Zahl ausgegeben, mit der ich nichts anfangen kann, fürs senden und schalten meiner Funksteckdosen brauche ich den Binärcode.

Gibt es eine Möglichkeit auf die einzelnen Werte (Dezimal, Bit, Tristate) zuzugreifen, und diese zu speichern, damit ich mir den Serial Monitor sparen kann?

LG!

Hallo,
hast du dir die Beispiele der Library mal angesehen ?
Da wird doch alles sehr genau gezeigt.
Damit ich das richtig verstehe, wo genau das Problem liegt, zeig uns doch deinen Sketch.

Den im Monitor angezeigten Code kannst du dir notieren und in deinem Sketch dann verwenden und senden.

Kolbi:
(mySwitch.getReceivedValue()), es wird irgendeine Zahl ausgegeben, mit der ich nichts anfangen kann, fürs senden und schalten meiner Funksteckdosen brauche ich den Binärcode.

Das ist nicht irgendwie eine Zahl, sondern der empfangene Code in dezimal. Den kannst du auch senden. Binär ist nur eine andere Darstellungsform dieser Zahl. Sie wird gerne gewählt, da sie zu den Dip-Schaltern in der Steckdose passt. Du kannst sie genau so gut in Hex angeben.

getReceivedBitlength() gibt dir die Bitzahl des Codes

getReceivedProtocol() das Protokoll

Wie ich in Post #1 schon angedeutet habe, in den Beispielen findest du den Hinweis, den du benötigst.

In "SendDemo.ino" z.B. wie die entsprechenden Code gesendet werden.

Hier die Anweisung, wenn Dipschalter in den Funk-Steckdosen vorhanden sind:

  /* See Example: TypeA_WithDIPSwitches */
  mySwitch.switchOn("11111", "00010");
  delay(1000);
  mySwitch.switchOn("11111", "00010");
  delay(1000);

Hier die Anweisung, wenn du Dezimalcode senden möchtest:

  /* Same switch as above, but using decimal code */
  mySwitch.send(5393, 24);
  delay(1000);  
  mySwitch.send(5396, 24);
  delay(1000);

Hier die Anweisung, wenn du Binärcode senden möchtest:

  /* Same switch as above, but using binary code */
  mySwitch.send("000000000001010100010001");
  delay(1000);  
  mySwitch.send("000000000001010100010100");
  delay(1000);

Deinen speziellen Code musst du zuvor ermitteln und notieren.

Wichtig können auch die von Theseus genannten zusätzlichen Einstellungen sein.
Das kannst du mit dem Beispiel "ReceiveDemo_Advanced" ermitteln.

Das senden funktioniert problemlos, es geht ums speichern der Werte!
Die Dezimalzahl über Serial ist NICHT die gleiche Zahl wie die im "wert" gespeichert!

Und die .h und .ccp habe ich mir bereits angeschaut, und nur gedacht: "Sch....ön kompliziert!"

Nochmal, hat jemand Ahnung wie man die einzelnen Werte (dezimal/binär/tristate..) speichern kann?

mfg.

Kolbi:
Das senden funktioniert problemlos, es geht ums speichern der Werte!
Die Dezimalzahl über Serial ist NICHT die gleiche Zahl wie die im "wert" gespeichert!

Und die .h und .ccp habe ich mir bereits angeschaut, und nur gedacht: "Sch....ön kompliziert!"

Nochmal, hat jemand Ahnung wie man die einzelnen Werte (dezimal/bit..) speichern kann?

mfg.

Dann erklär doch mal wie und wo du diese Daten speichern willst.
Evtl. auch noch eine genaue Erklärung was du machen möchtest.

Aus deinem Thread wird man so nicht schlau.

mit der ich nichts anfangen kann, fürs senden und schalten meiner Funksteckdosen brauche ich den Binärcode.

Hier schreibst du, zum Senden ! Was denn nun.

Steht doch alles im ersten Beitrag!

Das Receive Demo Advanced funktioniert nur unverändert über Serial, dann erhalte ich Dez, Bit, Binär, Protokoll, etc.., sieht dann so aus:

Decimal: 4216579 (24Bit) Binary: 010000000101011100000011 Tri-State: F000FFF10001d PulseLength: 185 microseconds Protocol: 1
Raw data: 5760,208,528,472,272,96,636,100,632,100,632,100,620,124,616,120,612,124,612,488,248,120,616,488,248,116,616,488,252,116,616,488,244,120,616,124,612,120,620,104,632,100,632,104,640,92,632,112,616,

Aber, wenn ich folgendes mache:

<
if(mySwitch.available()) {
Serial.println(mySwitch.getReceivedValue());
value = mySwitch.getReceivedValue();
Serial.println(value);
mySwitch.resetAvailable();
}
/>

Dann erhalte ich am Serial Monitor folgendes:

4216579
22275

Wie ihr seht ist der gespeicherte Wert "value" nun falsch.

Ideen wie ich den richtigen Wert speichern kann?

Kolbi:
Steht doch alles im ersten Beitrag!

Und leider wird man daraus nicht schlau. :roll_eyes:

Was du meinst, ist kein Speichern, sondern ein übergeben in eine Variable.

Speichern wäre, wenn du es im EEProm speicherst, oder auf einer SD-Karte o.ä.

Dein Problem ist, du formatierst deine Ausgabe nicht richtig.
Und wie du deine Variable definiert hast, sagst du auch nicht.

Sieh dir mal die Print-Anweisung an, da findest du einiges.

Ich dachte der Arbeitsspeicher ist auch ein Speicher? In dem Fall will ich dann eine Variable übergeben.
value ist als int deklariert, liegt da evtl der Fehler?

Auch die Funktion Serial.println(mySwitch.getReceivedValue()) bleibt unklar, denn steht dieser Befehl alleine, dann wird nur der Dez-Wert ausgegeben. Aber im ReceiveDemoAdvanced wird auch Binär und Tri-State ausgegeben, dafür scheint es aber keine eigenen Befehle zu geben?!

Kolbi:
Ich dachte der Arbeitsspeicher ist auch ein Speicher? In dem Fall will ich dann eine Variable übergeben.
value ist als int deklariert, liegt da evtl der Fehler?

Na gut, Arbeitsspeicher ist auch ein Speicher. Aber das war dennoch undeutlich erklärt.
Ja "int" reich da von der Größe nicht.

Auch die Funktion Serial.println(mySwitch.getReceivedValue()) bleibt unklar, denn steht dieser Befehl alleine, dann wird nur der Dez-Wert ausgegeben. Aber im ReceiveDemoAdvanced wird auch Binär und Tri-State ausgegeben, dafür scheint es aber keine eigenen Befehle zu geben?!

Das "Serial.println(mySwitch.getReceivedValue())" kannst du genauso formatieren.

Hier "ReceiveDemoAdvanced" wird die Formatausgabe ja schon in der Library für dich gemacht.

Und wie kann man es formatieren, damit man Dez,Bin,Tri in variablen übergeben kann?

Hab bereits geschrieben dass ich die Library nicht verstehe, bitte genauer lesen, dann muss ich mich nicht so oft wiederholen, und Andere mit dem gleichen Problem finden schneller zur Lösung.

Mfg

OK, danke.

Und mit besseren Beschreibungen müssten wir nicht so oft nachfragen.

Wer es selbst mal versucht, Dezimal, Binär und TriState in Variablen zu übergeben, wird sehen, dass es nicht so einfach ist.

Kolbi:
Ich dachte der Arbeitsspeicher ist auch ein Speicher? In dem Fall will ich dann eine Variable übergeben.
value ist als int deklariert, liegt da evtl der Fehler?

Du solltest das als unsigned long speichern. int reicht nur bis 32.767, ist also für 4216579 zu klein.

Kolbi:
Auch die Funktion Serial.println(mySwitch.getReceivedValue()) bleibt unklar, denn steht dieser Befehl alleine, dann wird nur der Dez-Wert ausgegeben. Aber im ReceiveDemoAdvanced wird auch Binär und Tri-State ausgegeben, dafür scheint es aber keine eigenen Befehle zu geben?!

Das hatte ich dir doch oben schon geschrieben:

Theseus:
getReceivedBitlength() gibt dir die Bitzahl des Codes

getReceivedProtocol() das Protokoll

Jawoll, statt unsigned int unsigned long, das hats gebracht, jetzt stimmt der Wert, vielen vielen dank Theseus!

Jetzt möchte ich die Dezimalzahl gern in Binär umwandeln damit ich das auch verstehe. Die Zahl hat also 24 Bit/Stellen, richtig? Wie wandelt man das am einfachsten um, und in welches Datenformat?

In späterer Folge wäre es auch schön, verschiedene Werte im EEprom zu speichern. Ich habe schon mit dem EEprom gearbeitet, eine Speicherbank kann Zahlen bis 256 speichern, demnach muss ich die Zahlen zerlegen. Wie macht man das einfachstmöglich?

Lg!

Kolbi:
In späterer Folge wäre es auch schön, verschiedene Werte im EEprom zu speichern. Ich habe schon mit dem EEprom gearbeitet, eine Speicherbank kann Zahlen bis 256 speichern, demnach muss ich die Zahlen zerlegen. Wie macht man das einfachstmöglich?

Du musst die Zahl in 4 Bytes zerlegen. Hier gibt es einen fertigen Code dazu: Arduino Playground - HomePage

Wenn du die Zahl binär sehen willst nimmst du die Formatanweisung BIN.
Also Serial.print(mySwitch.getReceivedValue(), BIN)

Nachtrag:
Zu dem ReceiveDemo_Advanced

gehört noch das output.ino. Dort ist die Aufbereitung der Daten von der Fernbedienung versteckt. Wenn du das übersiehst, sieht die Arbeit mit den Werten von der Fernbedienung recht geheimnisvoll aus.
Ich mag viel lieber das ReceiveDemo_Simple, da das wesentlich näher an dem ist, was man in ein eigenes Programm einbaut.
Du kannst dir in dem Code des output.ino anschauen, wie du die Binärzahl schön formatiert ausgeben kannst.

Jetzt möchte ich die Dezimalzahl gern in Binär umwandeln damit ich das auch verstehe. Die Zahl hat also 24 Bit/Stellen, richtig? Wie wandelt man das am einfachsten um, und in welches Datenformat?

Dazu von mir noch ein Klugscheisser-Hinweis :wink:
Falsche Denkweise: du musst nichts umwandeln, du fragst nur nach Darstellungsmöglichkeiten!

Du hast 24 bit in einer unsigned long Variable gespeichert.
Jetzt fragst du dich, wie du das anzeigen kannst, damit du die einzelnen Bits sehen kannst.

unsigned long wert = 4216579;
Serial.println(wert); //Die Standard Dezimal-Anzeige taugt dafür nicht.
Serial.println(wert, BIN); // 10000000101011100000011 : Binär-Darstellung ist etwas lang 
Serial.println(wert, HEX); // 405703 : Ein Kompromiss, der sich ziemlich durchgesetzt hat

Einzelne Hex-Ziffern in Bitmuster umwandeln geht, mit etwas Übung, im Kopf:
405703 = 0100 0000 0101 0111 0000 0011

Die 24 Bit in 3 byte gruppieren ergibt sich dann von selbst:
0b 010000000101011100000011 = 0x 40 57 03

Zu beachten ist, dass bei PC und Arduino und in der Übertragung das niedrigstwertigste Byte zuerst kommt. Die Zahl0x405703wird also {0x03, 0x57, 0x40} in einem Byte-Array abgelegt.