WH5302 Weather Station and 433Mhz RX Shield

315MHz and 433MHz wireless connections are very commonly used by consumer electronics including weather stations, home automation remote controls, power consumption meters, car alarms, and also many DIY projects.
LinuxHAM
Posts: 3
Joined: Sun Oct 13, 2013 2:17 am

WH5302 Weather Station and 433Mhz RX Shield

Post by LinuxHAM » Sun Oct 13, 2013 3:01 am

I have recently purchased both a the RX shield and WH5302 weather station which seems to be made by Fine Offset Electronics, theses seem to be sold under many different brands like Ambient, La Crosse etc.

I have started to try hacking the code that has been done at http://www.practicalarduino.com/project ... n-receiver I have attached the code so people can see the minor edits have done to get it to comile without 'BYTE' errors

Code: Select all

/**
 * WeatherStationReceiver
 *
 * Receives and decodes a pulse-width and transition encoded RF
 * bitstream, received through a 433MHz receiver module into the PB0
 * Input Capture Pin (ICP).
 *
 * The transmitter is from the La Crosse WS-2355 Weather Station
 * package, the RF transmitter is the integrated thermo/hygro station,
 * (part number WS-2300-25S), and cable connections between the rain and
 * wind sensors are made to the WS-2300-25S unit as it is the central RF
 * transmitter. The cable connected rainfall sensor is part number
 * WS-2300-16. The cable connected wind speed and direction sensor is
 * part number TX20.
 *
 * Copyright 2009 Marc Alexander <marc.alexander@gmail.com>
 * Copyright 2009 Jonathan Oxer <jon@oxer.com.au>
 * http://www.practicalarduino.com/projects/weather-station-receiver
 */

/**
 * NOTE:
 * The rainfall count may be 11 bits, not 12 bits. Once I saw a 4000+
 * reading on it that was not generated by rainfall pulses, so a higher
 * bit there may mean something else? Still investigating.
 */

/**
 * TODO:
 * 1.   Add: WSR_RESET() call from a dead-time timeout. If no RF
 * activity is received within a few mS, reset the receiver state
 * machine. Currently unsquelched RF noise is resetting it anyway
 * given the receiver model used, but a quiet receiver timeout should be
 * there also. Make sure boundary condition of reset just as new bit /
 * period coming in is not a problem causing loss of packet start if
 * reset happens during first transition/bit in.
 */

/*--------------------------------------------------------------------------------------
  Includes
--------------------------------------------------------------------------------------*/
#include "WeatherStationReceiver.h"

/*--------------------------------------------------------------------------------------
  Variables
--------------------------------------------------------------------------------------*/
//----------
// Timer 1 Input capture period and captured event time detection
uint uiICP_CapturedTime;
uint uiICP_PreviousCapturedTime;
uint uiICP_CapturedPeriod;
uint uiICP_PreviousCapturedPeriod;
byte bICP_CapturedPeriodWasHigh;
byte bICP_PreviousCapturedPeriodWasHigh;
unsigned long ulICP_Timestamp_262_144mS;
//----------
byte bICP_WSR_State;                                 //Interpreter state machine
byte bICP_WSR_PacketData[WSR_PACKETARRAYSIZE][4+8];  //incoming RF packet data with 4 byte timestamp at start, already bit reversed to suit.
                                                     //main array size must be ^2, and there may be some other count dependencies in the interpreter.
byte bICP_WSR_PacketInputPointer;           //
byte bICP_WSR_PacketOutputPointer;          //
byte bICP_WSR_PacketInputBitPointer;        //
uint uiICP_WSR_ReceivedPacketCount;         //
//----------
// Saved timestamp at packet receive conversion
unsigned long ulWSR_LastTimestamp_262_144mS;
//----------
// Real world data, latest received and converted by Packet_Converter_WS2355()
byte bWSR_StationTransmitterID;         //
sint siWSR_CurrentTemperature;          //
byte bWSR_CurrentHumidity;              //
byte bWSR_CurrentWindDirection;         //
uint uiWSR_CurrentWindSpeed_m_per_sec;  //
uint uiWSR_RainfallCount;               //
unsigned long ulWSR_Rainfall_mm_x10;
//----------
const char strWindDirection[16][4] = 
{
  "N  ", "NNE", "NE ", "ENE",
  "E  ", "ESE", "SE ", "SSE",
  "S  ", "SSW", "SW ", "WSW",
  "W  ", "WNW", "NW ", "NNW"
};

// Comment out for a normal build
// Uncomment for a debug build
#define DEBUG

/**
 * Initial configuration
 */
void setup(void)
{
  Serial.begin( 9600 );   //using the serial port at 38400bps for debugging and logging
  Serial.println( "Weather Station Receiver has powered up" );

  Init_Ports();
  Init_RF_Interpreters();
  interrupts();   // Enable interrupts (NOTE: is this necessary? Should be enabled by default)
}

/**
 * Main program loop
 */
void loop(void)
{
  Packet_Converter_WS2355();
}

/**
 * Initialise port initial state and data direction registers
 */
void Init_Ports()
{
  DDRB = 0x2F;   // B00101111
}

