Arduino und RF Module 433 mit Wettersensor

Hi,

arbeite nun schon etwas länger mit dem Arduino und wollte auch mal einen Beitrag schreiben.

Da ich schon länger mit dem Gedanken spiele Wetterdaten aufzuzeichnen, und da ich noch einen TX 4 mit Temperatur und Luftfeutigkeitssensor rumliegen hatte machte ich mich ans werk.

Das Ergebnis sieht nun wie folgt aus:

#define radio 7

#define LANG 'L'
#define KURZ 'K'
#define FAIL 'X'

#define BLANG 1550
#define ELANG 2100
#define BKURZ 550
#define EKURZ 850

boolean run=true;
short count=0;
uint64_t biti=0;
unsigned short erg;


void setup(){
  Serial.begin(115200);
  pinMode(radio,INPUT);
}

unsigned short bitShift(uint64_t msg, int links, int rechts){
  uint64_t erg=msg << links;
  erg=erg>>rechts;
  return erg;
}

float temperatur(uint8_t ten, uint8_t one, uint8_t tens){
  return ((ten-5)*100+(one*10)+tens)/10;
}

short hygrometer(uint8_t ten, uint8_t one){
  return ((ten*10)+one);
}

void pdata(uint8_t data[12]){
  for(int i=0; i<12; i+=1){
    Serial.println(data[i]);
  }
}

void decoder(uint64_t message){
  uint8_t data[12]={
    0,0, 0,0, 0,0, 0,0, 0,0, 0  };

  data[0]=bitShift(message,2,60);   //Start                 Nibble 
  data[1]=bitShift(message,24,60);   //Protokoll             Nibble
  data[2]=bitShift(message,28,60);   //Temperatur|Hygrometer Nibble
  data[3]=bitShift(message,32,60);   //Adresse               Nibble
  data[4]=bitShift(message,36,60);   //Adresse + Pariti      Nibble
  data[5]=bitShift(message,40,60);   //Zehner                Nibble
  data[6]=bitShift(message,44,60);   //Einer                 Nibble
  data[7]=bitShift(message,48,60);   //Zehntel               Nibble
  data[8]=bitShift(message,52,60);   //Zehner                Nibble
  data[9]=bitShift(message,56,60);   //Einer                 Nibble
  data[10]=bitShift(message,60,60);  //Checksum transmit     Nibble
  data[11]=(data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+data[7]+data[8]+data[9]);//Checksum calculated   Nibble
  data[11]=data[11]<<4;
  data[11]=data[11]>>4;              //Cecksum half Byte

  //pdata(data);

  if((data[0]==0)&&(data[11]==data[10])){
    if((data[1]*16+data[2])==160){
      Serial.print("Temperatur: ");
      if((data[5]==data[8])&&(data[6]==data[9])){
        Serial.println( temperatur(data[5],data[6],data[7])); 
      }   
    }
    else if((data[1]*16+data[2])==174){
      Serial.print("Hygrometer: ");
      if((data[5]==data[8])&&(data[6]==data[9])){
        Serial.println( hygrometer(data[5],data[6])); 
      }   
    }  
  }
}





int parser(){
  count=0;
  run=true;
  while(run){
    int htime=pulseIn(radio, HIGH);
    char msg=decodeTime(htime);
    if(msg!=FAIL){
      if(count<4&&msg==LANG){   
        biti=biti<<1;
      }
      if(count==4&&msg==KURZ){   
        biti=biti<<1;   
        biti|=1;
      }
      if(count==5&&msg==LANG){   
        biti=biti<<1;
      }
      if(count==6&&msg==KURZ){   
        biti=biti<<1;   
        biti=biti|1;
      }
      if(count==7&&msg==LANG){   
        biti=biti<<1;
      }
      if((count>7)){
        if(msg==LANG){   
          biti=biti<<1;   
        }
        else{   
          biti=biti<<1;   
          biti=biti|1; 
        }
      }
      if(count==43){
        run=false;
        count=0;
        return 0;
      }
      count+=1;
      delayMicroseconds(50);
    }
  }
}


