433 MHz Funkthermometer decodieren

Darf ich hier auch mal 2 BCD=>DEC und DEC=>BCD reinwerfen

Und bei der FEUTIGKEIT sollte man aufpassen das die Brille nicht beschlägt und man evtl ein paar Bucstabn vergisst :wink:

byte decToBcd(byte val)
{
  return ((val/10)<<4)+(val%10);
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ((val>>4)*10)+val%16;
}

Sitz mal so einen Meter vom Bildschirm entfernt. Dann fehlen keine Buchstaben :smiley: :smiley: :smiley:

Und: danke für die Wandler. Werde ich mal testen. Aber nicht jetzt. Bin müde :sleeping:

Wenn du wieder was zum Rätseln hast, dann her damit ... :wink:

Hey DE8MSH,
haste mal ein paar Infos bezüglich deiner Hardware die du verwendest?

Bedankt

Also deine "Binär Sniffer" wollte ich im prinzipiellen Aufbau auch gerne mal sehen. Welchen Empfänger nutzt du für die 433 Mhz?

Moin Leute,

gerne schreibe ich, was ich verwende.

Wobei mein RX etwas anders aussieht als der auf der C Seite:

Ich habe den aber bei C gekauft. Mehr habe ich im Moment nicht in Verwendung. :grin:

Jomelo:
Wenn du wieder was zum Rätseln hast, dann her damit ... :wink:

Hi Jomelo,

gerne. Irgendetwas ist ja immer :smiley: Achja: wie wäre es herauszubekommen was die letztem 12 BIT sind? Ich logge mal viele Reihen. Kannst ja mal draufsehen....

Moin.

Ich habe den Code nochmal etwas aufgeräumt:

#define _Whole_Data_length    116
#define debug 0

byte pin = 2;
byte whole_array[_Whole_Data_length];   
byte value;
byte array_pos=0;
unsigned long duration;

void setup()
{
    pinMode(pin, INPUT);
    Serial.begin(9600);
    Serial.println("Give it to me...");
    delay(2000);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  if ((duration>600)&&(duration<1000)) {
    if (debug) Serial.print("1");
    whole_array[array_pos] = 1;    
    array_pos++;
  }
  if ((duration>1200)&&(duration<4000)){
    if (debug) Serial.print("0");
    whole_array[array_pos] = 0;   
    array_pos++;
  }
  
  if (array_pos>=_Whole_Data_length) {
        if (debug) Serial.print(";");   
        Serial.print(createValue(30),DEC);    
        Serial.print(createValue(26),DEC);
        Serial.print(",");
        Serial.print(createValue(22),DEC);
        Serial.print(";");    
        Serial.print(createValue(38),DEC);    
        Serial.println(createValue(34),DEC);
        array_pos=0;
  }
}

byte createValue(byte start)
{
    byte bitpos=0;
    for (byte valuepos=start;valuepos<=start+3;valuepos++) {
          bitWrite(value, bitpos, whole_array[valuepos]);
          bitpos++;
    }
    return value;
}

Ich habe nun auch das Minuswert-Bit gefunden:

000000000000000000 1111 101000100000 010001000000 0111000 11111
000000000000000000 1111 101000100000 010001000000 0111000 11111;+04,5°;22%
123456789012345678 9012 345678901234 567890123456 7890123 45678
Wenn 43. Bit 0 == Temp über Null. Ob bei 00,0°??? Kann ich im Freezer nicht provozieren :)

000000000000000000 1111 110011000000 010001001000 00110010 1111
000000000000000000 1111 110011000000 010001001000 00110010 1111;-03,3°;22%
123456789012345678 9012 345678901234 567890123456 7890123 45678
Wenn 43. Bit 1 == Temp unter Null. Ob bei 00,0°??? Kann ich im Freezer nicht provozieren :)

Und wieder was herausgefunden. Hey Jomelo, entcrypte doch mal die letzten Zwölf (oder Acht) Bit, bitte. :grin:

0,0 Gad kannst Du mit Eiswasser herstellen.
Grüße Uwe

Nicht ganz schlecht. Aber der Sender ist nicht Wasserdicht. Leider. Also muss ich 00,0 bei Bitreihe 0000 wohl annehmen.

Oder die ganze Zeit die Werte auslesen und das ding ins Eisfach stellen, irgendwann muss er ja den Wert überschreiten. Vielleicht triffst du ihn ja genau.

DE8MSH:
Nicht ganz schlecht. Aber der Sender ist nicht Wasserdicht. Leider. Also muss ich 00,0 bei Bitreihe 0000 wohl annehmen.

Sender in Nylontüte verpacken.
Grüße Uwe

...oder einfach sagen: "wenn 00,0, dann kein Vorzeichen". Gibt es +0 oder -0 Grad?

Jomelo:
Oder die ganze Zeit die Werte auslesen und das ding ins Eisfach stellen, irgendwann muss er ja den Wert überschreiten. Vielleicht triffst du ihn ja genau.

Habe ich gemacht. Es traf nicht genau 00,0°, weil es immer 1 Minute Messabstand hat.

Dann Umwickle den Sender in ein oder mehrere Handtücher und packe einige warme Kühlelemente dazu. Das müßten den Kühlvorgang verlangsamen.
grüße Uwe

Jomelo:
Wenn du wieder was zum Rätseln hast, dann her damit ... :wink:

Hier hast Du Futter, lieber Jomelo:

                                                  Ist das die CRC???