/*--------------------------------------------------------------------------------------
   Packet_Converter_WS2355
   Inspect, validate and convert any fresh incoming packet data to the latest real world values
      bit      1         2         3         4         5   byte                 1
<-TS  1234567890123456789012345678901234567890123456789012 00112233 4455667788990
      /--||--\/--||--\/--||--\/--||--\/--||--\/--||--\/--| 
   1) 0000100101000010001001111000010100110011101011000001 00000043 0942278533AC1 st:34 ok: 23.3? (533 = 53.3deg, - 30.0deg offset)
                ssiiiiiiii                                                  ttt
   2) 0000100100010010001001111000010100001101101011111000 00000045 091227850DAF8 st:34 ok: 50% RH
                ssiiiiiiii                                                 hh
   3) 0000100100100010001001111000000010001100111101111000 00000046 092227808CF78 st:34 ok: 140 rainfall, 72.5 mm
                ssiiiiiiii        rrrrrrrrrrrr
   4) 0000100101110010001001111000000000001100111111111101 00000047 097227800CFFD st:34 ok: W   (12) wind, speed 0.0m/s 0.0km/h
                ssiiiiiiii
   5) 0000100101000010001001111000010100110011101011000001 00000049 0942278533AC1 st:34 ok: 23.3?
                ssiiiiiiii
   6) 0000100100010010001001111000010100001101101011111000 0000004A 091227850DAF8 st:34 ok: 50% RH
                ssiiiiiiii
   7) 0000100100100010001001111000000010001100111101111000 0000004B 092227808CF78 st:34 ok: 140 rainfall, 72.5 mm
                ssiiiiiiii
   8) 0000100101110010001001111000000000001100111111111101 0000004D 097227800CFFD st:34 ok: W   (12) wind, speed 0.0m/s 0.0km/h
                ssiiiiiiii                wwww        cccc

   cccc = sum of all previous nibbles, from the start of the packet (all 48 preceding bits, 12 nibbles)

   ss   = sensor/packet identifier

   wwww = wind direction
             0 = N   1 = NNE   2 = NE    3 = ENE
             4 = E   5 = ESE   6 = SE    7 = SSE
             8 = S   9 = SSW  10 = SW   11 = WSW 
            12 = W  13 = WNW  14 = NW   15 = NNW

   iiiiiiii = station ID byte. May not be using the top(left) bit of this byte, but is using bits 0-6 at least.
              Every time the WS-2300-25S transmitter batteries are changed, it generates a new semi-random
              station ID. The user is expected to power cycle the WS-2355 receiver which will then
              'lock on' to the next received station ID.

   rrrrrrrrrrrr = 12 (potential?) bits of rainfall count.
               Note that it is up to the data analyser and any time window formatting
               to treat this as a differential value only. It is expected that the value will
               overflow in long term use.

   For more data decoding and locations, see conversion code below

--------------------------------------------------------------------------------------*/
void Packet_Converter_WS2355(void)
{
  byte b;
  byte c;
  sint si;

  if( bICP_WSR_PacketInputPointer != bICP_WSR_PacketOutputPointer )
  {
    // A fresh packet is ready to check and convert
    #ifdef DEBUG
    if( (ulICP_Timestamp_262_144mS - ulWSR_LastTimestamp_262_144mS) > 8 )
    {
      // Blank separator line if there has been more than about 2 seconds since the last
      // packet to make it easier to see what belongs with what
      Serial.println();
    }
    #endif

    #ifdef DEBUG
    //print it in binary text out the serial port
    Serial.print("BINARY=");
    for( b = WSR_TIMESTAMP_BIT_OFFSET ; b < (WSR_RFPACKETBITSIZE+WSR_TIMESTAMP_BIT_OFFSET) ; b++ )
    {
      if( (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][b >> 3] & (0x80 >> (b&0x07))) != 0 )
      {
        //Serial.print( '1', BYTE );
        Serial.print( '1' );
      } else {
        //Serial.print( '0', BYTE );
        Serial.print( '0' );
      }
      if( b == 31 )
        //Serial.print( ' ', BYTE );   //timestamp seperator
        Serial.print( ' ' );
    }
    Serial.println();

    //print it in hex text out the serial port
    //Serial.print( ' ', BYTE );
    Serial.print("HEX=");
    for( b = 0 ; b < ((WSR_RFPACKETBITSIZE+WSR_TIMESTAMP_BIT_OFFSET)/4) ; b += 2 )
    {
      // One nibble at a time
      c = bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][b >> 1];
      // Top nibble
      Serial.print( (c & 0xF0) >> 4, HEX );
      // Bottom nibble, drop the last one since it's not part of the 52 incoming bits
      if( b < (((WSR_RFPACKETBITSIZE+WSR_TIMESTAMP_BIT_OFFSET)/4)-1) )
      Serial.print( (c & 0x0F), HEX );
      // Timestamp seperator
      if( b == 6 )
        //Serial.print( ' ', BYTE );
        Serial.print( ' ' );
    }
    Serial.println();
    #endif

    //----------------------------------------------------------------------------
    if( PacketAndChecksum_OK_WS2355 )
    {
      // Extract the station ID
      b  = (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][5] << 4);
      b += (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][6] >> 4);
      bWSR_StationTransmitterID = b;
      // Print to serial port
      Serial.print( "STATIONID=" );
      Serial.println( bWSR_StationTransmitterID, DEC );

      // Bits 4 and 5 of this byte are the sensor/packet ID
      b = bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][5];
      b = (b >> 4) & 0x03;
      switch( b )
      {
        case 0:
        {
          // 0: temperature
          // Sensor/packet ID bits are 0x00, temperature is present in this packet
          // Lower nibble of byte 7 is first temperature digit, take care of 3xx offset
          si  = ((bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][7] & 0x0F) * 100);
          si += ((bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][8] >> 4) * 10);
          si +=  (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][8] & 0x0F);
          siWSR_CurrentTemperature = (si - 300);

          // Print to serial port with decimal place management
          Serial.print("TEMPERATURE=");
          Serial.print( (siWSR_CurrentTemperature/10), DEC );
          //Serial.print( '.', BYTE );
          Serial.print( ' ' );
          if( siWSR_CurrentTemperature < 0 ) {
            Serial.println( ((0-siWSR_CurrentTemperature)%10), DEC );
          } else {
            Serial.println( (siWSR_CurrentTemperature%10), DEC );
          }
          break;
        }
        case 1:
        {
          // 1: humidity
          //sensor/packet ID bits are 0x01, humidity is present in this packet
          c  = ((bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][7] & 0x0F) * 10);
          c +=  (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][8] >> 4);
          bWSR_CurrentHumidity = c;

          // Print to serial port with decimal place management
          Serial.print("HUMIDITY=");
          Serial.println( bWSR_CurrentHumidity, DEC );
          break;
        }
        case 2:
        {
          // 2: rainfall
          si  = (sint)(bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][7] & 0x0F) << 8;
          si +=        bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][8];
          uiWSR_RainfallCount = (uint)si;

          // Killer (for the Arduino) long multiply here, put in for now to demo real mm of rainfall maths
          ulWSR_Rainfall_mm_x10 = (((unsigned long)uiWSR_RainfallCount * 518) / 100);

          // Print to serial port 
          Serial.print("RAINFALL=");
          Serial.print( (ulWSR_Rainfall_mm_x10/10), DEC );
          //Serial.print( '.', BYTE );
          Serial.print( ' ' );
          Serial.println( (ulWSR_Rainfall_mm_x10%10), DEC );
          break;
        }
        case 3:
        {
          // 3: wind direction and speed
          // Sensor/packet ID bits are 0x03, wind data is present in this packet
          // Wind direction
          bWSR_CurrentWindDirection = (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][8] & 0x0F);

          //wind speed, decimal value is metres per second * 10 (1 fixed deciml place)
          si  = (sint)(bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][7] & 0x10) << 4;
          si +=      ((bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][7] & 0x0F) << 4);
          si +=       (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][8] >> 4);
          uiWSR_CurrentWindSpeed_m_per_sec = (uint)si;

          // Print to serial port with decimal place management
          Serial.print("WINDDIRECTION=");
          Serial.println( strWindDirection[bWSR_CurrentWindDirection] );

          Serial.print("WINDSPEED=");
          Serial.print( (uiWSR_CurrentWindSpeed_m_per_sec/10), DEC );
          //Serial.print( '.', BYTE );
          Serial.print( ' ' );
          Serial.println( (uiWSR_CurrentWindSpeed_m_per_sec%10), DEC );
          break;
        }
        default:
        {
          break;
        }
      }
    } else {
      Serial.print( " bad checksum or packet header" );
    }

    //----------------------------------------------------------------------------
    //save the last timestamp value, currently used for extra CR/LF in serial print
    ulWSR_LastTimestamp_262_144mS = ulICP_Timestamp_262_144mS;
    //----------------------------------------------------------------------------
    //conversion process done on this packet, move the output pointer along
    bICP_WSR_PacketOutputPointer = ((bICP_WSR_PacketOutputPointer+1)&(WSR_PACKETARRAYSIZE-1));
  }
}


