433 MHz Funkthermometer decodieren

...und nun mit meinem Lieblingsdisplay - dem SSD1325 aus einem BZM:

Ich habe auch schon eine Idee, was ich mit dem Thermometer mache. Nur Anzeigen ist ein wenig doof :slight_smile:

2BC...

Ich werde mir Leseverbot in diesem Thread auferlegen :grin:

Was ist denn das nun schon wieder für ein bildhübsches Display ? Dem Code nach kein grafisches, dem Aussehen nach aber schon ?! :zipper_mouth_face:

Doch, lieber OM, es ist grafisch. Es hat 16 Graustufen, sozusagen. Ober besser: Gelbstufen. Wollte damit mal einen protablen Sattracker bauen:

Habe es aber noch nicht richtig fertig. ISS klappte aber schon :wink:

Enstammt Ursprünglich mal diesem Threat:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1294400534

jkw hat mir sehr stark bei dem ganzen geholfen :slight_smile:

0,5 mm Pinabstand machen mich zögerlich. Da schweiss ich lieber nicht dran rum :slight_smile:

So ist im Moment der Stand der Dinge:

http://www.qth.at/de8msh/temphumilogger.html

Man sieht, dass ohne Check leider manchmal Falschdaten kommen. Das sind die Peaks. Irgendwie kann ein Nibble >9 sein und dann macht es peng. Das sind dann mal ebend 111% Humi oder plötzlich 80°. Da bin ich noch dran.

Im Moment passiert das:

  • Lesen der Bitreihe vom 433 MHz Sender
  • Auswerten der Nibble und Erstellung von Temp. und Humi.
  • Anzeige von Zeit / Datum auf 16x2 Zeichen LCD per RTC
  • Anzeige von Temp. / Humi. auf 16x2 Zeichen LCD
  • Schreiben der Daten auf SD-Card

Was noch nett wäre:

  • Auslesen der Daten per Funk. Habe es schonmal gemacht. Den Sender zu verbauen ich nicht das Problem. Ich habe aber nur einen RX :smiley: Und der empfängt die Wetterdaten :smiley:

http://arduiniana.org/libraries/newsoftserial/
Grüße Uwe

Moin Uwe,

ich danke Dir sehr für die Info. Die benutzte ich schon in anderen Projekten. Das ist nicht das Problem.

Ich habe aber einen RX zu wenig, denn das Setup sieht ja so aus:

1 x TX (Temperatur-Sender / Außer Haus aufgehängt)
1 x RX (Empfänger an Ardu)

Jetzt brauche ich noch

1 x TX (Sender an Ardu - den habe ich)
1 x RX an PC (den habe ich nicht)

Ich bin echt am überlegen ob ich einen 433 MHz RX-Modul aus einer alten Funksteckdose rausreiße und den RX dann an einen MAX232-Setup setzte, um es an den PC zu klemmen. Recycling mach Spaß... Oder ich kaufe wieder was bei Big C oder Big R.

Entschuldige, da hatte ich Dich falsch verstanden. Du sprachst von den HF-Modulen.

Das einzige was ich Dir sagen kann, Kontrolliere daß die Module sich nicht gegenseitig stören da Du 2 Sender hast.
Ich weiß nicht ob das Frequenzband 433mHz mehrere Kanäle hat und man diese einstellen kann oder ob man auf 315MHz ausweichen muß.

Grüße Uwe

Hallo zusammen,

hab mich auch mal an dem Script versucht....

#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);
    Serial.begin(9600);
    Serial.println("Give it to me...");
    delay(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;
  }
}

Nur sieht der SM nicht so toll aus:

Es sind 118,12 Grad Celsius bei 31 Prozent Feutigkeit.
Es sind 30,3 Grad Celsius bei 47 Prozent Feutigkeit.
Es sind 156,7 Grad Celsius bei 1114 Prozent Feutigkeit.
Es sind 107,0 Grad Celsius bei 69 Prozent Feutigkeit.
Es sind 27,5 Grad Celsius bei 35 Prozent Feutigkeit.
Es sind 100,10 Grad Celsius bei 08 Prozent Feutigkeit.
Es sind 1213,14 Grad Celsius bei 129 Prozent Feutigkeit.
Es sind 1214,7 Grad Celsius bei 711 Prozent Feutigkeit.
Es sind 713,15 Grad Celsius bei 1315 Prozent Feutigkeit.
Es sind 1513,10 Grad Celsius bei 612 Prozent Feutigkeit.
Es sind 88,12 Grad Celsius bei 58 Prozent Feutigkeit.
Es sind 410,6 Grad Celsius bei 67 Prozent Feutigkeit.
Es sind 78,5 Grad Celsius bei 410 Prozent Feutigkeit.
Es sind 133,5 Grad Celsius bei 120 Prozent Feutigkeit.
Es sind 84,8 Grad Celsius bei 92 Prozent Feutigkeit.
Es sind 1314,1 Grad Celsius bei 1515 Prozent Feutigkeit.
Es sind 118,3 Grad Celsius bei 815 Prozent Feutigkeit.
Es sind 63,1 Grad Celsius bei 153 Prozent Feutigkeit.
Es sind 915,2 Grad Celsius bei 133 Prozent Feutigkeit.

