Wemos D1 Mini - MX RM 5V, FS 1000, keine Daten

Sehr geehrtes Forum

Ich habe einen Wemos D1 mini und möchte einen Mhz Empfänger sowie einen FS 1000a Sensor bedienen.
Da beide ein 5V Modul sind, gehe ich vom Wemos mit 5V in das Modul und habe einen Spannungsteiler welcher das Data input jeweils auf 3V drosselt.
Ich orientiere ich mich am an diesem Tutorial:

Mein Schalplan:

der code vom Tutorial:

#include <RCSwitch.h>

RCSwitch rcSwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  rcSwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}

void loop() {
  if (rcSwitch.available()) {
  Serial.println("<--- Beginn");
  output(rcSwitch.getReceivedValue(), rcSwitch.getReceivedBitlength(), rcSwitch.getReceivedDelay(), rcSwitch.getReceivedRawdata(),rcSwitch.getReceivedProtocol());
  rcSwitch.resetAvailable();
  Serial.println("<--- End");
  Serial.println();
  }
}


static const char* bin2tristate(const char* bin);
static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);

void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw, unsigned int protocol) {

  const char* b = dec2binWzerofill(decimal, length);
  Serial.print("Decimal: ");
  Serial.print(decimal);
  Serial.print(" (");
  Serial.print(length);
  Serial.println(" Bit)");
  Serial.print("Binary: ");
  Serial.println(b);
  Serial.print("Tri-State: ");
  Serial.println(bin2tristate( b));
  Serial.print("PulseLength: ");
  Serial.print(delay);
  Serial.println(" microseconds");
  Serial.print("Protocol: ");
  Serial.println(protocol);
  
  Serial.println("Raw data: ");
  Serial.print("\t");
  for (unsigned int i=0; i<= length*2; i++) {
    Serial.print(raw[i]);
    Serial.print(",");
    if(i!= 0 && (i%5)==0){
       Serial.println();
       Serial.print("\t");
    }
  }
  Serial.println();
}

static const char* bin2tristate(const char* bin) {
  static char returnValue[50];
  int pos = 0;
  int pos2 = 0;
  while (bin[pos]!='\0' && bin[pos+1]!='\0') {
    if (bin[pos]=='0' && bin[pos+1]=='0') {
      returnValue[pos2] = '0';
    } else if (bin[pos]=='1' && bin[pos+1]=='1') {
      returnValue[pos2] = '1';
    } else if (bin[pos]=='0' && bin[pos+1]=='1') {
      returnValue[pos2] = 'F';
    } else {
      return "not applicable";
    }
    pos = pos+2;
    pos2++;
  }
  returnValue[pos2] = '\0';
  return returnValue;
}

static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength) {
  static char bin[64]; 
  unsigned int i=0;

  while (Dec > 0) {
    bin[32+i++] = ((Dec & 1) > 0) ? '1' : '0';
    Dec = Dec >> 1;
  }

  for (unsigned int j = 0; j< bitLength; j++) {
    if (j >= bitLength - i) {
      bin[j] = bin[ 31 + i - (j - (bitLength - i)) ];
    } else {
      bin[j] = '0';
    }
  }
  bin[bitLength] = '\0';
  
  return bin;
}

leider erhalte ich keine Ausgabe, wenn ich mit meiner Funkfernedienung in der nähe drücke

Darum habe ich ein einfaches sketch, welches daten sendet und wieder empfängt.

#include <Arduino.h>
#include <RCSwitch.h>

// Sender und Empfänger-Objekte
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);

  // Sender auf Pin D8 (GPIO 15)
  mySwitch.enableTransmit(15);

  // Empfänger auf Pin D2 (GPIO 4)
  mySwitch.enableReceive(4);

  Serial.println("Setup abgeschlossen. Sender und Empfänger bereit.");
}