/**
 * PacketAndChecksum_OK_WS2355
 * Return true if packet checksum and inspection is ok
 */
byte PacketAndChecksum_OK_WS2355(void)
{
  byte dataPos;
  byte checksum;

  // First check, last 4 bits of packet are sum of the previous 48 bits (12 nibbles)
  // Don't forget to offset past the timestamp in the first 4 bytes
  checksum = 0;
  for( dataPos = 4; dataPos < 10; dataPos++ )
  {
    // Checked a byte at a time, accumulate into checksum
    checksum += (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][dataPos] >> 4);
    checksum += (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][dataPos] & 0x0F);
  }
  checksum &= 0x0F;
  if( checksum != (bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][10] >> 4) )
  {
    return( false );   // Checksum does not match
  }

  // Second check, first byte of packet must be 0x09 ( B00001001 ), appears to be
  // the main identifier for this station
  if( bICP_WSR_PacketData[bICP_WSR_PacketOutputPointer][4] != 0x09 )
  {
    return( false );
  }

  return( true );
}


/**
 * Init_RF_Interpreters
 */
void Init_RF_Interpreters(void)
{
  //Call macros that reset any RF_Interpreter_... state machine and housekeeping values
  WSR_RESET();

  //RF decode ports setup
  //Marc making PB0 (ICP1 Input Capture) a floating input for RX ASK bitstream receiving
  //PB0 was used by the Color LCD/Joystick Shield for the backlight_on signal,
  //R2 has now been removed on the lcd pcb, and Q1 C-E shorted to keep the BL always on
  DDRB  &= ~(1<<DDB0);    //PBO(ICP1) input
  PORTB &= ~(1<<PORTB0);  //ensure pullup resistor is also disabled

  //PORTD6 and PORTD7, GREEN and RED test LED setup
  DDRD  |=  B11000000;      //(1<<PORTD6);   //DDRD  |=  (1<<PORTD7); (example of B prefix)
  GREEN_TESTLED_OFF();      //GREEN test led off
  RED_TESTLED_ON();         //RED test led on
  //PORTD |=  _BV(PORTD6);    //GREEN test led off  (example of _BV macro)
  //PORTD &= ~_BV(PORTD7);    //RED test led on     (example of _BV macro)
  //PORTD |=  (1<<PORTD6);    //GREEN test led off  (example of AVR studio style)
  //PORTD &= ~(1<<PORTD7);    //RED test led on     (example of AVR studio style)

  //---------------------------------------------------------------------------------------------
  //ICNC1: Input Capture Noise Canceler         On, 4 successive equal ICP1 samples required for trigger (4*4uS = 16uS delayed)
  //ICES1: Input Capture Edge Select            1 = rising edge to begin with, input capture will change as required
  //CS12,CS11,CS10   TCNT1 Prescaler set to 0,1,1 see table and notes above
  TCCR1A = B00000000;   //Normal mode of operation, TOP = 0xFFFF, TOV1 Flag Set on MAX
                        //This is supposed to come out of reset as 0x00, but something changed it, I had to zero it again here to make the TOP truly 0xFFFF
  TCCR1B = ( _BV(ICNC1) | _BV(CS11) | _BV(CS10) );
  SET_INPUT_CAPTURE_RISING_EDGE();
  //Timer1 Input Capture Interrupt Enable, Overflow Interrupt Enable  
  TIMSK1 = ( _BV(ICIE1) | _BV(TOIE1) );
}

/*--------------------------------------------------------------------------------------
  TIMER1_OVF_vect
  Timer1 overflow interrupt routine
  262.144 mS TOF period
  If used to feed a 32 bit timestamp counter, (0xFFFFFFFF = 4294967295 count before overlow)
  = 1125899906 seconds = 18764998 minutes = 312749 = 13031 days = 35 years.
--------------------------------------------------------------------------------------*/
ISR( TIMER1_OVF_vect )
{
  //increment the 32 bit timestamp counter (see overflow notes above)
  //overflow is allowed as this timestamp is most likely to be used as a delta from the previous timestamp,
  //so if it's used externally in the same 32 bit unsigned type it will come out ok.
  ulICP_Timestamp_262_144mS++;
}

/*--------------------------------------------------------------------------------------
  TIMER1_CAPT_vect
  Timer1 input capture interrupt routine
--------------------------------------------------------------------------------------*/
ISR( TIMER1_CAPT_vect )
{
  // Immediately grab the current capture time in case it triggers again and
  // overwrites ICR1 with an unexpected new value
  uiICP_CapturedTime = ICR1;

  // GREEN test led on (flicker for debug)
  GREEN_TESTLED_ON();

  //----------------------------------------------------------------------------
  //immediately grab the current capture polarity and reverse it to catch all the subsequent high and low periods coming in
  //If the initial period filter passes below, this will be inspected to become bICP_EventPolarity
  if( INPUT_CAPTURE_IS_RISING_EDGE() )
  {
    SET_INPUT_CAPTURE_FALLING_EDGE();      //previous period was low and just transitioned high
    bICP_CapturedPeriodWasHigh = false;    //uiICP_CapturedPeriod about to be stored will be a low period      
  } else {
    SET_INPUT_CAPTURE_RISING_EDGE();       //previous period was high and transitioned low
    bICP_CapturedPeriodWasHigh = true;     //uiICP_CapturedPeriod about to be stored will be a high period      
  }

  //----------------------------------------------------------------------------
  //calculate the current period just measured, to accompany the polarity now stored
  uiICP_CapturedPeriod = (uiICP_CapturedTime - uiICP_PreviousCapturedTime);

  //----------------------------------------------------------------------------
  // RF Pulse filtering, width test and polarity are analysed now, call the
  // interpreter(s) to analyse them
  RF_Interpreter_WS2355( /*uiICP_CapturedPeriod, bICP_CapturedPeriodWasHigh*/);   //arguments removed and made global


  //----------------------------------------------------------------------------
  //save the current capture data as previous so it can be used for period calculation again next time around
  uiICP_PreviousCapturedTime           = uiICP_CapturedTime;
  uiICP_PreviousCapturedPeriod         = uiICP_CapturedPeriod;
  bICP_PreviousCapturedPeriodWasHigh   = bICP_CapturedPeriodWasHigh;

  //GREEN test led off (flicker for debug)
  GREEN_TESTLED_OFF();
}