char decodeTime(int time){
  return ((time>BKURZ) && (time<EKURZ)) ? (KURZ) 
    : (((time>BLANG) && (time<ELANG)) ? (LANG) 
      : (FAIL));
}

void loop(){
  parser();
//  Serial.println();
//  Serial.println(startNibble(biti));
//  Serial.println(protokollNibble(biti));
//  Serial.println(modeNibble(biti));
//  Serial.println(addressNibble(biti));
//  Serial.println(tenNibble(biti));
//  Serial.println(oneNibble(biti)); 
//  Serial.println(tensNibble(biti)); 
//  Serial.println();
  decoder(biti);
  biti=0;
  delay(25);

}

Und was jetzt?

nix mehr wollte nur den code zur verfügung stellen evtl haben andere ja auch solche Sensoren rum liegen (TX 2 , TX 3 TX 4)

Was für ein Hersteller ist das?

sollte lacrose sein die sensoren sind aber schon alt hab leider keine aus der neuen Baureihe

hier wird der sensor erklärt:

http://www.qslnet.de/member/dg1xpz/elektronik/wx/tx4.html

Coole sache so einen habe ich auch noch aktiv . Veräst du noch welchen Empfänger du nutzt . Evtl noch ein kleines Bildchen. Dann versuche ich mich auch mal mit dem Code Gruß Der Dani

Hi, ja sehr cool. Ich habe eine WS2300 am laufen mit ner NSLU2. Gib mal bitte einpaa mehr details... Bilder vieleicht usw....

Bilder werden auf die schnelle etwas schwer bin wieder am studieren und nicht mehr zuhause.

verwendet hab ich ein billiges rf modul von ebay: http://www.ebay.de/itm/5sets-433Mhz-RF-Wireless-Transmitter-Receiver-Link-Kit-Module-for-Arduino-NEW-/170999455326?pt=Wissenschaftliche_Ger%C3%A4te&hash=item27d05c9e5e

Diese module sind nur dazu da um von einem Arduino zum anderen die Daten zu senden, ist es richtig? Oder gibt es da noch andere Einsatzgebiete, wie zB per Arduino eine LED schalten?

Hi,

Ne mit so einem Modul kann man schon etwas mehr machen, z.B. auch FunkSteckdosen schalten.

Funksteckdosen sind ja leicht zuschalten mit den modulen da gibts ja dic RClib

Man kann aber schlecht so eine Funksteckdose in die Wand verstecken um das Licht auf der Decke zu schalten. Die idee war, so ein Modul an ein Taster anzuklemmen, oder irgendwie so.

Einen Attiny85 dazu und dann kannst du auf einer kleinen Platine was bauen was in einer UP Dose verschwindet. Gruß Der Dani

Solche 433 Mhz Sender und Empfänger habe ich, blos ich weiß nicht wie ich es machen soll. Hatte mir so gedacht, um keine Kabels verlegen zu müssen: Den Arduino (UNO oder MEGA oder 1284P) in den Schaltschrank Diese 433 Mhz Empfänger unterm Putz verstecken Funk Taster kaufen, die an den Arduino ein Signal geben, um Lampe an oder an. ( Signal an den Arduino deswegen, um über Webinterface sehen zu können ob Licht an oder aus, natürlich auch darüber schalten) Der Arduino gibt an den 433 Mhz Empfänger Signal ob Lampe an oder aus

Und ab hier weiß ich nicht weiter. Der Empfänger soll dann eine 230V Lampe schalten. Ich habe zwar SainSmart 16/8-Channel 12V Relay aber die kann ich ja hier nicht einsetzen. Und die Empfänger bräuchten dann auch etwas Strom, wo das herkommen soll ist auch noch ne Frage...