Ist das nur rauschen?

Danke und viele Grüße

Tom

Das ist kein Rauschen, dass ist eine fehlerhafte Auswertung des übermittelten Datensatzes.

Könntest du mal hinter deinen Bitmustern (dem Block mit dem 000000000000000000 1111 000010100100 111010000000 00000011 1111;25,0;17) usw. die Werte posten, die dabei herauskommen und ggf. dazu posten, ob der Datensatz valid oder invalid ist? Also eine Art Tabelle mit RAW, lesbar und valid/invalid?

Viele Grüße
Boris

Hallo Leute,
ich finde es toll, wenn man so viel Arbeit in ein Projekt steckt. Es stellt sich nur die Frage, ob man das Resultat am Ende auch auskosten kann.
Die Wetterstation in gelinde ausgedrückt SCHROTT.
Wer das nicht glauben sollte, schaut sich die Berichte im Marktplace an.

Sorry, tut mir Leid.

Gruß Gerd

Ach du schande, die Bewertungen sind ja durchgängig Grütze.

Dann wird es wohl nichts bringen, sich die Bitmuster sowie die Umrechnungen anzuschauen, weil dabei vermutlich herauskommen wird, dass die Umrechnung korrekt ist, und die ermittelten Daten seitens der Station Müll sind.

Moin,

mittlerweile ist es auch bei mir soweit. Unter 0° und die Werte sind weg. Es kann aber auch daran liegen, dass die Batterie nicht mehr genug Strom liefert. Müsst' ich mal mit einer Neuen testen. Daher werde ich den Weg gehen und den Sender auseinanderrupfen und die Komponenten an den Ardu bauen. Recyle-and-make-it.

ABER: mir ging es in primär um das Cracken des Bitstream. Also nach dem Motto: "Wie macht man soetwas". Die Station stand damals herum und kostete nur 7,-€. Ich hatte damals den Ardu relativ neu und einen 433 MHz Receiver hatte ich auch liegen. Daher bot sich das Projekt irgendwie an.

Dieses Prinzip "Wie macht man soetwas" kann man ja aber auf div. Stationen anwenden, denke ich.

Boris82:
Dann wird es wohl nichts bringen, sich die Bitmuster sowie die Umrechnungen anzuschauen, weil dabei vermutlich herauskommen wird, dass die Umrechnung korrekt ist, und die ermittelten Daten seitens der Station Müll sind.

Moin,

wenn Du das doch nochmal angehen willst: ich habe das Sketch (0023) nochmal etwas optimiert. Jetzt sollten die Werte korrekt analysiert werden können:

int startarray;
int thhuarray[40];
int thhuarraypos=0;
int startok=0;
int endok=0;
int lengh=0;


void setup() {
  Serial.begin(19200);
 
  lastTime = micros();
  changeCount = 0;
  startarray =0;
  
  attachInterrupt(0, r, CHANGE);
  for (int i=0;i<=40;i++) {
    thhuarray[i]=5;
  }
}

void loop() {
 
}

void output() {

}

void r() {
   int duration = pulseIn(2, HIGH);
  //  Serial.print(duration);
//    Serial.print(" = ");

    if ((duration>3600) & (duration<3900))  {
      Serial.println("");
      Serial.print("#");    
      startarray=1;
      thhuarraypos=0;
      startok=1;
      lengh=0;
    }

    if (startarray=1) {
    if ((duration>600) & (duration<1000)) {
    Serial.print("0");
    thhuarray[thhuarraypos]=0;
    thhuarraypos++;
    lengh++;
    if (lengh==8) {
      lengh=0;
    Serial.print(" ");      
    }
    }
    if ((duration>2000) & (duration<2500)) {
      Serial.print("1");   
      thhuarray[thhuarraypos]=1;
    thhuarraypos++;
    lengh++;
    if (lengh==8) {
      lengh=0;
    Serial.print(" ");      
    } 
    }
    
    if (thhuarraypos==40) {
      startarray=0;
      Serial.print("E       ");
      Serial.print(thhuarray[36]);
      Serial.print(thhuarray[37]);
            Serial.print(thhuarray[38]);
                  Serial.print(thhuarray[39]);
                        Serial.print("       ");
      endok=1;
      if (startok & endok & (thhuarray[36]==0) & (thhuarray[37]==0) & (thhuarray[38]==0) & (thhuarray[39]==0) & (thhuarray[0]==0) & (thhuarray[1]==0) & (thhuarray[2]==0) & (thhuarray[3]==0) ) {
      Serial.print(" OK! ");  
      }      
      else Serial.print(" BAD!!! ");  
      
      thhuarraypos=0;
      startok=0;
      endok=0;      
    }
  }
}

