Decode routine for weather station WT440H or WT450H

Dependencies:   mbed

This piece of software decode Weahter station temperature and humidity freeware, by Lotfi BAGHLI, March, 2013

I hacked the TX WT440H, got 2 wires out (GND and DATA), http://www.upm-marketing.com/products/wd633+wt440h.html

I still want to get the data from a RX one (WS738) or a simple 433 MHz RX but signal pbs not yet solved In fact, from the builtin RX of the Weather station, it is ok, but from the external RX, the range is very small : 20 cm :-(

thanks to Jaakko Ala-Paavola, http://ala-paavola.fi/jaakko/doku.php?id=wt450h

for the protocol and decode routine

Connect 2 wires to the MBED : GND and Data Signal to p18

Temperature and Humidity are displayed on the Serial via USB of the MBED /media/uploads/lotfi_baghli/protocol_wt440.png

Committer:
lotfi_baghli
Date:
Sat Mar 30 18:42:02 2013 +0000
Revision:
6:74430c7239b7
Parent:
5:71e7b4276a31
Weather_WT440H decode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lotfi_baghli 0:d9b6ce6032fc 1 #include "mbed.h"
lotfi_baghli 6:74430c7239b7 2 // This piece of software decode Weahter station temperature and humidity
lotfi_baghli 6:74430c7239b7 3 // freeware, by Lotfi BAGHLI, March, 2013
lotfi_baghli 6:74430c7239b7 4 // I hacked the TX WT440H, got 2 wires out (GND and DATA)
lotfi_baghli 6:74430c7239b7 5 // I still want to get the data from a RX one (WS738) or a simple 433 MHz RX but signal pbs not yet solved
lotfi_baghli 6:74430c7239b7 6 //
lotfi_baghli 6:74430c7239b7 7 // thanks to Jaakko Ala-Paavola, http://ala-paavola.fi/jaakko/doku.php?id=wt450h
lotfi_baghli 6:74430c7239b7 8 // for the protocol and decode routine
lotfi_baghli 6:74430c7239b7 9 //
lotfi_baghli 6:74430c7239b7 10 // Connect 2 wires to the MBED : GND and Data Signal to p18
lotfi_baghli 6:74430c7239b7 11 // Temperature and Humidity are displayed on the Serial via USB of the MBED
lotfi_baghli 2:5a073ef49b21 12
lotfi_baghli 2:5a073ef49b21 13 DigitalOut myled(LED1);
lotfi_baghli 0:d9b6ce6032fc 14 DigitalOut led2(LED2);
lotfi_baghli 3:cd558875d654 15 DigitalIn Rx433(p18);
lotfi_baghli 3:cd558875d654 16 InterruptIn Rx433NotifyChange(p18);
lotfi_baghli 2:5a073ef49b21 17 Serial pc(USBTX, USBRX);
lotfi_baghli 3:cd558875d654 18 Timer T3;
lotfi_baghli 3:cd558875d654 19
lotfi_baghli 3:cd558875d654 20 #define TIMEOUT 1000
lotfi_baghli 3:cd558875d654 21 #define BIT0_LENGTH 2000
lotfi_baghli 3:cd558875d654 22 #define BIT1_LENGTH 1000
lotfi_baghli 3:cd558875d654 23 #define VARIATION 500
lotfi_baghli 3:cd558875d654 24 #define DATA_LENGTH 5
lotfi_baghli 3:cd558875d654 25 #define SENSOR_COUNT 4
lotfi_baghli 3:cd558875d654 26 #define NETWORK_COUNT 2
lotfi_baghli 3:cd558875d654 27 #define MSGLENGTH 36
lotfi_baghli 3:cd558875d654 28
lotfi_baghli 3:cd558875d654 29 //#define DEBUG
lotfi_baghli 3:cd558875d654 30 struct sensor {
lotfi_baghli 3:cd558875d654 31 unsigned char humidity;
lotfi_baghli 3:cd558875d654 32 signed char temp_int;
lotfi_baghli 3:cd558875d654 33 unsigned char temp_dec;
lotfi_baghli 3:cd558875d654 34 signed char min_int;
lotfi_baghli 3:cd558875d654 35 unsigned char min_dec;
lotfi_baghli 3:cd558875d654 36 signed char max_int;
lotfi_baghli 3:cd558875d654 37 unsigned char max_dec;
lotfi_baghli 3:cd558875d654 38 time_t timestamp;
lotfi_baghli 3:cd558875d654 39 };
lotfi_baghli 3:cd558875d654 40 unsigned long T3saved_us;
lotfi_baghli 3:cd558875d654 41 unsigned char bitcount = 0;
lotfi_baghli 3:cd558875d654 42 unsigned char bytecount = 0;
lotfi_baghli 3:cd558875d654 43 unsigned char second_half = 0;
lotfi_baghli 3:cd558875d654 44 unsigned char data[DATA_LENGTH];
lotfi_baghli 3:cd558875d654 45 struct sensor measurement[NETWORK_COUNT][SENSOR_COUNT];
lotfi_baghli 3:cd558875d654 46 unsigned char minmaxday = 0;
lotfi_baghli 4:df5635a8e10a 47 // make var global
lotfi_baghli 4:df5635a8e10a 48 time_t t;
lotfi_baghli 4:df5635a8e10a 49 unsigned char net, id;
lotfi_baghli 4:df5635a8e10a 50 int t_int;
lotfi_baghli 4:df5635a8e10a 51 unsigned char rh, t_dec;
lotfi_baghli 3:cd558875d654 52
lotfi_baghli 5:71e7b4276a31 53 unsigned int i,j, oldj;
lotfi_baghli 3:cd558875d654 54
lotfi_baghli 3:cd558875d654 55 void NCInterrupt()
lotfi_baghli 3:cd558875d654 56 {
lotfi_baghli 3:cd558875d654 57 unsigned char i;
lotfi_baghli 3:cd558875d654 58 unsigned char bit;
lotfi_baghli 3:cd558875d654 59 unsigned long current = T3.read_us();
lotfi_baghli 3:cd558875d654 60 unsigned long diff = current-T3saved_us;
lotfi_baghli 3:cd558875d654 61 myled = ! myled;
lotfi_baghli 3:cd558875d654 62 j++;
lotfi_baghli 3:cd558875d654 63 T3saved_us=current;
lotfi_baghli 3:cd558875d654 64
lotfi_baghli 3:cd558875d654 65
lotfi_baghli 3:cd558875d654 66 if ( diff < BIT0_LENGTH + VARIATION && diff > BIT0_LENGTH - VARIATION ) {
lotfi_baghli 3:cd558875d654 67 bit = 0;
lotfi_baghli 3:cd558875d654 68 second_half = 0;
lotfi_baghli 3:cd558875d654 69 } else if ( diff < BIT1_LENGTH + VARIATION && diff > BIT1_LENGTH - VARIATION ) {
lotfi_baghli 3:cd558875d654 70 if (second_half) {
lotfi_baghli 3:cd558875d654 71 bit = 1;
lotfi_baghli 3:cd558875d654 72 second_half = 0;
lotfi_baghli 3:cd558875d654 73 } else {
lotfi_baghli 3:cd558875d654 74 second_half = 1;
lotfi_baghli 3:cd558875d654 75 return;
lotfi_baghli 3:cd558875d654 76 }
lotfi_baghli 3:cd558875d654 77 } else {
lotfi_baghli 3:cd558875d654 78 goto reset;
lotfi_baghli 3:cd558875d654 79 }
lotfi_baghli 3:cd558875d654 80
lotfi_baghli 3:cd558875d654 81 data[bitcount/8] = data[bitcount/8]<<1;
lotfi_baghli 3:cd558875d654 82 data[bitcount/8] |= bit;
lotfi_baghli 3:cd558875d654 83 bitcount++;
lotfi_baghli 2:5a073ef49b21 84
lotfi_baghli 3:cd558875d654 85 if ( bitcount == 4 ) {
lotfi_baghli 3:cd558875d654 86 if ( data[0] != 0x0c )
lotfi_baghli 3:cd558875d654 87 goto reset;
lotfi_baghli 3:cd558875d654 88 bitcount = 8;
lotfi_baghli 3:cd558875d654 89 #ifdef DEBUG
lotfi_baghli 3:cd558875d654 90 pc.print('#');
lotfi_baghli 3:cd558875d654 91 #endif
lotfi_baghli 3:cd558875d654 92 }
lotfi_baghli 3:cd558875d654 93
lotfi_baghli 3:cd558875d654 94 if ( bitcount >= MSGLENGTH ) {
lotfi_baghli 3:cd558875d654 95
lotfi_baghli 3:cd558875d654 96 #ifdef DEBUG
lotfi_baghli 3:cd558875d654 97 for (i=0; i<DATA_LENGTH; i++) {
lotfi_baghli 3:cd558875d654 98 pc.print(data[i], HEX);
lotfi_baghli 3:cd558875d654 99 pc.print(' ');
lotfi_baghli 3:cd558875d654 100 }
lotfi_baghli 3:cd558875d654 101 #endif
lotfi_baghli 4:df5635a8e10a 102 // pc.print("Data: NET:");
lotfi_baghli 4:df5635a8e10a 103 net = 0x07 & (data[1]>>4)-1;
lotfi_baghli 4:df5635a8e10a 104 // pc.print(net,DEC);
lotfi_baghli 4:df5635a8e10a 105 // pc.print(" ID:");
lotfi_baghli 4:df5635a8e10a 106 id = 0x03 & (data[1]>>2);
lotfi_baghli 4:df5635a8e10a 107 // pc.print(id, DEC);
lotfi_baghli 4:df5635a8e10a 108 // pc.print(" RH:");
lotfi_baghli 4:df5635a8e10a 109 rh = data[2];
lotfi_baghli 4:df5635a8e10a 110 // pc.print(rh, DEC);
lotfi_baghli 4:df5635a8e10a 111 // pc.print(" T:");
lotfi_baghli 4:df5635a8e10a 112 t_int = data[3]-50;
lotfi_baghli 4:df5635a8e10a 113 // pc.print(t_int, DEC);
lotfi_baghli 4:df5635a8e10a 114 t_dec = data[4]>>1;
lotfi_baghli 4:df5635a8e10a 115 // pc.print('.');
lotfi_baghli 4:df5635a8e10a 116 // pc.print(t_dec,DEC);
lotfi_baghli 4:df5635a8e10a 117
lotfi_baghli 4:df5635a8e10a 118 t = time(NULL);
lotfi_baghli 3:cd558875d654 119
lotfi_baghli 3:cd558875d654 120 /* Do not store all sensors */
lotfi_baghli 3:cd558875d654 121
lotfi_baghli 3:cd558875d654 122 if ( net <= NETWORK_COUNT ) {
lotfi_baghli 3:cd558875d654 123 measurement[net][id].temp_int = t_int;
lotfi_baghli 3:cd558875d654 124 measurement[net][id].temp_dec = t_dec;
lotfi_baghli 3:cd558875d654 125 measurement[net][id].humidity = rh;
lotfi_baghli 4:df5635a8e10a 126 /*
lotfi_baghli 4:df5635a8e10a 127 if ( !measurement[net][id].timestamp ||
lotfi_baghli 4:df5635a8e10a 128 day(t) != minmaxday ) {
lotfi_baghli 4:df5635a8e10a 129 minmaxday = day(t);
lotfi_baghli 4:df5635a8e10a 130 measurement[net][id].max_int = t_int;
lotfi_baghli 4:df5635a8e10a 131 measurement[net][id].max_dec = t_dec;
lotfi_baghli 4:df5635a8e10a 132 measurement[net][id].min_int = t_int;
lotfi_baghli 4:df5635a8e10a 133 measurement[net][id].min_dec = t_dec;
lotfi_baghli 4:df5635a8e10a 134 }
lotfi_baghli 3:cd558875d654 135
lotfi_baghli 4:df5635a8e10a 136 if ( t_int > measurement[net][id].max_int ||
lotfi_baghli 4:df5635a8e10a 137 ( t_int == measurement[net][id].max_int && t_dec > measurement[net][id].max_dec ) ) {
lotfi_baghli 4:df5635a8e10a 138 measurement[net][id].max_int = t_int;
lotfi_baghli 4:df5635a8e10a 139 measurement[net][id].max_dec = t_dec;
lotfi_baghli 4:df5635a8e10a 140 }
lotfi_baghli 3:cd558875d654 141
lotfi_baghli 4:df5635a8e10a 142 if ( t_int < measurement[net][id].min_int ||
lotfi_baghli 4:df5635a8e10a 143 ( t_int == measurement[net][id].min_int && t_dec < measurement[net][id].min_dec ) ) {
lotfi_baghli 4:df5635a8e10a 144 measurement[net][id].min_int = t_int;
lotfi_baghli 4:df5635a8e10a 145 measurement[net][id].min_dec = t_dec;
lotfi_baghli 4:df5635a8e10a 146 }
lotfi_baghli 4:df5635a8e10a 147 */
lotfi_baghli 3:cd558875d654 148
lotfi_baghli 3:cd558875d654 149 measurement[net][id].timestamp = t;
lotfi_baghli 3:cd558875d654 150 }
lotfi_baghli 3:cd558875d654 151
lotfi_baghli 3:cd558875d654 152 goto reset;
lotfi_baghli 3:cd558875d654 153 }
lotfi_baghli 3:cd558875d654 154 return;
lotfi_baghli 3:cd558875d654 155
lotfi_baghli 3:cd558875d654 156 reset:
lotfi_baghli 3:cd558875d654 157 for (i=0; i<DATA_LENGTH; i++)
lotfi_baghli 3:cd558875d654 158 data[i] = 0;
lotfi_baghli 3:cd558875d654 159
lotfi_baghli 3:cd558875d654 160 bytecount = 0;
lotfi_baghli 3:cd558875d654 161 bitcount = 0;
lotfi_baghli 3:cd558875d654 162 second_half = 0;
lotfi_baghli 3:cd558875d654 163 return;
lotfi_baghli 2:5a073ef49b21 164 }
lotfi_baghli 2:5a073ef49b21 165
lotfi_baghli 3:cd558875d654 166 int main()
lotfi_baghli 3:cd558875d654 167 {
lotfi_baghli 4:df5635a8e10a 168 j=0;
lotfi_baghli 3:cd558875d654 169 T3.start();
lotfi_baghli 2:5a073ef49b21 170 pc.baud(115200);
lotfi_baghli 3:cd558875d654 171 Rx433NotifyChange.mode(PullNone);
lotfi_baghli 3:cd558875d654 172 Rx433NotifyChange.rise(&NCInterrupt);
lotfi_baghli 3:cd558875d654 173 Rx433NotifyChange.fall(&NCInterrupt);
lotfi_baghli 0:d9b6ce6032fc 174 while(1) {
lotfi_baghli 2:5a073ef49b21 175 led2 = !led2;
lotfi_baghli 4:df5635a8e10a 176 wait(1);
lotfi_baghli 5:71e7b4276a31 177 if (oldj != j)
lotfi_baghli 5:71e7b4276a31 178 {
lotfi_baghli 6:74430c7239b7 179 pc.printf("j:%d, Data: NET:%d ID:%d RH:%d T:%d.%d TIME:%s\r", j, net, id, rh, t_int, t_dec, ctime(&t));
lotfi_baghli 5:71e7b4276a31 180 oldj=j;
lotfi_baghli 5:71e7b4276a31 181 }
lotfi_baghli 3:cd558875d654 182
lotfi_baghli 0:d9b6ce6032fc 183 }
lotfi_baghli 2:5a073ef49b21 184 }