433MHz RF Funkmodul Set RX470-4 / WL102-341

Stimmt. :wink:
Und die laufen immer noch Problemlos.
Grad erst ein Projekt mit einem ESP32 und der Lib modernisiert.

Hast du denn dafür eine Alternative, die du dem TO anbieten könntest ? Mitleser dürften sich auch darüber freuen.
Ok, mal ausgenommen von der virtualwire.h oder radiohead.h

Hatte ich schonmal gepostet in einem anderen Thread. Geht ganz ohne lib.

Die Daten die ich sende:

//Sendevariablen Funksteckdosen A - D (S)
  uint32_t A1on  = 0b100000010111010010110000;// 8484016
  uint32_t A2on  = 0b100001100010011001000000;// 8791616
  uint32_t A1off = 0b100000110001101010010000;// 8592016
  uint32_t A2off = 0b100001011000110100100000;// 8752416
  uint32_t B1on  = 0b100010000000001101110100;// 8913780
  uint32_t B2on  = 0b100010101111101100110100;// 9108276
  uint32_t B1off = 0b100010010011110010100100;// 8993956
  uint32_t B2off = 0b100011001100000100010100;// 9224468
  uint32_t C1on  = 0b100010000000001101111100;// 8913788
  uint32_t C2on  = 0b100010101111101100111100;// 9108284
  uint32_t C1off = 0b100010010011110010101100;// 8993964
  uint32_t C2off = 0b100011001100000100011100;// 9224476
  uint32_t D1on  = 0b100010010011110010100010;// 8993954
  uint32_t D2on  = 0b100011001100000100010010;// 9224466
  uint32_t D1off = 0b100010000000001101110010;// 8913778
  uint32_t D2off = 0b100010101111101100110010;// 9108274

Hiermit sende ich was ich brauche:

uint32_t DSchalt[] = {A1on,A2on};
     Std_Schalt(DSchalt, 2); // Steckdosen ein senden  

Und hier das Senden selbst, in void starter, void one, void zero können die Signaltimings angegeben werden.


// RC-Signal senden Brennenstuhl Funksteckdosen
void Std_Schalt(uint32_t DSchalt[], uint8_t size) { 
  uint8_t Data1,Data2,Data3;
  for (uint8_t i = 0; i < size; i++) {
    Data3=(DSchalt[i])&0xff;
    Data2=((DSchalt[i])>>8)&0xff;
    Data1=((DSchalt[i])>>16)&0xff;
    
   for (uint8_t k = 0; k < 8; k++) { //8 x senden
      starter();
      sendserial(Data1, 7); 
      sendserial(Data2, 7);
      sendserial(Data3, 7);
   }
   digitalWrite(sendpin, LOW); //alles ausknipsen
  }    
}

//bitweise Senden von 0 + 1 und Startimpuls
void sendserial(uint8_t data, byte bytecount) { 
  for (int j = bytecount; j >= 0; j--) { 
    ((data & (1 << j))? one() : zero() );
  }
}

void starter () { //starter senden
  digitalWrite(sendpin, HIGH);
  delayMicroseconds(300);
  digitalWrite(sendpin, LOW);
  delayMicroseconds(2300);
}

void one () {//1 
  digitalWrite(sendpin, HIGH);
  delayMicroseconds(1050);
  digitalWrite(sendpin, LOW);
  delayMicroseconds(450);
}

void zero () { //0 
  digitalWrite(sendpin, HIGH);
  delayMicroseconds(300);
  digitalWrite(sendpin, LOW);
  delayMicroseconds(1200);
}

Mit den ungereimtheiten meine ich, du hast ein Signal mit der lib eingelesen, bekommst den Inhalt, die Protokoll Nr. (Tabelle RCSwitch .cpp) und wenn du versuchst das Signal mit dem erkannten Protokoll zu senden, funktioniert es nicht. Wenn du Glück hast funktioniert irgendein anderes Protokoll.
meiner Meinung nach scheint durch die Lib irgendwie die Signalzeiten beim Empfang und beim Senden nicht wirklich zu passen. Und wenn du nix hast zum Visualisieren verschwendest du jede Menge Zeit ohne richtig weiter zu kommen.

Gruß vom norra Vättern
Dieter

Ok, verstehe.
Da geht es aber hauptsächlich um die kodierung (fremder) Signale von externen Geräten. Da gebe ich dir Recht, da muss man ein wenig mit dem Timing am Sender (Pulse Länge) spielen.
Dennoch, bisher habe ich mit der Steuerung von Funksteckdosen und der Lib def. keine Probleme gehabt. Projekte mit kleinen Hansendern auf Basis der Lib laufen bisher auch fehlerfrei. Ebenso mit Funktionen von Lib zu Lib.
Warum der TO für seine Anwendung allerdings RCSwitch einsetzt, ist mir ein Rätsel.

Aber danke für deine Sketchbeispiel, ich werde es mir mal abspeichern.

Werde mir den Tester bestellen um auch die Signale besser zu verstehen👍

Wenn ich in Arduino nach Beispielen suche, wie und wo (Datei oder Bibliothek) mache ich dies am besten, damit ich auch das richtige nehme?

