433 MHz Funkthermometer decodieren

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:

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