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);
}