Pages: [1]   Go Down
Author Topic: Receptor de termómetro inalámbrico 433Mhz  (Read 1166 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 2
Posts: 73
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

He estado haciendo un programa para recibir la transmisión de un termómetro inalámbrico. Ya lo tengo funcionando pero como he visto que no hay mucha información al respecto, y que este tipo de termómetros parecen bastante comunes porque son muy baratos, les paso a continuación el programa final y un link a la descripción completa que he puesto en internet. Espero que les resulte útil:







http://alejandro-anv.blogspot.com.es/2012/12/hackeando-termometro-inalambrico.html



Code:
#include <PinChangeInt.h>
#include <ByteBuffer.h>


#define DATA 8
#define BUFLEN 20
#define MAXBITS 32


ByteBuffer buffer;

unsigned long paquete=0L;
byte bits_paquete=0;


//////////////////////////////////////////////////

void cambio() {
unsigned long m;
static unsigned long dur_low;
static unsigned long dur_high;
static bool recibiendo=0;
static unsigned long lmicros=0;
static unsigned long hmicros=0;

m=micros();
if (digitalRead(DATA)==HIGH){  //flanco de subida
    hmicros=m; 
 
    dur_low=m-lmicros;

    //si el ultimo pulso alto duro 1ms, es un separador de pulsos y hay que procesar este dato
    if (recibiendo){
       if (dur_low<1800L) return; //tiene que tener por lo menos 1,8ms
       if (dur_low>8000L) { //si es un pulso de 10ms, es un fin de paquete
           digitalWrite(13,HIGH);
           procesar_paquete();
           return;
           }
       digitalWrite(13,LOW);           
       agregar_pulso(dur_low>3000L);  //si el pulso es de 5ms, es un 1, si es de 2 ms es un 0
       }
   
   
    return;
    }   
//flanco de bajada

lmicros=m;
dur_high=m-hmicros;
//si es un pulso de 0,5ms estamos recibiendo datos
if (dur_high>400L && dur_high<900L) {
    recibiendo=1;

    }
else {
    bits_paquete=0;
    recibiendo=0;
    paquete=0L;
    }

}

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
void agregar_pulso(bool valor){
paquete=(paquete<<1) | valor;
bits_paquete++;

}


////////////////////////////////////////////////////////////////////////////
void procesar_paquete(){
buffer.put(bits_paquete);
buffer.putLong(paquete);
paquete=0L;
bits_paquete=0;

}


////////////////////////////////////////////////////////////////////////////
void setup() {
  buffer.init(20);
  buffer.clear();
 
  pinMode(DATA, INPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13,LOW);
  pinMode(12, OUTPUT);
  PCintPort::attachInterrupt(DATA, &cambio, CHANGE);
  Serial.begin(115200);
  Serial.println("---------------------------------------");
}

/////////////////////////////////////////////////////////////////////////////////////
void mostrar_dato(unsigned long p){
float temp;
bool bot;
byte canal=0;
byte a;
word b;
byte c;
Serial.print("datos:");
Serial.println(p,BIN);
/*
4 bits  ???? (va variando)

8 bits ? (fijo)

12 bits temperatura en celsius
2 bits canal
2 bits ?? (fijo)
*/


a=(p & 0b1110000000000000000000000000) >> 25;
b=(p & 0b0000111111110000000000000000) >> 16;
a=(p & 0b0000000000000000000000000011);

bot=(p & 0b0001000000000000000000000000 !=0);

temp=(0.0+((p & 0b0000000000001111111111110000) >> 4)) /10;
if (temp>204.8) temp-=409.6;

canal=(p & 0b0000000000000000000000001100) >> 2;

Serial.print("temp:");
Serial.println(temp);

Serial.print("boton:");
Serial.println(bot);

Serial.print("canal:");
Serial.println(canal);


Serial.print(a,BIN);
Serial.print(" ");
Serial.print(b,HEX);
Serial.print(" ");
Serial.println(c,BIN);


}



/////////////////////////////////////////////////////////////////////////////////////
unsigned long p;
unsigned long ant=0;
unsigned long rep=0;
unsigned long tiempo=0,m=0;
byte l;
byte estado=0;

void loop() {
 
if (buffer.getSize()>4){

   l=buffer.get(); 
   p=buffer.getLong();
   
   if (l==28){
       tiempo=millis()-m;
       m=millis();
       if (estado==0){ //esperando repeticiones
          if(ant==p) rep++;
          else rep=0;
         
          if (rep>4) {
             estado=1;

             mostrar_dato(p);
             }
          }
       else if(estado==1){ //al menos 4 repeticiones
          if(ant!=p || tiempo>1000) estado=0;//ya no se repite
          }
       ant=p;

       }  //l==28
   }//buffer con datos

}
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues un post muy curioso. Gracias por compartir y buen trabajo.
Logged

   

0
Offline Offline
Full Member
***
Karma: 2
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lo mismo digo, muy curioso. y mucho curro de análisis.
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 112
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

partiendo de lo que tu has hecho he conseguido leer un termómetro oregon. Este inicia la transimisión con un cero de 100 mseg, luego 12 pulsos de 1,6mseg (interpreto como ceros), lueogo un pulso de 6mseg y a partir de ahí envia pulsos de 1,6 y 3,2mse (ceros y unos), en total 40 pulsos. Para finalizar se pone a cero durante 230mSeg. En total 40 bits.
Lo que no consigo es interpretarlo. Quitando los 12 ceros iniciales lo que recibo es esto:
Temperaruta   // dato transmitido
17,9      1100000101000100000000100000  40      
18,3      1100000100000100000000100001  40      
18,4      1100000001000100000001000001  40      
18,7      1000000010000010000000101001  40      
18,8      1000000000010010000000011001  40      
19,6      1000000001010100000000001001  40      
21,8      1010000000100001000001000100  40      
22      1010000000001001000001000100  40      
22,1      1010000100010010000000001000  40      
23      1000001000010001000000101000  40      
23      1000001000010001000000101000  40      
23,2      1010000010100010000000010000  40      
23,3      1000000100010001000000010001  40      
23,3      1000000100010001000000010001  40      
23,6      1000000001010001000001000010  40      
23,8      1000000000010000100000101010  40      

¿alguna idea?
Logged

Pages: [1]   Go Up
Jump to: