Pages: 1 [2] 3 4   Go Down
Author Topic: 433 MHz Funkthermometer decodieren  (Read 11203 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

N'Abend.

Nachdem ich von Jomelo sehr gute Tipps bekommen habe zu den Bits, die das Funkthermometer auspuckt, habe ich mit diesem Code

Code:
#define _Whole_Data_length    116

int pin = 2;
byte tempten;
byte tempone;
byte tempcom;
byte humiten;
byte humione;
byte valuepos=0;
byte bitpos=0;
byte bitcounter=1;
byte array_pos=0;
unsigned long duration;
int whole_array[_Whole_Data_length];   

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

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) {
        for (int valuepos=22;valuepos<=25;valuepos++) {
          bitWrite(tempten, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;
 
        for (int valuepos=26;valuepos<=29;valuepos++) {
          bitWrite(tempone, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;

        for (int valuepos=30;valuepos<=33;valuepos++) {
          bitWrite(tempcom, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;

        for (int valuepos=34;valuepos<=37;valuepos++) {
          bitWrite(humiten, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;       

        for (int valuepos=38;valuepos<=41;valuepos++) {
          bitWrite(humione, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;       

        Serial.print("Es sind ");   
        Serial.print(tempcom,DEC);   
        Serial.print(tempone,DEC);
        Serial.print(",");
        Serial.print(tempten,DEC);
        Serial.print(" Grad Celsius bei ");
        Serial.print(humione,DEC);   
        Serial.print(humiten,DEC);
        Serial.println(" Prozent Feutigkeit.");       
        array_pos=0;
  }
}

das hier im SM herausbekommen:

Code:
Give it to me...
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,4 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,4 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,2 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,2 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,2 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,0 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,0 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,0 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,7 Grad Celsius bei 28 Prozent Feutigkeit.

Ich denke, da kann man nicht schimpfen smiley Allerdings findet im Moment keinerlei Check auf Fehler statt. Klar bei dem Q'N'D Code oben  smiley-grin

Danke, danke, danke nochmal an Dich, Jomelo, für Deine Unterstützung!

Todo's sind noch:

- SD Card implementieren
- Ausgabe auf Display
- Fehlercheck / oder herausfinden, was die letzten 12 BIT nach Temp. und Feucht. bedeuten...
- Umwandelt von Bit in Dezimal in eine Funktion bauen.
« Last Edit: August 04, 2011, 04:03:35 pm by DE8MSH » Logged


AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 15
Posts: 1065
I am 1 of 10 who understands binary
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink

Code:
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;
}
« Last Edit: August 04, 2011, 04:15:44 pm by volvodani » Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Und: danke für die Wandler. Werde ich mal testen. Aber nicht jetzt. Bin müde  smiley-sleep
Logged


Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 25
Posts: 572
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du wieder was zum Rätseln hast, dann her damit ...   ;-)
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 15
Posts: 1065
I am 1 of 10 who understands binary
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Bedankt
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Heidelberg
Offline Offline
Full Member
***
Karma: 1
Posts: 207
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

 

0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin Leute,

gerne schreibe ich, was ich verwende.

- Arduino mit Atmega 328
- RX ist der http://www.conrad.de/ce/de/product/130428/SENDE-EMPFAeNGERMODULSET-433MHZ/2401020

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.  smiley-mr-green
Logged


0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du wieder was zum Rätseln hast, dann her damit ...   ;-)

Hi Jomelo,

gerne. Irgendetwas ist ja immer  smiley-grin Achja: wie wäre es herauszubekommen was die letztem 12 BIT sind? Ich logge mal viele Reihen. Kannst ja mal draufsehen....
« Last Edit: August 05, 2011, 01:57:42 am by DE8MSH » Logged


0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin.

Ich habe den Code nochmal etwas aufgeräumt:

Code:
#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;
}
« Last Edit: August 05, 2011, 06:54:17 am by DE8MSH » Logged


0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe nun auch das Minuswert-Bit gefunden:

Code:
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. smiley-mr-green
« Last Edit: August 05, 2011, 07:47:13 am by DE8MSH » Logged


Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20182
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 25
Posts: 572
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20182
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 342
A SWL life as a coder... I'll try.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Pages: 1 [2] 3 4   Go Up
Jump to: