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).