/*--------------------------------------------------------------------------------------
  RF_Interpreter_WS2355

  The WS2355 sends 52 bits in a packet and the format is
  A  long high followed by a long low is 0
  A short high followed by a long low is 1

  Not much more is done in this input capture interrupt routine apart from the
  00001 leader check and then loading of the full 52 bit packet.

  bICP_WSR_PacketInputPointer will be moved along when received, the main loop
  called Packet_Converter_WS2355() routine will do the rest of the work
  to check and convert each packet's data content.
--------------------------------------------------------------------------------------*/
void RF_Interpreter_WS2355( /*uiICP_CapturedPeriod, bICP_CapturedPeriodWasHigh*/ )
{
  volatile byte b;
  byte bValidBit = false;   // 0=false(WSR_BIT_NONE), 1=WSR_BIT_ZERO, 2=WSR_BIT_ONE

  //#warning A quiet-time timeout must be added to this interepreter, to reset the state machine any time there is a long quiet break in rx

  //discard the captured period if it is out of the expected range, it is noise...
  if( (uiICP_CapturedPeriod >= WSR_PERIOD_FILTER_MIN) && (uiICP_CapturedPeriod <= WSR_PERIOD_FILTER_MAX) )
  {
    //----------------------------------------------------------------------------
    //PERIOD INITIAL DURATION FILTER OK, CONTINUE
    //----------------------------------------------------------------------------
    //Check if this is a valid zero(long high) or one(short high) bit, or low period in between
    if( bICP_CapturedPeriodWasHigh )
    {
      //got a high period, could be a valid bit
      if( (uiICP_CapturedPeriod >= WSR_SHORT_PERIOD_MIN) && (uiICP_CapturedPeriod <= WSR_SHORT_PERIOD_MAX) )
      {
        //short high, valid one bit
        bValidBit = WSR_BIT_ONE;
      } else if( (uiICP_CapturedPeriod >= WSR_LONG_PERIOD_MIN) && (uiICP_CapturedPeriod <= WSR_LONG_PERIOD_MAX) ) {
        //long high, valid zero bit
        bValidBit = WSR_BIT_ZERO;
      } else {
        //invalid high period, in the dead zone between short and long bit period lengths
        WSR_RESET();
      }
    }
    //else
    //{
    //   //got a low period, ignored
    //}
    //----------------------------------------------------------------------------
    //Enter the state machine to load and prepare the incoming packet to bICP_WSR_PacketData[8][4+8]
    if( bValidBit != false )
    {
      switch( bICP_WSR_State )
      {
        case WSR_STATE_IDLE:
        {
          if( bValidBit == WSR_BIT_ZERO )
          {
            //first bit of valid packet is zero (4 zero's, maybe 3)
            //zero out the appropriate bit on the current input packet
            bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][bICP_WSR_PacketInputBitPointer >> 3]
               &= ~(0x01 << (bICP_WSR_PacketInputBitPointer&0x07));
            bICP_WSR_PacketInputBitPointer++;
            bICP_WSR_State = WSR_STATE_LOADING_BITSTREAM;
          } else {
            WSR_RESET();
          }
          break;
        }
        case WSR_STATE_LOADING_BITSTREAM:
        {
          // Potentially valid packet bitstream is on its way in, keep loading it up
          if( bValidBit == WSR_BIT_ZERO )
          {
            bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][bICP_WSR_PacketInputBitPointer >> 3]
               &= ~(0x80 >> (bICP_WSR_PacketInputBitPointer&0x07));
          } else {
            bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][bICP_WSR_PacketInputBitPointer >> 3]
               |=  (0x80 >> (bICP_WSR_PacketInputBitPointer&0x07));
          }

          // Check at appropriate location of the incoming bitstream, if it is valid and throw away if not
          if( bICP_WSR_PacketInputBitPointer == (WSR_TIMESTAMP_BIT_OFFSET + 4) )
          {
            //                               01234    01234
            // Acceptable start to packet is 00001 or 00010 (lost the first 0), could optimise
            // this but will leave with b for now for stability and debugging
            b = bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][4/*bICP_WSR_PacketInputBitPointer >> 3*/];
            b &= B11111000;
            if( b == B00010000 )
            {
              //valid packet 00010 start (with lost first zero), realign and continue
              bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][4/*bICP_WSR_PacketInputBitPointer >> 3*/] = B00001000;
              bICP_WSR_PacketInputBitPointer++;      //move up one past the inserted missing bit
            } else if( b != B00001000 ) {
              //invalid packet start, not 00001, reset
              WSR_RESET();
            }
          }

          // Final check, has the last packet bit (52 bits total) come in? If so, mark this packet
          // as done and move the major packet input pointer along
          if( bICP_WSR_PacketInputBitPointer == (WSR_TIMESTAMP_BIT_OFFSET + (WSR_RFPACKETBITSIZE-1)) )
          {
            // Got full packet, timestamp it for the main loop
            bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][0] = byte(ulICP_Timestamp_262_144mS >> 24);
            bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][1] = byte(ulICP_Timestamp_262_144mS >> 16);
            bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][2] = byte(ulICP_Timestamp_262_144mS >>  8);
            bICP_WSR_PacketData[bICP_WSR_PacketInputPointer][3] = byte(ulICP_Timestamp_262_144mS);
            // Pointer and packet count
            bICP_WSR_PacketInputPointer = ((bICP_WSR_PacketInputPointer+1)&(WSR_PACKETARRAYSIZE-1));//only the lower three bits are used for the 8 entry array
            uiICP_WSR_ReceivedPacketCount++;                                                        //note will overflow and wrap, used for display of progress only
            WSR_RESET();
          }

          // Increment pointer to next new bit location
          bICP_WSR_PacketInputBitPointer++;
          break;
        }
      }
    }
    //----------------------------------------------------------------------------
  } else {
    //----------------------------------------------------------------------------
    // PERIOD OUT OF BOUNDS, DISCARD
    // This will throw away any out of range periods and reset the state machine, high or low.
    //----------------------------------------------------------------------------
    WSR_RESET();
  }
}
Here is the output of what I am getting with the current above code.

Code: Select all

Weather Station Receiver has powered up

BINARY=0000110001000010010001011000000000000010110000101011
HEX=000001F7 0C42458002C2B
STATIONID=36
TEMPERATURE=-29 8

BINARY=0000100010110000111010000000000001011000010001111011
HEX=000002AE 08B0E8005847B
STATIONID=14
WINDDIRECTION=S  
WINDSPEED=0 5
BINARY=0000100010110000111010000000000001011000010001111011
HEX=000002AF 08B0E8005847B
STATIONID=14
WINDDIRECTION=S  
WINDSPEED=0 5

BINARY=0000100101111000011000001011000000000000010110000101
HEX=00000365 097860B000585
STATIONID=134
WINDDIRECTION=N  
WINDSPEED=25 6

BINARY=0000100001001000011110000000000001011000000001010001
HEX=00000867 0848780058051
STATIONID=135
TEMPERATURE=-24 2
BINARY=0000100001001000011110000000000001011000000001010001
HEX=00000868 0848780058051
STATIONID=135
TEMPERATURE=-24 2

BINARY=0000100000011000010000000000000001011000011100110111
HEX=0000091E 0818400058737
STATIONID=132
HUMIDITY=5