Das hängt immer davon ab, was du erreichen möchtest.
Z.B. die RCSwitch setzt man besser zum Schalten von Funktionen oder Verbrauchern ein. Wenn du Meßdaten übertragen möchtest, dann nimm besser die RadioHead. Oder eben besser dafür die HC-12, das geht dann je nach Controller ohne spez. Lib.

Ok, dann bestelle ich den hc-12 gleich mit.

Gib es im Atduino ein Beispielcode für diesen, um das senden und empfangen zu testen, aufbauen? Wie finde ich diesen?

Z.B. Hier.
Einfach HC-12 in Google eingeben.
Und wenn du hier im Forum suchst, findest du ebenso viele hilfreiche Beiträge.

Also HC-12 und Tester sind bestellt.

Gehe nun in die Ferien, werde erst wieder in ca 1.5-2 Wochen mich hier wieder melden.

so zurück aus den Ferien und gleich ans Funkmodul

Sender;
Nano
DHT22
Regenmengenmesser
HC-12

#include <SoftwareSerial.h>
#include <LowPower.h>
#include <DHT.h>

// === Konfiguration ===
#define DEBUG 0  // 1 = USB-Monitor aktiv, 0 = Stromsparbetrieb

// === DHT22 Sensor ===
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// === Regenmesser WH-SP-RG ===
#define RAIN_PIN 3
volatile unsigned long rainClicks = 0;
unsigned long totalRainClicks = 0;
const float RAIN_MM_PER_TICK = 0.3;

// === HC-12 ===
#define HC12_RX 8
#define HC12_TX 9
SoftwareSerial hc12(HC12_RX, HC12_TX); // RX, TX

// === Zeitsteuerung ===
byte wakeCounter = 0;

// === Debug-Makros ===
#if DEBUG
  #define debugBegin(x) Serial.begin(x)
  #define debugPrint(x) Serial.print(x)
  #define debugPrintln(x) Serial.println(x)
  #define debugPrintln2(x, y) Serial.println(x, y)
#else
  #define debugBegin(x)
  #define debugPrint(x)
  #define debugPrintln(x)
  #define debugPrintln2(x, y)
#endif

void countRain();  // Vorab-Deklaration

void setup() {
  debugBegin(9600);
  debugPrintln("Wetter-Sender gestartet");

  hc12.begin(4800);
  dht.begin();

  pinMode(RAIN_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(RAIN_PIN), countRain, FALLING);
}

void loop() {
  if (wakeCounter >= 8) {  // ca. 1 Minute
    wakeCounter = 0;

    // Regenimpulse sichern
    noInterrupts();
    unsigned long newClicks = rainClicks;
    rainClicks = 0;
    interrupts();

    totalRainClicks += newClicks;
    float rainAmount = totalRainClicks * RAIN_MM_PER_TICK;

    float temp = dht.readTemperature();
    float hum = dht.readHumidity();

    if (!isnan(temp) && !isnan(hum)) {
      debugPrint("T: ");
      debugPrint(temp);
      debugPrint(" °C, H: ");
      debugPrint(hum);
      debugPrint(" %, Regen: ");
      debugPrintln2(rainAmount, 2);

      hc12.print("Temp: ");
      hc12.print(temp);
      hc12.print(" °C, Feuchte: ");
      hc12.print(hum);
      hc12.print(" %, Tagesregen: ");
      hc12.print(rainAmount, 2);
      hc12.println(" mm");
    } else {
      debugPrintln("Sensorfehler");
      hc12.println("Sensorfehler");
    }
  }

  // Arduino 8 Sekunden schlafen
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  wakeCounter++;
}

void countRain() {
  rainClicks++;
}

Empfänger:
Nano
HC-12

#include <SoftwareSerial.h>

#define HC12_RX 10
#define HC12_TX 11
#define HC12_SETPIN 6
SoftwareSerial hc12(HC12_RX, HC12_TX);

String lineBuffer = "";

void setup() {
  pinMode(HC12_SETPIN, OUTPUT);
  digitalWrite(HC12_SETPIN, HIGH);  // Normalbetrieb
  hc12.begin(4800);
  Serial.begin(9600);
  Serial.println("Empfänger bereit");
}

void loop() {
  while (hc12.available()) {
    char c = hc12.read();
    if (c == '\n' || c == '\r') {
      lineBuffer.trim();
      if (lineBuffer.length() > 0) {
        Serial.print("Empfangen: ");
        Serial.println(lineBuffer);
      }
      lineBuffer = "";
    } else {
      lineBuffer += c;
    }
  }
}

Und es funktioniert super.

Herzlichen Dank für eure Hilfe und Geduld:-)

Das ist prima und danke für die Rückmeldung.

Kann ich den HC-12 reseten

Was genau meinst du damit ?

löschen, auf Werkseinstellung.

Hatte ja verbindung, heute komme ich nicht mal mehr in AT rein. Habe nichts verändert

Hast du denn am HC-12 die Einstellungen geändert?

Hiermit kannst du Einstellungen verändern bzw. anpassen.

Dies kenne ich, aber auf AT Befehle reagiert er nicht mehr

Dann hast du evtl. einen Verdrahtungsfehler oder der ist defekt.

ok

prüfe nochmals