000000000000000000 1111 111010100100 111010000000 00011111 1111;25,7;17
000000000000000000 1111 000110100100 111010000000 10011011 1111;25,8;17
000000000000000000 1111 111010100100 111010000000 00011111 1111;25,7;17
000000000000000000 1111 011010100100 111010000000 11101001 1111;25,6;17
000000000000000000 1111 101010100100 111010000000 01101101 1111;25,5;17
000000000000000000 1111 001010100100 111010000000 10101010 1111;25,4;17
000000000000000000 1111 010010100100 111010000000 11001000 1111;25,2;17
000000000000000000 1111 010010100100 111010000000 11001000 1111;25,2;17
000000000000000000 1111 100010100100 111010000000 01001100 1111;25,1;17
000000000000000000 1111 000010100100 111010000000 00000011 1111;25,0;17
000000000000000000 1111 100100100100 111010000000 10011011 1111;24,9;17
000000000000000000 1111 100100100100 111010000000 10011011 1111;24,9;17
000000000000000000 1111 000100100100 111010000000 00011111 1111;24,8;17
000000000000000000 1111 111000100100 111010000000 11101001 1111;24,7;17
000000000000000000 1111 111000100100 111010000000 11101001 1111;24,7;17
000000000000000000 1111 011000100100 111010000000 01101101 1111;24,6;17
000000000000000000 1111 101000100100 111010000000 10101010 1111;24,5;17
000000000000000000 1111 101000100100 111010000000 10101010 1111;24,5;17
000000000000000000 1111 001000100100 111010000000 00101110 1111;24,4;17
000000000000000000 1111 110000100100 111010000000 11001000 1111;24,3;17
000000000000000000 1111 110000100100 111010000000 11001000 1111;24,3;17
000000000000000000 1111 010000100100 111010000000 01001100 1111;24,2;17
000000000000000000 1111 010000100100 111010000000 01001100 1111;24,2;17
000000000000000000 1111 100000100100 111010000000 00000011 1111;24,1;17
000000000000000000 1111 100000100100 000001000000 01010000 1111;24,1;20
000000000000000000 1111 100000100100 000001000000 01010000 1111;24,1;20
8< 8< 8< 8< 8< 8< 8<

Wie wird hinten die Checksumme gebildet? Ich gehe davon aus, dass diese Reihe

000000000000000000 1111 ...... 1111

nur die Signale für "Einpegeln", "Start" und "Ende" der Messreihe sind...

...wenn man nicht so genau hinsieht und davon ausgeht, das im Moment KEINE Fehler geprüft werden und weiß, dass nach ein paar Datenreihen sowas wie 03.13° und 00% ankommt, klappt es:

'Here's da code':

#include <nokia_3310_lcd.h>

Nokia_3310_lcd lcd=Nokia_3310_lcd();

#define _Whole_Data_length    116

byte pin = 2;
byte whole_array[_Whole_Data_length];   
byte value;
byte array_pos=0;
unsigned long duration;
char numStr[8];
        
void setup()
{
    lcd.init();
    lcd.clear();
    lcd.writeString( 12, 1, "Waiting for", 0);
    lcd.writeString( 24, 3, "Data...", 0);
    pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  if ((duration>600)&&(duration<1000)) {
    whole_array[array_pos] = 1;    
    array_pos++;
  }
  if ((duration>1200)&&(duration<4000)){
    whole_array[array_pos] = 0;   
    array_pos++;
  }
  
  if (array_pos>=_Whole_Data_length) {
        lcd.clear();
        lcd.writeStringBig( 12, 0,itoa(createValue(30), numStr, 10 ),0);
        lcd.writeStringBig( 24, 0,itoa(createValue(26), numStr, 10 ),0);
        lcd.writeStringBig( 36, 0,".",0);
        lcd.writeStringBig( 42, 0,itoa(createValue(22), numStr, 10 ),0);
        lcd.writeString( 58, 0, "o", 0);
        lcd.writeString( 58, 2, "Temp", 0);
        lcd.writeStringBig( 30, 3,itoa(createValue(38), numStr, 10 ),0);
        lcd.writeStringBig( 42, 3,itoa(createValue(34), numStr, 10 ),0);
        lcd.writeString( 58, 4, "%", 0 );
        lcd.writeString( 58, 5, "Humi", 0 );
        array_pos=0;
    }
}

byte createValue(byte start)
{
    byte bitpos=0;
    for (byte valuepos=start;valuepos<=start+3;valuepos++) {
          bitWrite(value, bitpos, whole_array[valuepos]);
          bitpos++;
    }
    return ((value>>4)*10)+value%16;
}

Hey volvodani, habe Deinen BCD2DEC Tipp mit eingebaut...

Hallo,

ich denke, dass ich nach dem Threat http://arduino.cc/forum/index.php/topic,68773.0.html die Temperatur ziemlich oft richtig auslesen kann:

http://pastie.org/2340236

D.h. "S" und "E" werden meistens richtig erkannt. Den Ausreißer habe ich mal durch Anfassen der Antenne produziert... Jetzt noch Feuchte einbauen und dann kann ich irgendwann mal den Logger zusammenklemmen. RTC muss auch noch dran. Info: "S" und "E" waren notwendig, da nach längerer Laufzeit des Auslesens mal 116, mal 113 usw. Bit ausgelesen wurden. Damit war nicht Sichergestellt, dass ich die Bit für Temp/Feucht durch Abzählen der Stelle immer treffe. Dann kam dort Kram heraus wie 00,2° und 108% und solche Scherze...

Bin aber noch nicht 100% befriedet, da ich am liebsten noch die CRC hinter herausbekommen würde... Hat das schonmal jemand mit dem Ardu gemacht - CRC?

2Bcont...

Nochmal mit Kontrolle der Werte:

http://pastie.org/2340639

Ziffern sind 10er Temp, 1ner Temp, Nackomma Temp, 10er Feuchte, 1er Feuchte

Juhu, it worx :smiley: :smiley: :smiley: