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:22:39 2013 +0000
Revision:
5:71e7b4276a31
Parent:
4:df5635a8e10a
Child:
6:74430c7239b7
Weather TX hack ok !

Who changed what in which revision?

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