Moin,
ich bin gerade dabei ein Außenthermometer mit einem ESP zu simulieren, damit auf unserer Wetterstation die aktuelle Außentemperatur angezeigt wird. Grund dafür ist, dass unser Außensensor nach einer Weile nicht mehr funktioniert und wir zusätzlich zu dicke Fenster haben, was zu Verbindungsproblemen führt.
Alten Sensor auslesen (LaCrosse-TX), aktuelle Temperatur aus dem Internet ziehen und diese in einen Binärcode umschreiben funktioniert alles tadellos, auch das Senden hat anfangs für einen Tag funktioniert, doch das Problem muss jetzt irgendwo im Timing des OOK Paketes oder besonderen Fällen der aktuellen Temperatur liegen... Ich weiß da wirklich keinen Rat mehr.
Um von Binär zu OOK zu kommen, macht man aus jeder 0 ein 110 und aus jeder 1 eine 100. Das habe ich in einem Test-Sketch mit einer festgesetzten Temperatur (49,9°C) ausprobiert und das lief auch problemlos. Hier der Code:
// Transmit OOK
#define TRANSMIT_PIN 17
#define OOK_ZERO 600
#define OOK_ONE 600
void sendCode(char code[]) {
for(int i = 0; i < strlen(code); i++) {
switch(code[i]) {
case '0':
digitalWrite(TRANSMIT_PIN, HIGH);
delayMicroseconds(OOK_ONE);
digitalWrite(TRANSMIT_PIN, HIGH);
delayMicroseconds(OOK_ONE);
digitalWrite(TRANSMIT_PIN, LOW);
delayMicroseconds(OOK_ZERO);
break;
case '1':
digitalWrite(TRANSMIT_PIN, HIGH);
delayMicroseconds(OOK_ONE);
digitalWrite(TRANSMIT_PIN, LOW);
delayMicroseconds(OOK_ZERO);
digitalWrite(TRANSMIT_PIN, LOW);
delayMicroseconds(OOK_ZERO);
break;
case ' ':
digitalWrite(TRANSMIT_PIN, LOW);
delay(900);
break;
default: break;
}
}
digitalWrite(TRANSMIT_PIN, LOW);
}
void setup() {
Serial.begin(9600);
pinMode(TRANSMIT_PIN, OUTPUT);
}
void loop() {
char tempTest[] = "00001010000011001010100110011001100110011101";
sendCode(tempTest);
delay(10000);
}
Display More
(Ja, zwei "HIGH" hintereinander sind unnötig, ich habe es der Übersicht halber aber so stehen lassen).
Jedes Bit in OOK hat eine Länge von 600µs was eher geschätzt war, anhand der Werte des originalen Sensors. Dieser hat laut rtl_433 etwas andere 'pulse width / gap width / pulse period distributions'.
///// ORIGINAL /////
time : 2020-09-27 23:45:42
model : LaCrosse-TX id : 96
Temperature: 21.2 C Integrity : PARITY
Analyzing pulses...
Total count: 44, width: 84.96 ms (21240 S)
Pulse width distribution:
[ 0] count: 28, width: 1304 us [1292;1308] ( 326 S)
[ 1] count: 16, width: 552 us [552;556] ( 138 S)
Gap width distribution:
[ 0] count: 43, width: 920 us [916;932] ( 230 S)
Pulse period distribution:
[ 0] count: 28, width: 2224 us [2208;2236] ( 556 S)
[ 1] count: 15, width: 1472 us [1472;1480] ( 368 S)
Level estimates [high, low]: 2606, 44
RSSI: -8.0 dB SNR: 17.7 dB Noise: -25.7 dB
Frequency offsets [F1, F2]: 21912, 0 (+83.6 kHz, +0.0 kHz)
Guessing modulation: Pulse Width Modulation with fixed gap
Attempting demodulation... short_width: 552, long_width: 1304, reset_limit: 936, sync_width: 0
Use a flex decoder with -X 'n=name,m=OOK_PWM,s=552,l=1304,r=936,g=0,t=300,y=0'
pulse_demod_pwm(): Analyzer Device
bitbuffer:: Number of rows: 1
[00] {44} 0a 0c 17 12 71 90 : 00001010 00001100 00010111 00010010 01110001 1001
///// ESP/////
Detected OOK package 2020-09-27 23:39:17
Analyzing pulses...
Total count: 44, width: 84.10 ms (21025 S)
Pulse width distribution:
[ 0] count: 29, width: 1300 us [1284;1460] ( 325 S)
[ 1] count: 15, width: 652 us [644;676] ( 163 S)
Gap width distribution:
[ 0] count: 28, width: 624 us [620;652] ( 156 S)
[ 1] count: 15, width: 1268 us [1256;1352] ( 317 S)
Pulse period distribution:
[ 0] count: 43, width: 1924 us [1900;2084] ( 481 S)
Level estimates [high, low]: 15987, 168
RSSI: -0.1 dB SNR: 19.8 dB Noise: -19.9 dB
Frequency offsets [F1, F2]: 10366, 0 (+39.5 kHz, +0.0 kHz)
Guessing modulation: Pulse Width Modulation with fixed period
Attempting demodulation... short_width: 652, long_width: 1300, reset_limit: 1356, sync_width: 0
Use a flex decoder with -X 'n=name,m=OOK_PWM,s=652,l=1300,r=1356,g=0,t=256,y=0'
pulse_demod_pwm(): Analyzer Device
bitbuffer:: Number of rows: 1
[00] {44} 0a 0c a6 10 61 e0 : 00001010 00001100 10100110 00010000 01100001 1110
Display More
Was genau bedeutet die Pulse width und wie setzt sie sich zusammen? Die 1300µs von 'long' treffe ich ganz gut, doch bei den 'shorts' habe ich immer so ~100µs zu viel.
Bezeichnet die Pulse width die Länge an 'HIGH's, also an Einsen hintereinander? Dann würde die Rechnung mit 600+600+etwas Verzögerung = 1300µs nämlich hinkommen und auch die 650µs sind plausibel.
Dann gibt es da noch Unterschiede bei der Gap und Pulse width: Das Original hat bei Gap eine Zeile mit fast immer 920µs und ich habe dort zwei Zeilen mit 624 und 1268µs, bei denen ich nicht weiß, wie sie Zustande kommen. Und das Original hat zwei Zeilen bei Pulse und ich nur eine. Bei Pulse weiß ich aber, dass es nur die Summe aus den vorherigen Zahlen ist.
Ist jetzt viel Text geworden, aber vielleicht hat schon mal jemand so etwas versucht und kann mir sagen, wie lange ich jeweils HIGH und LOW halten muss und ob ich noch irgendwelche notwendigen Pausen übersehen habe.
NACHTRAG 1: rtl_433 kann das Paket richtig entschlüsseln, erkennt es aber nicht als LaCrosse-TX. Wenn ich die Bits händisch übersetze, kommt die richtige Temperatur heraus.
Grüße
Kelvin