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 11:19:31 2013 +0000
Revision:
3:cd558875d654
Parent:
2:5a073ef49b21
Child:
4:df5635a8e10a
WT450H Jaakko

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 3:cd558875d654 37
lotfi_baghli 3:cd558875d654 38 unsigned int i,j;
lotfi_baghli 3:cd558875d654 39
lotfi_baghli 3:cd558875d654 40 void NCInterrupt()
lotfi_baghli 3:cd558875d654 41 {
lotfi_baghli 3:cd558875d654 42 unsigned char i;
lotfi_baghli 3:cd558875d654 43 unsigned char bit;
lotfi_baghli 3:cd558875d654 44 unsigned long current = T3.read_us();
lotfi_baghli 3:cd558875d654 45 unsigned long diff = current-T3saved_us;
lotfi_baghli 3:cd558875d654 46 myled = ! myled;
lotfi_baghli 3:cd558875d654 47 j++;
lotfi_baghli 3:cd558875d654 48 T3saved_us=current;
lotfi_baghli 3:cd558875d654 49
lotfi_baghli 3:cd558875d654 50 time_t t;
lotfi_baghli 3:cd558875d654 51
lotfi_baghli 3:cd558875d654 52 if ( diff < BIT0_LENGTH + VARIATION && diff > BIT0_LENGTH - VARIATION ) {
lotfi_baghli 3:cd558875d654 53 bit = 0;
lotfi_baghli 3:cd558875d654 54 second_half = 0;
lotfi_baghli 3:cd558875d654 55 } else if ( diff < BIT1_LENGTH + VARIATION && diff > BIT1_LENGTH - VARIATION ) {
lotfi_baghli 3:cd558875d654 56 if (second_half) {
lotfi_baghli 3:cd558875d654 57 bit = 1;
lotfi_baghli 3:cd558875d654 58 second_half = 0;
lotfi_baghli 3:cd558875d654 59 } else {
lotfi_baghli 3:cd558875d654 60 second_half = 1;
lotfi_baghli 3:cd558875d654 61 return;
lotfi_baghli 3:cd558875d654 62 }
lotfi_baghli 3:cd558875d654 63 } else {
lotfi_baghli 3:cd558875d654 64 goto reset;
lotfi_baghli 3:cd558875d654 65 }
lotfi_baghli 3:cd558875d654 66
lotfi_baghli 3:cd558875d654 67 data[bitcount/8] = data[bitcount/8]<<1;
lotfi_baghli 3:cd558875d654 68 data[bitcount/8] |= bit;
lotfi_baghli 3:cd558875d654 69 bitcount++;
lotfi_baghli 2:5a073ef49b21 70
lotfi_baghli 3:cd558875d654 71 if ( bitcount == 4 ) {
lotfi_baghli 3:cd558875d654 72 if ( data[0] != 0x0c )
lotfi_baghli 3:cd558875d654 73 goto reset;
lotfi_baghli 3:cd558875d654 74 bitcount = 8;
lotfi_baghli 3:cd558875d654 75 #ifdef DEBUG
lotfi_baghli 3:cd558875d654 76 pc.print('#');
lotfi_baghli 3:cd558875d654 77 #endif
lotfi_baghli 3:cd558875d654 78 }
lotfi_baghli 3:cd558875d654 79
lotfi_baghli 3:cd558875d654 80 if ( bitcount >= MSGLENGTH ) {
lotfi_baghli 3:cd558875d654 81 unsigned char net, id;
lotfi_baghli 3:cd558875d654 82 int t_int;
lotfi_baghli 3:cd558875d654 83 unsigned char rh, t_dec;
lotfi_baghli 3:cd558875d654 84
lotfi_baghli 3:cd558875d654 85 #ifdef DEBUG
lotfi_baghli 3:cd558875d654 86 for (i=0; i<DATA_LENGTH; i++) {
lotfi_baghli 3:cd558875d654 87 pc.print(data[i], HEX);
lotfi_baghli 3:cd558875d654 88 pc.print(' ');
lotfi_baghli 3:cd558875d654 89 }
lotfi_baghli 3:cd558875d654 90 #endif
lotfi_baghli 3:cd558875d654 91
lotfi_baghli 3:cd558875d654 92 /* Do not store all sensors */
lotfi_baghli 3:cd558875d654 93
lotfi_baghli 3:cd558875d654 94 if ( net <= NETWORK_COUNT ) {
lotfi_baghli 3:cd558875d654 95 measurement[net][id].temp_int = t_int;
lotfi_baghli 3:cd558875d654 96 measurement[net][id].temp_dec = t_dec;
lotfi_baghli 3:cd558875d654 97 measurement[net][id].humidity = rh;
lotfi_baghli 3:cd558875d654 98
lotfi_baghli 3:cd558875d654 99 if ( !measurement[net][id].timestamp ||
lotfi_baghli 3:cd558875d654 100 day(t) != minmaxday ) {
lotfi_baghli 3:cd558875d654 101 minmaxday = day(t);
lotfi_baghli 3:cd558875d654 102 measurement[net][id].max_int = t_int;
lotfi_baghli 3:cd558875d654 103 measurement[net][id].max_dec = t_dec;
lotfi_baghli 3:cd558875d654 104 measurement[net][id].min_int = t_int;
lotfi_baghli 3:cd558875d654 105 measurement[net][id].min_dec = t_dec;
lotfi_baghli 3:cd558875d654 106 }
lotfi_baghli 3:cd558875d654 107
lotfi_baghli 3:cd558875d654 108 if ( t_int > measurement[net][id].max_int ||
lotfi_baghli 3:cd558875d654 109 ( t_int == measurement[net][id].max_int && t_dec > measurement[net][id].max_dec ) ) {
lotfi_baghli 3:cd558875d654 110 measurement[net][id].max_int = t_int;
lotfi_baghli 3:cd558875d654 111 measurement[net][id].max_dec = t_dec;
lotfi_baghli 3:cd558875d654 112 }
lotfi_baghli 3:cd558875d654 113
lotfi_baghli 3:cd558875d654 114 if ( t_int < measurement[net][id].min_int ||
lotfi_baghli 3:cd558875d654 115 ( t_int == measurement[net][id].min_int && t_dec < measurement[net][id].min_dec ) ) {
lotfi_baghli 3:cd558875d654 116 measurement[net][id].min_int = t_int;
lotfi_baghli 3:cd558875d654 117 measurement[net][id].min_dec = t_dec;
lotfi_baghli 3:cd558875d654 118 }
lotfi_baghli 3:cd558875d654 119
lotfi_baghli 3:cd558875d654 120
lotfi_baghli 3:cd558875d654 121 measurement[net][id].timestamp = t;
lotfi_baghli 3:cd558875d654 122 }
lotfi_baghli 3:cd558875d654 123
lotfi_baghli 3:cd558875d654 124 goto reset;
lotfi_baghli 3:cd558875d654 125 }
lotfi_baghli 3:cd558875d654 126 return;
lotfi_baghli 3:cd558875d654 127
lotfi_baghli 3:cd558875d654 128 reset:
lotfi_baghli 3:cd558875d654 129 for (i=0; i<DATA_LENGTH; i++)
lotfi_baghli 3:cd558875d654 130 data[i] = 0;
lotfi_baghli 3:cd558875d654 131
lotfi_baghli 3:cd558875d654 132 bytecount = 0;
lotfi_baghli 3:cd558875d654 133 bitcount = 0;
lotfi_baghli 3:cd558875d654 134 second_half = 0;
lotfi_baghli 3:cd558875d654 135 return;
lotfi_baghli 2:5a073ef49b21 136 }
lotfi_baghli 2:5a073ef49b21 137
lotfi_baghli 3:cd558875d654 138 int main()
lotfi_baghli 3:cd558875d654 139 {
lotfi_baghli 2:5a073ef49b21 140 i=0;
lotfi_baghli 3:cd558875d654 141 T3.start();
lotfi_baghli 2:5a073ef49b21 142 pc.baud(115200);
lotfi_baghli 3:cd558875d654 143 Rx433NotifyChange.mode(PullNone);
lotfi_baghli 3:cd558875d654 144 Rx433NotifyChange.rise(&NCInterrupt);
lotfi_baghli 3:cd558875d654 145 Rx433NotifyChange.fall(&NCInterrupt);
lotfi_baghli 0:d9b6ce6032fc 146 while(1) {
lotfi_baghli 2:5a073ef49b21 147 led2 = !led2;
lotfi_baghli 2:5a073ef49b21 148 wait(0.5);
lotfi_baghli 3:cd558875d654 149
lotfi_baghli 2:5a073ef49b21 150 // i=(Rx433==1);
lotfi_baghli 2:5a073ef49b21 151 // pc.printf("rx= %d ", i);
lotfi_baghli 2:5a073ef49b21 152 pc.printf("%d", i);
lotfi_baghli 2:5a073ef49b21 153 // i++;
lotfi_baghli 3:cd558875d654 154 /*
lotfi_baghli 3:cd558875d654 155 pc.print("Data: NET:");
lotfi_baghli 3:cd558875d654 156 net = 0x07 & (data[1]>>4)-1;
lotfi_baghli 3:cd558875d654 157 pc.print(net,DEC);
lotfi_baghli 3:cd558875d654 158 pc.print(" ID:");
lotfi_baghli 3:cd558875d654 159 id = 0x03 & (data[1]>>2);
lotfi_baghli 3:cd558875d654 160 pc.print(id, DEC);
lotfi_baghli 3:cd558875d654 161 pc.print(" RH:");
lotfi_baghli 3:cd558875d654 162 rh = data[2];
lotfi_baghli 3:cd558875d654 163 pc.print(rh, DEC);
lotfi_baghli 3:cd558875d654 164 pc.print(" T:");
lotfi_baghli 3:cd558875d654 165 t_int = data[3]-50;
lotfi_baghli 3:cd558875d654 166 pc.print(t_int, DEC);
lotfi_baghli 3:cd558875d654 167 t_dec = data[4]>>1;
lotfi_baghli 3:cd558875d654 168 pc.print('.');
lotfi_baghli 3:cd558875d654 169 pc.print(t_dec,DEC);
lotfi_baghli 3:cd558875d654 170
lotfi_baghli 3:cd558875d654 171
lotfi_baghli 3:cd558875d654 172 t = now();
lotfi_baghli 3:cd558875d654 173
lotfi_baghli 3:cd558875d654 174 pc.print(" DATE:");
lotfi_baghli 3:cd558875d654 175 serialPrintDate(t);
lotfi_baghli 3:cd558875d654 176
lotfi_baghli 3:cd558875d654 177 pc.print(" TIME:");
lotfi_baghli 3:cd558875d654 178 serialPrintTime(t);
lotfi_baghli 3:cd558875d654 179
lotfi_baghli 3:cd558875d654 180 pc.print("\r\n");
lotfi_baghli 3:cd558875d654 181 */
lotfi_baghli 0:d9b6ce6032fc 182 }
lotfi_baghli 2:5a073ef49b21 183 }