Hej Bastelix,
ich habe am Anfang auch mit der RCSwitch rumgebastelt, bin aber dauernd an deren Grenzen gestoßen. Das Problem damit ist sie erkennt nur daß was in der Protokolltabelle drin steht.
Dann suchst und stellst du so lange rum bis du was brauchbares raus bekommst. Damit verschwendest du aber nur Lebenszeit.
Ich habe die Lib mal mit einem billigen Empfänger und einem einfachen Logikanalyser ausgelesen, und habe festgestellt, das daß was du eingestellt hast von den Timings hinten nicht rauskommt. Und dann auch meist nicht funktioniert.
Ich lese die Signale nur noch direkt mit dem Analyser aus und korrigiere meinen Sketch entsprechend (siehe unten).
Bei den RC-Protokollen kommt es auf das Timing an, und natürlich das Startsignal, womit der Empfänger erkennt das das Signal für ihn bestimmt ist, und das das Signal mehrfach hintereinander gesendet wird. Je genauer du in der Empfängertoleranz bist mit den Timings desto sicherer funktioniert es.
Ich verwende Brennenstuhl Funksteckdosen RC CE1 4001 die haben eine Schaltleistung von 1000W, wenn ich mehr Schaltleistung benötige nehme ich die etwas älteren RCR 3600 die können 3600W, und sind mit der 4001 FB steuerbar.
Mit der RCSwitch mach ich gar nix mehr, ich funke die Funkdosen direkt an mit dem entsprechenden Timing an. Hier der Sketch mit den Timings der 4001 FB.
Du wirst den Sketch ja eh noch optimieren , für mich funktioniert er seit Jahren ohne Probleme.
Gruß Dieter
#define sendpin 2 // RC 433Mhz Daten-Pin
uint32_t A1on = 149854355;
//uint32_t A1off = 149854355; //hier das off Signal eintragen.
void setup() {
//Serial.begin(115200);
}
void loop() {
uint32_t DSchalt[] = {A1on};
//uint32_t DSchalt[] = {A1off};
Std_Schalt(DSchalt, 1); // Steckdosen ein senden
delay(5000);
}
// RC-Signal senden Brennenstuhl Funksteckdosen 4001
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);
} |