void loop() {
  // Signal senden
  Serial.println("Sende Signal: 123456789");
  mySwitch.send(123456789, 24); // Signal mit 24 Bit senden
  delay(1000); // Warte eine Sekunde, um das Signal zu senden

  // Signal empfangen
  if (mySwitch.available()) {
    unsigned long receivedValue = mySwitch.getReceivedValue();

    if (receivedValue == 0) {
      Serial.println("Ungültiges Signal empfangen.");
    } else {
      Serial.print("Empfangenes Signal: ");
      Serial.println(receivedValue);
    }
    mySwitch.resetAvailable();
  } else {
    Serial.println("Kein Signal empfangen.");
  }

  delay(1000); // Warte eine Sekunde, bevor die nächste Schleife beginnt
}

hat jemand eine idee?
danke euch

Und was soll das sein ?
Ich tippe mal, es soll ein Sender für 433 MHz sein.

Wenn du hier Fragen stellst, solltest du schon genaue Angaben machen.
Ebenso wie deine Schaltung funktionieren soll ?

Widerstand R1 und R2 sind doppelt. Und die am D2 des Wemos, vermutlich Empfängerleitung, sind kein Spannungsteiler sondern Reihenschaltung. Da wird wohl nix brauchbares am Wemos ankommen. Zudem ist es kein Problem, wenn du die Widerstände hier raus lässt, da der Empfänger sowie der Sender an den Datenpins keine 5 Volt raus geben.
Jetzt zur Schaltung selbst. Was möchtest du damit erreichen?
Senden und Empfang von den Funkdaten wird nicht gleichzeitig funktionieren.
Also beschreibe mal, was du damit machen möchtest.

Und noch die Info:
Der von dir verwendete Empfänger ist sehr schlecht, da er einer Technik von 1927 entspricht und sehr störanfällig ist. Den darfst du nicht in der Nähe von anderen elektronischen Geräten wie Computer oder Bildschirm betreiben. Auch Metall in seiner Nähe macht den Empfang unmöglich.
Weiterhin müssen Sender und Empfänger mit einer Antenne bestückt sein.
Hast du die dran ?
Und besser du verwendest einen modernen Superhetempfänger wie einen RXB6 oder RXB8.

Danke für deine Antwort!!!

Verzeihung! Die Infos über den FS 1000a fehlen.

Ich brauch den Empfänger nur, um eine Fernbedienung auszulesen, welche auf 433.92 Mhz meine Funksteckdose steuert.
Den Empfänger soll nur das signal auslesen, mehr braucht er nicht.
Schade das ich das nicht mit dem RXB6 nicht zuvor wusste. Der mx rm 5VC ist bereits der zweite anlauf, da ich zuvor einen HC-12 gekauft habe :frowning:

KAnnst du mir nur kurz erklären, weshalb der Wiederstand doppelt ist? (unabhängig davon, das ich ihn nicht brauche, da keine 5V zurück kommen)

  1. ich dachte ich brauche für den Sender und für das Modul jeweils einen Spannungsteiler, bestehend aus 2k und 1k Wiederstand. Daher die zwei Spannungsteiler. Die sind nicht miteinander verbunden.

  2. woher weist du, wieviel ein modul zurück gibt? ich konnte nichts darüber finden. Die messung mit dem Multimeter ist ja nur eine momentaufnahme

Danke dir

Widerstand bitte nur mit "i" schreiben.
Weil du beides mal R1 und R2 geschrieben hast.
Und im Schaltbild (wie geschrieben) ist das eine kein Spannungsteiler.

Man kann es mit einem Oszilloskop messen und bei mir hat das Teil testweise problemlos am Wemos gelaufen. Mittlerweile nutze ich die "Müllempfänger" nicht mehr.

Was ist mit der Antenne ?
Und wenn bei dir der Beispielsketch aus der Library nicht funktioniert, dann machst du noch einen Fehler, den ich nicht sehen kann.
Es kann auch sein, dass deine Funksteckdose nicht zu dem System mit Arduino kompatibel ist. Die kennen wir noch nicht.

Oh danke.
Antenne habe ich gerade nicht bei der Hand. Hab mir das ganze in meinen ND mitgenommen und leider die Fernbedienung vergessen. daher auch die fehlenden Infos und das MAnöver senden und empfangen über die Module. Da ich zum senden, sonst die Fernbedienung nehme.