Es werden m.E. sehr sicher die OK/Bad Packete erfasst:

01111010 0000
#
#01111111 11111111 
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 00011111 11111111 11111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 01111111 11111111 1
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 01010010 00010000 00000000 00000010 1000001
#10000001 00000101 00000000 011011
#00010000 00011000 
#00000010 00000110 00
#00010000 00000000 00
#10
#00111111 11111111 11
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 10000111 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 00111111 11111111 11
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 00010100 00000111 11111111 1111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 0000
#
#
#
#011000
#00
#10011111 11111111 11100001 00100111 11110111 E       0111        BAD!!! 11111000 11100000 11111111 11111111 
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 0
#01101111 11111111 1111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 11111111 111111
#00001001 00111111 10111011 11111000 11100000 E       0000        OK! 1

Hier nochmal der ganze Code:

int startarray;
int thhuarray[40];
int thhuarraypos=0;
int startok=0;
int endok=0;
int lengh=0;

void setup() {
  Serial.begin(9600);
  startarray =0;
  attachInterrupt(0, r, CHANGE);
  for (int i=0;i<=40;i++) {
  	thhuarray[i]=5;
  }
}

void loop() {
}

void output() {
}
Hacked Thierry Mugler 433 MHz Thermometer Protokoll Decoded By Arduino - °C
byte createValue(byte start)
  {
      byte value=0;
      byte bitpos=0;
      for (byte valuepos=start;valuepos<=start+3;valuepos++) {
            bitWrite(value, bitpos, thhuarray[valuepos]);
            bitpos++;
      }
      return value;
  }

void r() {
    int duration = pulseIn(2, HIGH);

    if ((duration>3600) & (duration<3900))  {
      startarray=1;
      thhuarraypos=0;
      startok=1;
      lengh=0;
    }

    if (startarray=1) {
	    if ((duration>600) & (duration<1000)) {
		    thhuarray[thhuarraypos]=1;
		    thhuarraypos++;
		    lengh++;
		    if (lengh==4) {
		      lengh=0;
		    }
	    }

    if ((duration>2000) & (duration<2500)) {
		    thhuarray[thhuarraypos]=0;
		    thhuarraypos++;
		    lengh++;
		    if (lengh==4) {
		      lengh=0;
		    } 
    }
    
    if (thhuarraypos==40) {
		startarray=0;
		endok=1;

		if ((startok & endok) & (thhuarray[36]==1) & (thhuarray[37]==1) & (thhuarray[38]==1) & (thhuarray[39]==1) & (thhuarray[0]==1) & (thhuarray[1]==1) & (thhuarray[2]==1) & (thhuarray[3]==1) ) {
		Serial.print(createValue(12),DEC);
		Serial.print(createValue(8),DEC);
		Serial.print(".");
		Serial.print(createValue(4),DEC);    
		Serial.print(";");        
		Serial.print(createValue(20),DEC);
		Serial.print(createValue(16),DEC);
	       Serial.print("\r");        
	      }      
      thhuarraypos=0;
      startok=0;
      endok=0;      
    }
  }
}

Der Code läuft recht Stabil ohne weitere Ausreißer bis jetzt. Siehe Live Daten:

Der Rel Humidity Sprung kommt weile meine Frau heute den WLAN Router durch Staubsaugen stromlos machte:
EDIT: Ich denke den "Feuchtesensor" Marke Billig China kann man wohl vergessen: der Sprung von 47% auf 57% ist doch recht schnell hochgegangen...

:slight_smile:

Der Codeteil für den Interrupt ist durch Sui entstanden. Er hatte ihn für die 433 MHz Steckdosen Analyse implementiert.

Weiterhin traue ich der Temperatur mehr als der Rel Luftfeuchtigkeit.

Egal: das Gesamtprojekt ich für mich nun erledigt. Wir hackten das Protokoll, es gibt einen Code, der rennt. Der Ardu sendet per WR703N Daten. Das war's. Over'n'out.

Hallo wer kann mir helfen ?
Will meine Station auch decodieren hab aber noch ein paar fragen

  • Wird die Bitfolge 2 - 3 Mal hinternander gesendet ?

  • Kann einer vieleicht ein Codeschnipsel Posten mit dem ich die Bits belauschen kann

  • Kaufempfehlung für mehrere Temperatur sensoren

Vielen Dank

I own a Thierry Mugler wireless weatherstation. I ported code from Roel http://roel.reijerse.net/thierry/ to Arduino and it works fine.

Hallo,

Hat jemand noch ein Bild von den Thierry Sender-Platine? Ich habe eine Defekten bekommen den ich gerne reparieren möchte. Auf meiner Sender-Platine ist Diode D61 ganz zum Schrott. Komplet abgebrochen. Konnte jemand herausfinden welches Teil das ist? Oder die Wert ablesen das auf das Teil steht.