BINARY=0000100001000000100000000000000001011000010100011010
HEX=000009D5 084080005851A
STATIONID=8
TEMPERATURE=-24 2
BINARY=0000100001000000100000000000000001011000010100011010
HEX=000009D6 084080005851A
STATIONID=8
TEMPERATURE=-24 2

BINARY=0000100110010000100100001011100000000000010110000100
HEX=00000A8C 099090B800584
STATIONID=9
HUMIDITY=80

BINARY=0000100000100100010110000000000000101100001010001000
HEX=00000B43 082458002C288
STATIONID=69
RAINFALL=22 7
BINARY=0000100000100100010110000000000000101100001010001000
HEX=00000B44 082458002C288
STATIONID=69
RAINFALL=22 7

BINARY=0000110011000011100001101000000000000010110000100001
HEX=00000D68 0CC3868002C21
STATIONID=56
TEMPERATURE=-29 8

BINARY=0000100110011000011000001100000000000000010110000100
HEX=00000E1F 099860C000584
STATIONID=134
HUMIDITY=0
BINARY=0000100110011000011000001100000000000000010110000100
HEX=00000E20 099860C000584
STATIONID=134
HUMIDITY=0

BINARY=0000100110011000100110001011100000000000010110000100
HEX=00000ED6 099898B800584
STATIONID=137
HUMIDITY=80

BINARY=0000100110100000100000001110000000000000010110000011
HEX=000011B3 09A080E000583
STATIONID=8
RAINFALL=0 0

BINARY=0000101110001101010000111000010110000000000000101100
HEX=0000126A 0B8D43858002C
STATIONID=212
TEMPERATURE=28 0
BINARY=0000101110001101010000111000010110000000000000101100
HEX=0000126B 0B8D43858002C
STATIONID=212
TEMPERATURE=28 0

BINARY=0000100011010000000111000101000000000000001011000010
HEX=0000148F 08D01C50002C2
STATIONID=1
HUMIDITY=0

BINARY=0000100110101000100000001100100000000000010110000100
HEX=000018DA 09A880C800584
STATIONID=136
RAINFALL=1060 8

BINARY=0000100110110000100010001011100000000000010110000011
HEX=00001991 09B088B800583
STATIONID=8
WINDDIRECTION=N  
WINDSPEED=38 4
BINARY=0000100110110000100010001011100000000000010110000011
HEX=00001992 09B088B800583
STATIONID=8
WINDDIRECTION=N  
WINDSPEED=38 4

BINARY=0000100110110000101000010011000000000000010110000101
HEX=00001A48 09B0A13000585
STATIONID=10
WINDDIRECTION=N  
WINDSPEED=25 6

BINARY=0000101101001101110001011000100010000000000000101100
HEX=00001B00 0B4DC5888002C
STATIONID=220
TEMPERATURE=58 0

BINARY=0000101100001101110000111100011100000000000000101100
HEX=00001BB6 0B0DC3C70002C
STATIONID=220
TEMPERATURE=40 0

BINARY=0000100110110000011110001001000000000000010110000101
HEX=00001D25 09B0789000585
STATIONID=7
WINDDIRECTION=N  
WINDSPEED=25 6

BINARY=0000100000101000010000000000000000101100001010011100
HEX=00001F4B 082840002C29C
STATIONID=132
RAINFALL=22 7

BINARY=0000100010000000110100000000000001011000000000111110
HEX=00002001 0880D0005803E
STATIONID=13
TEMPERATURE=-24 2

BINARY=0000100010000000101110000000000001011000010000100110
HEX=000022DE 0880B80058426
STATIONID=11
TEMPERATURE=-24 2

BINARY=0000100001001000011001000000000000101100001000001111
HEX=0000244C 084864002C20F
STATIONID=134
TEMPERATURE=-26 8

BINARY=0000100000110000010011000000000000101100000110000110
HEX=00002503 08304C002C186
STATIONID=4
WINDDIRECTION=W  
WINDSPEED=0 2
BINARY=0000100000110000010011000000000000101100000110000110
HEX=00002504 08304C002C186
STATIONID=4
WINDDIRECTION=W  
WINDSPEED=0 2

BINARY=0000100010011000111110000000000001011000010101001111
HEX=00002671 0898F8005854F
STATIONID=143
HUMIDITY=5
BINARY=0000100010011000111110000000000001011000010101001111
HEX=00002672 0898F8005854F
STATIONID=143
HUMIDITY=5

BINARY=0000100000101000010000000000000000101100001000000011
HEX=00002728 082840002C203
STATIONID=132
RAINFALL=22 7

BINARY=0000100001000000011001000000000000101100001000010010
HEX=0000294D 084064002C212
STATIONID=6
TEMPERATURE=-26 8
BINARY=0000100001000000011001000000000000101100001000010010
HEX=0000294F 084064002C212
STATIONID=6
TEMPERATURE=-26 8

BINARY=0000100000111100011001000000000000101100001010001110
HEX=00002B73 083C64002C28E
STATIONID=198
WINDDIRECTION=W  
WINDSPEED=0 2

BINARY=0000100001010000100100000000000001011000010100100110
HEX=00002C2A 0850900058526
STATIONID=9
HUMIDITY=5
BINARY=0000100001010000100100000000000001011000010100100110
HEX=00002C2B 0850900058526
STATIONID=9
HUMIDITY=5

BINARY=0000100000101000011010000000000001011000010101000000
HEX=00002CE1 0828680058540
STATIONID=134
RAINFALL=45 5

BINARY=0000101111000010100001011100000000000010110000101001
HEX=00002E4F 0BC285C002C29
STATIONID=40
TEMPERATURE=-29 8

BINARY=0000101110000100110001110000000000000010110000101011
HEX=00002FBD 0B84C70002C2B
STATIONID=76
TEMPERATURE=-29 8

BINARY=0000100011001000110001000100010001100000000000000010
HEX=0000312C 08C8C44460002
STATIONID=140
TEMPERATURE=16 0

BINARY=0000100011010100110010000001110000101000000000000010
HEX=000031E3 08D4C81C28002
STATIONID=76
HUMIDITY=122
BINARY=0000100000011100001010000000000000101100001010101010
HEX=000031E4 081C28002C2AA
STATIONID=194
HUMIDITY=2

BINARY=0000100110010000010010001000000000000000010110000100
HEX=000034BF 0990488000584
STATIONID=4
HUMIDITY=0

BINARY=0000110010000010000001001100000000000010110000101001
HEX=00003576 0C8204C002C29
STATIONID=32
TEMPERATURE=-29 8

BINARY=0000100001000100010111000000000000101100001010001110
HEX=000036E4 08445C002C28E
STATIONID=69
TEMPERATURE=-26 8

BINARY=0000100001101000100100000000000001011000010001001110
HEX=0000379C 086890005844E
STATIONID=137
RAINFALL=45 5
BINARY=0000100001101000100100000000000001011000010001001110
HEX=0000379D 086890005844E
STATIONID=137
RAINFALL=45 5

BINARY=0000100001110000100110000000000001011000010101101110
HEX=00003853 087098005856E
STATIONID=9
WINDDIRECTION=S  
WINDSPEED=0 5