darf ich noch fragen, warum das kein spannungsteiler ist?
ich verbinde GND mit R2.
R2 mit R1
R1 mit Data
und an die schnittstelle wo R1 und R2 zusammentreffen zweige ich den Data zum D2 ab.
Hab das zuhause mit dem Multimeter durchgemessen und komme genau auf 3.3V
und Widerstand absofort nur mit "i" :slight_smile:

Es geht wohl um die beiden Widerstände auf der Leitung, die von irgend so nem Dingen auf D2 geht.

@Kai-R
Danke dir! Sehr aufmerksam!
Natürlich habe ich das falsch gezeichnet. so sieht die schaltung wirklich aus

Hier hatte ich dir das schon geschrieben.
Du solltest einfach mal richtig lesen, was man dir schreibt.

Und ohne Antenne kannst du Funk vergessen.
Speziell diese Müllempfänger machen ohne Antenne, was sie wollen, aber nicht was du willst.
Da geht übrigens auch ein Stück Draht, 174 mm lang.

Und gerne nochmal. Senden und Empfangen gleichzeitig, das geht nicht.
Da brauchst du 2 Controller.

verzeihung.
ich habe das alles gelesen. aber teilweise konnt eich es in diesem moment nicht ändern bzw. das mit den Widerständen habe ich technisch nicht gleich verstanden. Verzeihung nochmals
Ich bin dir dankbar, dass du mir hilfst.
heute kann ich antenne dranlöten usw.

Ok, dann bin ich auf weitere Infos gespannt.

So, aber jetzt....
direkt Data mit D2 angeschlossen, ohne Spannungsteiler.
Antenne angelötet und die Fernbedienung in 5cm entfernung. (Fernedienung 433.92 Mhz)

Leider wird nichts empfangen.
Der Code habe ich umgändert.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

const int rfReceiverPin = D2; // Pin für den RF-Empfänger

void setup() {
  Serial.begin(9600);
  
  // RF-Empfänger initialisieren
  mySwitch.enableReceive(digitalPinToInterrupt(rfReceiverPin)); 
  Serial.println("RF-Empfänger bereit...");
}

void loop() {
  if (mySwitch.available()) {
    // Empfangene Werte extrahieren
    long receivedValue = mySwitch.getReceivedValue();
    int pulseLength = mySwitch.getReceivedDelay();
    int protocol = mySwitch.getReceivedProtocol();

    // Raw-Daten analysieren
    String rawData = "";
    for (int i = 0; i < mySwitch.getReceivedBitlength(); i++) {
      rawData += String((mySwitch.getReceivedRawdata()[i]), DEC) + ",";
    }

    if (receivedValue == 0) {
      Serial.println("Ungültiges Signal erkannt.");
    } else {
      Serial.print("Signal empfangen: ");
      Serial.println(receivedValue);

      Serial.print("Protokoll: ");
      Serial.println(protocol);

      Serial.print("PulseLength: ");
      Serial.println(pulseLength);

      Serial.println("Raw Data:");
      Serial.println(rawData);
    }

    // Empfangene Daten zurücksetzen
    mySwitch.resetAvailable();
  }
}

Nun liefert es auch etwas, aber nur wenn ich mit der fernbedienung dennoch bis auf 1cm zum modul gehe

Das kann vielerlei Gründe haben, z.B.

  1. der Empfänger empfängt andere Störungen.
  2. Da ist zu viel Metall in der Nähe des Empfängers.
  3. die Fernbedienung passt nicht zum Arduino-Protokoll, wir kennen die Fernbedienung immer noch nicht.

so.
Jetzt gibt es nochmal neues infos.

  1. Leider steht nicht viel auf der Fernbedienung... nach lagenm suchen habe ich dieses Produkt gefunden: es sollte dir richtige sein: CMI Funkschalter-Set 4-teilig Weiß kaufen bei OBI
  2. wenn ich mit der Fernebdienung nun bis zur Antenne gehe bzw. bereits am Modul ankomme, funktioniert es. Leider wird jedoch bei jedem Knopfdruck ein anderer RAW Code angezeigt. Ich denke, es liegt an dem schlechten Signal.

