433 Mhz Receiver + Tchibo Wetterstation + Logic Analyzer

Probier auch mal den leicht modifizierten Tchibo-Sketch:

/*
Liest dieses komische Tchibo-Wetterdingens per 433MhZ aus.
*/

boolean cnt=false;
int reader=0;
int cnter=0;
const int msgLeng=36;
char reading[msgLeng];
void setup() {
Serial.begin(115200);
Serial.println("go!");
pinMode(2, INPUT);
pinMode(13,OUTPUT);
}

void loop() {
int LowVal=pulseIn(2,LOW);
if (LowVal < 11000) { // Kuezer als 1100ms Low ? Koennte unserer Sensor sein
if (decodeTime(LowVal) == 'S') { // Startsequenz ?
cnt=true; // Dann go fuer die Sammlung
cnter=0; // BitCounter auf 0
}
if ( (cnter<msgLeng) && cnt && ((decodeTime(LowVal) == '0') || (decodeTime(LowVal)=='1'))) { // Stream noch nicht voll und ein Bit erkannt ?
Serial.print(decodeTime(LowVal));
reading[cnter]=decodeTime(LowVal); // Ab ins Array damit
cnter=cnter+1; // Arraycounter fuers naechste Bit inkrementieren
}
} else {
cnt=false; // Zurueck auf Anfang - nix fuer uns.
}

if ((cnter==msgLeng)) { // Arrray Voll ?
Serial.print('/');
Serial.print(reading);
Serial.print('/');
Serial.println(decodeTemp(reading));
cnter=0;
cnt=false;
}

}

float decodeTemp(String bitstream) { // Versucht aus dem Bitstrom die Temp. zu berechnen
int x=0;
int chk=0;
for (int i=16;i<24;i++) { // Extrahiert das Byte zwischen Bit 16 und 24 und packt es als integer in "x"
if (bitstream == '1') {

  • bitSet(x,(23-i));*
  • }*
  • }*
  • for (int i=4;i<15;i++) { // Kenner aus den 3 Nibbles zwischen Bit 4 und 15 holen (koennte auch der Kanal sein ?)*
    _ if (bitstream == '1') {_
    * bitSet(chk,(14-i));*
    * }*
    * }*
    /* if (chk != 136) { // Kenner = 136 ? Dann ist es unserer Sensor !
    * return(-999); // Wenn nicht, dann -999 zurueck*
    _ } else*/ {_
    * return ((float)x/10);*
    * }*
    }
    char decodeTime(int time){ // Wandelt die Pulse in Bits um.
    * if (time > 1500 && time < 11000) { // passendes Signal (zwischen 150ms und 11000ms) ?*
    * if (time < 2500) { // kleiner 250ms ? Dann LOW*
    * return '0';*
    * } *
    * if (time < 5000 && time >3000) { // Zwischen 500ms und 1000ms dann HIGH*
    * return '1';*
    * }*
    * if (time >8000) { // Groesser 800ms dann Startsequenz !*
    * return 'S';*
    * }*
    * } else {*
    * return 'X';*
    * } *
    }
    [/quote]
    Setzte msgLeng dazu mal wieder auf 28. Bei mir sind es 36 Bits aber die letzten 8 ergeben keinen Sinn - macht also auch 26 Bit verwertbare Daten. Die decodeTime Methode funktioniert nicht für mein Thermometer aber immer wenn ich auf "TX" am Thermometer drücke kommt immer 3x die gleiche Bit-Sequenz. Die ersten 14 Bits sind bei mir konstant. Die nächsten 2 kodieren den Kanal. Danach folgen 12 Bit, die die Temperatur als signed integer kodieren (muss man durch 10 Teilen, dann hat man die Temperatur mit 1 Nachkommastelle).