BINARY=0000100011010100110011000011010001000100000000000010
HEX=000039C1 08D4CC3444002
STATIONID=76
HUMIDITY=44

BINARY=0000100011101000110100000001100001000100000000000010
HEX=00003C9D 08E8D01844002
STATIONID=141
RAINFALL=1096 0
Problem is I am getting heaps of different 'Station IDs' which none of this seems to related or even close to what on the reciever that comes with it.

Now coding is not really my thing, so any help where to get started to getting this to get data from my station would be much appreciated

Dale

angusgr
Freetronics Staff
Freetronics Staff
Posts: 853
Joined: Tue Apr 09, 2013 11:19 pm
Location: Melbourne, Australia
Contact:

Re: WH5302 Weather Station and 433Mhz RX Shield

Post by angusgr » Wed Oct 16, 2013 10:00 pm

Hi LinuxHAM,

I'm guessing from the data that you're getting out that the station may be a similar model, but with a different protocol. These things can vary a lot between models. :( Have you had any more success?

Perhaps you can find someone locally (in a hackerspace or ham radio group) who would be interested in attacking the problem with you, decoding the signals so you can both set up weather stations?

- Angus

LinuxHAM
Posts: 3
Joined: Sun Oct 13, 2013 2:17 am

Re: WH5302 Weather Station and 433Mhz RX Shield

Post by LinuxHAM » Thu Oct 17, 2013 7:33 am

angusgr wrote:Hi LinuxHAM,

I'm guessing from the data that you're getting out that the station may be a similar model, but with a different protocol. These things can vary a lot between models. :( Have you had any more success?

Perhaps you can find someone locally (in a hackerspace or ham radio group) who would be interested in attacking the problem with you, decoding the signals so you can both set up weather stations?

- Angus
Hi Angus,

Thanks for the tips

No I have not been able to make any further progress, I think my 11 is borked as I can't do a 'Serial Monitor' complains about serial port not available, even though it is there.

For now I have decided to buy another weather station that is known to work with 'wview' or 'weewx' so I can get some logging going and uploading data to a weather service.

But when things quieten down with TAFE and stuff might concider getting back into hacking it some more.

Dale

rachalmers
Posts: 15
Joined: Thu Jul 24, 2014 3:01 pm
Location: Suffolk, England
Contact:

Re: WH5302 Weather Station and 433Mhz RX Shield

Post by rachalmers » Wed Aug 06, 2014 2:48 pm

I've got it to the
Weather Station Receiver has powered up
state, but that's it . LaCrosse WS3600 station.

Used this code, having first come across the BYTE problem.

clibin009
Posts: 563
Joined: Mon Oct 23, 2017 2:57 am

Re: WH5302 Weather Station and 433Mhz RX Shield

Post by clibin009 » Mon Oct 23, 2017 4:41 am

clb1023
cheap jordan shoes
cheap oakley sunglasses
cheap ray ban sunglasses
ugg boots
uggs outlet
coach outlet store
supreme shirts
adidas shoes
canada goose outlet
coach outlet online
cheap jordan shoes
red bottom
coach outlet online
polo ralph lauren
oakley sunglasses outlet
pandora jewelry
pandora jewelry
coach outlet online
mulberry
michael kors outlet canada
coach outlet store
canada goose coats
nike sneakers
oakley sunglasses outlet
michael kors bags
adidas sneakers
pandora charms
cheap jordan shoes
michael kors outlet online
canada goose jacket
cheap jordan shoes
polo ralph lauren outlet online
michael kors handbags outlet
harden shoes
fred perry polo shirts
ray ban sunglasses sale
ugg boots sale
moncler outlet online
coach outlet online
ugg shoes
valentino
pandora charms sale clearance
uggs outlet
moncler outlet online
louis vuitton outlet online
michael kors
air max shoes
christian louboutin shoes
coach outlet store online
ugg boots women
ray ban sunglasses outlet
ugg
ugg boots
nike outlet
cheap ray ban sunglasses
ugg outlet
canada goose sale
ray ban sunglasses outlet
michael kors outlet online
jordan shoes
hermes bags
canada goose jackets
burberry outlet online
coach outlet online
longchamp bags
mlb jerseys
coach outlet online
coach outlet
michael kors outlet online
supreme uk
pandora charms
the north face outlet
cheap air jordans
canada goose jackets
canada goose coats
timberland outlet store
ralph lauren outlet online
ugg boots
yeezy boost 350
pandora outlet
michael kors outlet canada
north face outlet
mlb jerseys
air max
uggs
ralph lauren outlet online
michael kors
jerseys cheap
cheap jordans
canada goose outlet
coach outlet online
supreme clothing
michael kors
michael kors outlet store
coach outlet online
salvatore ferragamo outlet
michael kors outlet clearance
burberry handbags
air jordans
coach factory outlet online
retro 11
ugg outlet online
pandora charms sale clearance
louis vuitton outlet store
longchamps
louis vuitton outlet online
nfl jerseys
ugg outlet online
canada goose outlet
cheap nfl jerseys wholesale
polo ralph lauren
canada goose jackets
tory burch shoes
toms
uggs outlet
ugg boots on sale
christian louboutin shoes
michael kors outlet online
ralph lauren outlet
cheap uggs
uggs outlet
adidas outlet online
cheap ugg boots
ray ban sunglasses discount
moncler jacket
nike outlet online
michael kors outlet online
coach factory outlet online
ray ban sunglasses outlet
christian louboutin sale
uggs outlet
birkenstock shoes
hermes bags
michael kors outlet store
nike shoes
pandora jewelry outlet
canada goose outlet
uggs
uggs outlet
louis vuitton outlet
uggs clearance
louboutin outlet
moncler uk
cheap ugg boots
ugg boots outlet
ugg outlet
coach factory outlet
adidas superstar shoes
coach outlet online
adidas nmd runner
pandora jewelry outlet
adidas outlet store
canada goose coats
adidas nmd r1
ralph lauren outlet online
discount oakley sunglasses
ugg outlet
toms
coach purses
birkin handbags
ralph lauren outlet online
kate spade outlet
michael kors outlet online
pandora charms
yeezy shoes
coach factory outlet online
michael kors outlet store
canada goose uk
michael kors outlet clearance
burberry outlet online
canada goose jackets
uggs outlet
air jordan shoes
burberry outlet online
ray ban sunglasses cheap
ugg boots
hermes handbags
nike outlet store
uggs outlet
moncler coats
ugg boots
red bottom heels
coach outlet online
cheap ugg boots
moncler jackets
cheap ugg boots
bottes ugg
uggs outlet
polo ralph lauren outlet
ugg outlet store
coach outlet online
ralph lauren sale
toms shoes
ralph lauren
fred perry shirts
pandora charms sale
canada goose outlet online
moncler
adidas superstars
pandora uk
ugg boots outlet
cheap ugg boots
coach outlet online
coach factorty outlet online
louis vuitton factory outlet
canada goose parka
nike cortez classic
uggs outlet
moncler coats
burberry outlet online
cheap oakley sunglasses
ugg boots
polo ralph lauren outlet online
longchamp bags
coach outlet online
kate spade outlet online
coach factorty outlet online
coach factory outlet online
adidas yeezy boost
toms
nike outlet store online
coach factory outlet online
birkenstock outlet
coach outlet store
ugg boots outlet
coach outlet store online
michael kors outlet online
coach factory outlet
ralph lauren outlet
mbt
ugg boots
nike shoes
coach outlet online
ugg boots
north face outlet
polo ralph lauren outlet
canada goose outlet
canada goose
coach factory outlet online
kate spade outlet online
longchamp outlet
kate spade outlet online
polo ralph lauren outlet online
pandora charms outlet
adidas outlet online
coach factory outlet online
hermens
kate spade handbags
pandora charms outlet
columbia sportswear outlet
nike huarache shoes
uggs outlet
polo ralph lauren outlet
moncler sale
mulberry handbags
moncler
adidas nmd r1
canada goose coats
moncler jackets
moncler sale
air max
coach outlet store online clearance
burberry handbags
michael kors outlet store
caterpillar boots
yeezy boost 350
moncler sale
michael kors outlet clearance
uggs outlet
ralph lauren sale clearance uk
ugg sale
moncler coats
coach outlet canada
michael kors uk
coach outlet online
ugg boots clearance
ugg outlet
pandora jewelry store
cheap air jordans
coach outlet online
canada goose jacket
nmd adidas
coach factory outlet online
adidas outlet store
canada goose coats
ray bans
air jordans
coach factory outlet online
cheap nike shoes
ugg sale
pandora charms sale clearance
moncler coats
louis vuitton factory outlet
polo ralph lauren outlet
ralph lauren sale clearance uk
burberry outlet
michael kors outlet store
adidas ultra boost
michael kors outlet online
toms
ugg slippers
adidas nmd r1
coach outlet online
louboutin outlet
louboutin shoes
canada goose jackets
coach factory outlet online
louis vuitton factory outlet
canada goose outlet
michael kors bags
north face jackets
cheap ray bans
ugg australia
cheap nfl jerseys
uggs clearance
jordans
cheap uggs
adidas yeezy boost
cheap ray ban sunglasses
coach factory outlet
ugg boots
canada goose sale
coach factory outlet
polo outlet online
adidas store
canada goose sale
canada goose outlet
ray ban glasses
yeezy shoes
birkenstock
air jordan retro
cheap uggs
timberland outlet
mlb jerseys whgolesale
adidas nmd runner
coach outlet online
coach outlet canada
canada goose jackets
ugg boots clearance
ugg outlet online
michael kors outlet clearance
canada goose jackets
discount ray ban sunglasses
pandora charms outlet
canada goose sale
uggs outlet
coach outlet online
polo ralph lauren outlet
birkenstock uk
ray ban sunglasses discount
longchamp sale
ugg boots
michael kors outlet store
canada goose jackets
canada goose clothing
cheap jordan shoes
canada goose jackets
yeezy boost
michael kors outlet clearance
uggs
canada goose sale
christian louboutin sale
ugg boots outlet
red bottoms
ugg boots outlet
uggs on sale
canada goose jackets
adidas yeezy boost 350
ralph lauren uk
uggs outlet
cheap ugg sale
moncler jackets
coach factory outlet
christian louboutin shoes
yeezy boost 350
ferragamo shoes
uggs outlet
canada goose uk
gucci outlet online
ugg outlet store
cheap ugg boots
fitflops sale clearance
nike outlet online
nike outlet store
canada goose sale
uggs outlet
cheap air jordans
canada goose jackets
moncler outlet online
mulberry outlet uk
north face jackets
louis vuitton outlet store
ugg boots
coach factory outlet online
valentino outlet
ralph lauren sale
louis vuitton outlet online
yeezy shoes
ferragamo outlet
canada goose
pandora
canada goose coats
hermes outlet
coach factory outlet online
the north face outlet
polo ralph lauren outlet online
uggs outlet
coach outlet online
kate spade handbags
ugg outlet
ray ban glasses
michael kors outlet clearance
ralph lauren sale
hermes bag
longchamp outlet store
harden vol 1
pandora charms
polo ralph lauren outlet
burberry outlet online
michael kors outlet online
ugg boots
ugg canada
ralph lauren outlet
burberry handbags
tory burch outlet online
polo ralph lauren outlet
michael kors
canada goose jackets
fitflop sandals
coach outlet store
polo ralph lauren outlet
salvatore ferragamo shoes
ray bans
adidas yeezy shoes
coach outlet online
gucci outlet
coach handbags outlet
christian louboutin shoes
pandora charms outlet
ralph lauren
nike air max 2018
mbt
coach outlet online
kate spade handbags
cheap oakley sunglasses
louis vuitton handbags
christian louboutin shoes
michael kors outlet store
moncler pas cher
moncler outlet online
ray bans
kate spade outlet
cheap jordans for sale
nike sneakers
tory burch outlet online
toms outlet
ugg on sale
coach outlet online
ugg outlet
mulberry uk
cheap jordans free shipping
coach outlet store online
clb1023

yaoxuemei
Posts: 243
Joined: Fri Dec 15, 2017 7:34 am

Re: WH5302 Weather Station and 433Mhz RX Shield

Post by yaoxuemei » Fri Dec 15, 2017 8:37 am

michael kors outlet
polo ralph lauren
pandora bracelet
jordan shoes
ralph lauren
giuseppe zanotti outlet
canada goose outlet
lunette ray ban
christian louboutin outlet
oakley sunglasses
polo ralph lauren
uggs outlet
oakley sunglasses wholesale
polo outlet
nike shoes on sale
canada goose jackets
moncler coats
canada goose jackets
ray ban wayfarer
nfl jerseys
ugg boots clearance
supreme t shirts
michael kors outlet
canada goose outlet store
ugg boots
coach outlet
tory burch outlet stores
mlb jerseys
coach outlet
supreme outlet
uggs outlet
ugg outlet
cheap ray bans sunglasses
polo outlet
ray-ban sunglasses
true religion jeans
tory burch sandals
canada goose outlet online
oakley sunglasses
uggs outlet
michael kors outlet
ugg boots
coach factory outlet
nfl jerseys wholesale
michael kors outlet online
ray ban sunglasses
ugg outlet
polo ralph lauren
uggs outlet
mulberry outlet
pandora outlet store
cheap oakley sunglasses
ray ban sunglasse
pandora jewelry outlet
ralph lauren shirts
coach outlet store online
coach outlet
cheap jordans
nike outlet store
canada goose jackets
coach outlet
uggs outlet
michael kors
fitflops sale clearance
uggs outlet
pandora outlet
cheap mlb jerseys
michael kors outlet
uggs outlet
cheap uggs
true religion
adidas outlet online
ugg outlet online clearance
polo ralph lauren outlet
fitflops sale clearance
canada goose jackets
nike shoes
michael kors outlet clearance
michael kors outlet
polo ralph lauren pas cher
longchamp bags
michael kors outlet online
coach outlet online
jordan shoes
canada goose
oakley sunglasses
mulberry handbags
true religion outlet
ray ban wayfarer
nike shoes for men
cheap ugg boots
fitflops sandals
coach outlet online
michael kors outlet online
michael kors outlet
yeezy boost
fitflops outlet
michael kors outlet clearance
nike outlet
uggs outlet
coach outlet clearance
ugg outlet
oakley sunglasses wholesale
giuseppe zanotti shoes
oakley sunglasses wholesale
tory burch outlet
oakley sunglasses wholesale
cheap oakley sunglasses
ralph lauren
ralph lauren uk
michael kors outlet clearance
polo ralph lauren shirts
canada goose outlet
pandora charms
nike shoes
nfl jerseys wholesale
coach factory outlet
canada goose jackets sale
ugg outlet
canada goose outlet
cheap ugg boots
christian louboutin shoes
coach outlet online
ralph lauren outlet
coach outlet online
uggs outlet
pandora outlet
ralph lauren polo
michael kors outlet
michael kors outlet
michael kors outlet clearance
ralph lauren uk
coach outlet store online
oakley sunglasses outlet
polo ralph lauren outlet
coach outlet
pandora outlet
ugg outlet
nike outlet
coach outlet
fred perry polo shirts
canada goose
pandora rings
michael kors outlet
nike outlet online
kate spade handbags
ugg outlet store
pandora charms
canada goose
ferragamo outlet store
polo outlet
true religion outlet store
uggs outlet
michael kors outlet online
polo ralph lauren
michael kors outlet online
coach factory outlet online
canada goose jackets
coach outlet store online
polo ralph lauren
christian louboutin
polo outlet
canada goose outlet store
coach outlet
jordan retro shoes
ralph lauren
michael kors outlet clearance
michael kors outlet online
michael kors outlet
canada goose outlet online
ugg outlet
air max shoes
uggs outlet
cheap nfl jerseys
ugg outlet
uggs on sale
ugg outlet
canada goose jackets
coach outlet
coach outlet
cheap nfl jerseys
canada goose outlet
ralph lauren
air jordan shoes
true religion outlet
polo shirts
coach factory outlet
canada goose outlet
mlb jerseys wholesale
canada goose outlet store
polo ralph lauren factory store
canada goose uk
polo ralph lauren
uggs outlet
adidas nmd
mont blanc outlet
polo outlet
mlb jerseys
longchamp
canada goose
yaoxuemei20171215




yaoxuemei
Posts: 243
Joined: Fri Dec 15, 2017 7:34 am

Re: WH5302 Weather Station and 433Mhz RX Shield

Post by yaoxuemei » Thu Feb 01, 2018 2:19 am

yaoxuemei20180201coach outlet
nike shoes for men
oakley sunglasses
polo ralph lauren
michael kors outlet
michael kors outlet clearance
pandora jewelry outlet
pandora jewelry
canada goose jackets canada
canada goose outlet store
jordan retro
yeezy boost 350 v2
coach outlet online
uggs outlet
ray-ban sunglasses
longchamp bags
true religion outlet
canada goose jackets
christian louboutin outlet
michael kors outlet store
polo ralph lauren
oakley sunglasses
christian louboutin sale
cheap jordan shoes
michael kors outlet
polo ralph lauren
christian louboutin
adidas yeezy shoes
cheap jordans for sale
nike outlet
mulberry bags
cheap ray bans sunglasses
cheap ugg boots
uggs outlet
giuseppe zanotti sneakers
tory burch outlet
pandora charms
ugg outlet online clearance
uggs outlet
michael kors outlet
michael kors outlet
michael kors outlet
mont blanc pens
pandora charms sale clearance
ugg outlet
coach outlet
michael kors outlet
canada goose
pandora jewelry
coach outlet
ralph lauren uk
pandora jewelry
ugg boots
canada goose
michael kors outlet clearance
canada goose jackets canada
uggs outlet
cheap nike shoes
michael kors outlet online
mlb jerseys wholesale
canada goose outlet store
coach outlet canada
michael kors outlet
coach outlet online
yeezy boost 350
ugg,uggs,uggs canada
polo outlet
ugg boots outlet
polo ralph lauren
michael kors outlet online
kate spade outlet online
canada goose outlet store
ugg boots clearance
canada goose jackets
christian louboutin
polo ralph lauren outlet online
air jordan shoes
pandora jewelry outlet
ralph lauren outlet
michael kors outlet online
ugg outlet
nike outlet
fitflops sale
oakley sunglasses outlet
fitflops sale clearance
canada goose outlet
cheap nfl jerseys
canada goose outlet
adidas yeezy
coach outlet online
ray ban sunglasses outlet
fred perry
coach outlet
michael kors outlet
ugg outlet
cheap jerseys wholesale
ugg boots
canada goose jackets
pandora rings
yeezy shoes
ugg sale
fred perry polo shirts
kate spade outlet online
michael kors outlet
michael kors outlet clearance
ugg boots
canada goose outlet store
canada goose jackets
nmd adidas
ferragamo outlet
mbt shoes
polo ralph lauren
longchamp outlet
pandora bracelet
michael kors outlet
longchamp
nfl jerseys
coach outlet
uggs outlet
polo outlet
christian louboutin shoes
michael kors outlet online
uggs outlet
oakley sunglasses wholesale
coach outlet store online
giuseppe zanotti outlet
coach outlet online
michael kors outlet
mont blanc outlet
cheap authentic nba jerseys
polo ralph lauren
mulberry sale
uggs outlet
nike outlet online
canada goose
polo ralph lauren outlet online
mlb jerseys
adidas outlet
nike air max
air max 2017
ugg outlet store
supreme clothing
fred perry outlet
polo ralph lauren
polo outlet
mlb jerseys wholesale
lunette ray ban
ralph lauren outlet
ugg outlet stores
mbt outlet
lacoste outlet
michael kors handbags
adidas outlet store
canada goose outlet
coach outlet
polo ralph lauren
cheap uggs
mlb jerseys
oakley sunglasses
polo ralph lauren
cheap ray ban sunglasses
ralph lauren
canada goose uk
kate spade handbags
canada goose outlet
michael kors outlet clearance
cheap jordans
pandora jewelry sale
nmd adidas
coach outlet online
nike shoes
pandora outlet
cheap ugg boots
air max 90
michael kors outlet online
air jordan shoes
kate spade sale
ugg outlet
mulberry handbags
ugg boots
michael kors outlet
christian louboutin shoes
longchamp handbags
michael kors outlet online
coach outlet
lacoste shoes
pandora charms outlet
canada goose outlet
polo shirts
pandora charms
ugg boots clearance
ugg boots
ugg outlet
uggs outlet
canada goose outlet
supreme t shirts
michael kors outlet
pandora outlet
ugg outlet
ugg,uggs,uggs canada

Post Reply

Who is online

Users browsing this forum: No registered users and 2 guests