Nichts desto trotz, habe ich eine Konsolidierung der verschienen werte versucht bzw. gewisse Raw codes.
Ziel wäre es gewesen, dass beim Senden des Codes überden FS1000 (Mhz Sender) die Steckdose an geht. Leider kein Erfolg...

Nun weiß ich nicht, liegt es an dem ggf. falschen Code. Oder ist der Sender einfach so schlecht. ODer ist es ein rolling code von der Fernbedienung..... fragen, über fragen.

Ich denke nun daran, euch profis zu fragen:
Welchen Sender und Empfänger könnt ihr empfehlen. Deinen RXB6 habe ich schon notiert.

Was ich möchte: später soll die Steckdose geschaltet werden und meine Thinkbee Module.

Danke für eure weiteren Tipps!

Hi, das sieht schwer nach rolling code aus.
Wenn du schon bestellst, dann besorg dir auch noch einen günstigen Logikanalyser zb. sowas:

Da hängst du dann deinen Empfänger dran, und mit der passenden SW von Saleae kannst du dein empfangenes Signal sichtbar machen, dann siehst du was da reinkommt. Alles Andere ist rumstochern im dunkeln.

puh. duch komplexer als ich dachte...

das heißt:
logianalyser zum wemos, daten auslesen, korrekt interpretieren und anschließend dann mittels Mhz Sender per Wemos senden?

Genau so. Nur so kommst du an den exacten Code.
Oder du besorgst dir Funksteckdosen inkl. Fernbefienung die direkt mit RCSwitch kompatibel sind.
Das sind z.b. die BRENNENSTUHL RCS 1000 N Comfort
Die habe ich selbst im Einsatz. Allerdings nur mit den richtigen Empfängern. :wink:

Sollte das dann damit funktionieren, kann man sich auch daran machen, die anderen Steckdosen zum Laufen zu bringen.

na bumm.
schaffe ich das auswerten?
welchen sender würdet ihr empfehlen? er soll alles im Haus + Garten schalten.... die Thinkebee schalter schaffen das locker.... ich habe etwas über RFM69

Könnt ihr gewisse Sender empfehlen?

Dann kannst du die bisher getesteten Dinger (433,92 MHz und AM-Modulation) vergessen.
Die schaffen das nur in Freiluft mit ca. 50 m und gutem Empfänger.
Ich empfehle da die HC-12 Module (Sender/Empfänger), die aber nicht kompatibel zu den Funksteckdosen sind. Damit ist eine bessere Reichweite erzielbar.

Die hc-12 module habe ich
Aber wie du schon gesagt hast, haben die nicht die gleiche Unterstützung...

Aber irgendwie muss das ja möglich sein... der handfunksender muss doch auch ein modul haben, welches weit sendet.

Das heißt, funksteckdose kann ich mit dem fs1000 ansteuern.
Die thinkbee steckdose mit einem anderen modul

Steckdose: analyser besorgen und daten analysieren. Dannach mit dem fs1000 herum versuchen.

Thinkbee modul: wie es da weiter geht weiß ich nivht.
Ich habe mal dem hersteller ein email gesendet bezgl modul und protokoll

Habt ihr noch einen tipp?

Ja, das wird Zeit kosten sich da einzuarbeiten. Aber es kostet noch mehr Zeit wenn man nicht sieht was man da tut und im dunkeln rumstochert.
Und vorsicht mit der RCswitch Lib die kann nur das was in der RCswitch.cpp drin steht!
Wenn man mit der Lib arbeiten will, muss man in der .cpp Datei seine Protokolle anpassen/eintragen.

Der FS1000 ist nicht das beste, diese Sender zb. funktioniern ganz gut, haben auch gute Reichweite.

Werden aber mit 3,3V versorgt. Für den Logikpegel nehme ich den normalen Ausgang vom Every (5V) ohne Levelshifter das können die gut ab, da ja nur kurze Impulse gesendet werden.