Receiving Lacrosse TX22U (IT+) weather station data using Arduino and RFM12B

I purchased a Lacrosse WS-1610 weather station a few years ago.  It uses a TX22U sensor/transmitter to send outdoor temperature, humidity, and also data from rain and wind sensors to its base stations inside home. It is still working very well.

This year I decided that I want to somehow receive its weather data directly and transfer them to a computer (eventually a RaspberryPI) for storage and creating more interesting records, graphs and reports. I started by searching the web to see if somebody has already done this and to gather information about the specifications of transmission  protocols that TX22U sensor uses. Unfortunately I could not find a similar work with my exact type of sensor i.e. TX22U. It seemed that this transmitter is a little different from other Lacrosse transmitters.   Everything that I developed and explain here is based on the information that I found on the following pages:

  1. This work by joob, marf and Rinie here.
  2. WS1600 logging by Götz Romahn which is based on this work by Fred B.
  3. How to connect Arduino to RFM12B.

First of all I should mention that I am working with the north America version of sensors which use the 915MHz band. I started my tests with a TX40U temperature sensor that I also have. Both my TX22U and TX40U sensors use newer Lacrosse technology which is called IT+. In north America they are on the 915MHz band and use FSK for modulation.

Here are my discoveries:

1)It seems that all these transmitters (TX40, TX22 that I tested and TX29, TX25 mentioned here) transmit their information around every 4 to 4.5 seconds.

2)They actually perform a frequency hopping between 910MHz, 915MHz, and 920MHz. So they change their transmitter frequency every 4 seconds. Lets say first 910 then jump to 915 then 920 and back to 910MHz. So if you want to receive all transmissions from these sensors you need to change your receiver’s frequency and hop to the next frequency after each successful reception.

3)Differences between TX22U and other sensors/transmitters: These tested sensors transmit their data at a bit rate of 17.241 kbps and their data frames begin with a “9″. But TX22U transmits its information with a bit rate of: 8.621 kbps. It sends a varying data frame up to 13 bytes and its frames begin with an “A” rather than “9″.

TX22U frame decoding is explained very well  by  Götz Romahn which I just copy and paste here for ease of use and reference:


BY Götz Romahn:

Data - organized in nibbles - are structured as follows
(example with blanks added for clarity):

a 5a 5 0 628 1 033 2 000 3 e00 4 000 bd
data always start with "a"
from next 1.5 nibbles (here 5a) the 6 msb are identifier of
transmitter,bit 1 indicates acquisition/synchronizing phase
(so 5a >> 58 thereafter) bit 0 will be 1 in case of error
(e.g. no wind sensor 5a >> 5b)
next nibble (here 5) is count of quartets to betransmitted
up to 5 quartets of data follow
each quartet starts with type indicator (here 0,1,2,3,4)
0: temperature, 3 nibbles bcd coded tenth of °c plus 400
(here 628-400 = 22.8°C)
1: humidity, 3 nibbles bcd coded (here 33 %rH), meaning of 1st nibble still unclear
2: rain, 3 nibbles, counter of contact closures
3: wind, first nibble direction of wind vane (multiply by 22.5 to obtain degrees,
here 0xe*22.5 = 315 degrees) next two nibbles wind speed in m per sec
(i.e. no more than 255 m/s; 9th bit still not found)
4: gust, speed in m per sec (yes, TX23 sensor does measure gusts and data are transmitted
but not displayed by WS1600), number of significant nibbles still unclear
next two bytes (here bd) are crc.
During acquisition/synchronizing phase (abt. 5 hours) all 5 quartets are sent,
see example above. Thereafter data strings contain only a few ( 1 up ton 3) quartets,
so data strings are not! always of equal length.

After powering on, the complete set of data will be transmitted every 4.5 secs for 5 hours
during acquisition phase. Later on only selected sets of data will be transmitted.

Stream of received data follows:

1st line: raw data in hex format as received from sensors
2nd line: meteorological data from outdoor sensors decoded, Same values
are displayed on basestation (last duet is "calculated crc" - always 00).

a1250444109120003808401b89 00
Temp  044 Humi 91 Rain 000 Wind 028  Dir 180 Gust 097
( 4.4 °C, 91 %rH, no rain, wind 2.8 km/h from south, gust 9.7 km/h)
a1250444109120003709401b41 00
Temp  044 Humi 91 Rain 000 Wind 032  Dir 157 Gust 097 

Acquisition phase is finished after 5 hours. 
( transmitter had been restarted meanwhile, therefore new address had been generated!)

a3832005380c401d59 00
Rain 025 Wind 043  Dir 180 Gust 104 
a3822005380fbe 00
Temp  042 Rain 025 Wind 068  Dir 157 
a38320053512400b66 00
Rain 025 Wind 064  Dir 112 Gust 039 
a383109120053712bc 00
Humi 91 Rain 025 Wind 064  Dir 157 
a382200532103d 00

Now here is my Arduino code whitch is based on the code by joob and some functionality from  Götz Romahn.  You can find the information on how to connect an RFM12B module to an Arduino here. But I also post their diagram here:

The following code receives TX22U transmissions without any error checking and prints out (On serial monitor) the frequency, raw data, and weather data:


After successfully receiving weather data from my TX22U sensor with an Arduino, I decided to try to read the data with my RaspberryPI.

Unfortunately, all my attempts failed and I decided to use a small micro-controller (AVR) to communicate with the RFM12B and read weather data from the TX22U sensor. The AVR can then also average the data over periods of 30 seconds or 60 seconds and RaspberryPI can read the data any time e.g. every 1 minute without any overload. This is important for me as I want my RaspberryPI also run other things like a web page, MySQL, …


19 Responses to “Receiving Lacrosse TX22U (IT+) weather station data using Arduino and RFM12B”

  1. Patrick Says:

    Hello, and thank you for sharing your experience.
    Before going further (I mean buying a ws1600) i’d like to be sure your code is for an arduino (i my case duemillanove) connected to a RFM12B (868Mhz in my case, i’m french). it communicates with a TX22U-IT+ on which are connected several sensors (anemometer + rain + integrated thermo and pressure).

    In fact my question is ‘is it really the TX22U-IT+ you are talking about ?

    In that case, where do the values come from in
    for i will have to tranpose for 868Mhz

    Thank you for your help

  2. mohammad Says:

    Hi Patrick,

    Yes, this code is for an Arduino. I have tested this with arduino uno connected to an RFM12B.
    Yes it is really a TX22U-IT+ with a rain sensor and a wind sensor connected to it, temperature and anemometer integrated in the transmitter. Please note that the pressure sensor is actually integrated in the receiver/display. So the TX-22U does not transmit any pressure information.
    You are exactly right and the rf12_xfer commands that you have mentioned set the frequency.
    I can’t talk about the exact frequencies in the 868MHz band but based on the work by joop, you should be able to receive the 868MHz band using these values:
    For band configuration:
    rf12_xfer(0x80E8); // 80e8 CONFIGURATION EL,EF,868 band,12.5pF

    for frequency:
    rf12_xfer(0xA67c); // a67c FREQUENCY SETTING 868.300

    There should be two other frequencies that the transmitter uses, and you should be able to find them by writing a code to scan different frequencies.
    Please post your results here.

    Thank You

  3. Patrick Says:

    Thank’s a lot i’ll try it as soon as i receive my station !

  4. Randy Says:

    Mohammad, thank you for posting this – I find it very interesting. I am attempting something very similar but using an Auduino Uno connected to a RFM22B radio module and a TX21U sensor. The RFM22B operates differently than the RFM12B so I am attempting to make the translation between your settings and what I need to set.

    1) Could you list a summary of the exact radio settings you got to work? Modulation (FSK?), etc. I am not a radio guy so nothing is obvious to me!

    2) How did you determine the exact freq to use? The RFM22B has an Radio signal strength indicator (RSSI)function but I haven’t been able to detect anything. Maybe I have something connected wrong but I am able to read and write to the registers on the RFM22B, perform all the functions, I’m just not receiving anything.

    3) Is there a simple way to test the receive function? Maybe a garage door opener or something similar?

    Thanks for your help!

  5. Patrick Says:

    Hello again. I have difficulties playing your code. I have a WS1600 now and i have many questions about your sketch.
    I have wired my frm12b like the diagram, loaded your sketch and changed what we talked about, and nothing comes…

    in the sketch it is written
    #define SDI 3 // polling 4 Pins ,3 SPI + Chipselect
    #define SCK1 5 // differs with Jee-node lib !
    #define CS 2
    #define SDO 4

    I have an arduino duemilanove. do i have to change anything in your sketch to adapt the pinouts ?

    thank you

  6. Mohammad Says:

    Hi, Randi,
    I am not really a radio guy either.
    Your setting is somehow very different from mine.
    Your radio module is different, and your sensor is also different.
    I have no experience with RFM22B radio. I don’t,’t know TX21u frequencies either.
    It is a while that I did this project, and I have been very busy recently, so I actually need some time to go back and recover the details. But it is FSK for sure. The frequencies and bit rates are in the post, I have mostly extract them from the work by joop and others which you can find in the link that I have provided.
    I wrote a code to scan the whole frequency range and was looking to find meaningful data. For this step I was using another sensor which only sent temperature. Look at the work by joop and others.
    The code makes the Rfm12b to listen to everything and as soon as it detects a signal which begins with a specific pattern it captures it and sends it out. Arduino constantly checks the radio and as soon as it detects some output is coming out, it captures it, then it does the CRC and other checks.
    Regarding receiving, at the beginning it was very hard and disappointing for me too. I don’t know if door oppeners work in this frequency range or not.

  7. mohammad Says:

    Hi Patrick,

    I did a little bit of search and it seems that UNO and Duemilanove have the same processor and pin layout.
    If your wiring and everything else is good then maybe the European version has a different bit rate.
    Then you need to add a loop to change the bit rate over the range of possible values (with a fixed freq.) and at each value listen for at least 47 seconds to see if you can pickup consistent frames.
    But I actually suggest that you first change your freq. a little around 868MHz.

  8. Patrick Says:

    it works ! I have bought a ‘clean’ rfm12b board; and it solved my problem. Thank you for your response.

  9. mohammad Says:

    Happy to hear that it is working for you.

  10. Sebastien Says:

    Do you include pressure in your project ?

  11. Sebastien Says:

    Do you included pressure in your project ?

  12. mohammad Says:

    Hi Sebastien,
    TX22U does not measure pressure. This work only receives whatever TX22U sends, and pressure is not one of them.

  13. Sebastien Says:

    Ok escuse me , but i’m noob and i have a bad enghish. I anderstand for pressure. My item is a w1600, i buy a RFM12B with 868Mhz, is it good and the code is it the good for me ?

  14. mohammad Says:

    Hi Sebastien,

    If you have a European version of ws1600 which works in the 868MHz band, then yes, you should be able to receive the data with this code. You just need to make the changes that I have mentioned in post #2:
    For band configuration:
    rf12_xfer(0x80E8); // 80e8 CONFIGURATION EL,EF,868 band,12.5pF
    for frequency:
    rf12_xfer(0xA67c); // a67c FREQUENCY SETTING 868.300

    Please let me know your result.

  15. Alex Says:

    Hello Makers,

    I have been trying to interface with the Lacrosse TX25-IT 915Mhz and the RFM69W with a raspberrypi, despite all my efforts to get any kind of data I have not been successful. I have tried many things without any luck. Has anyone tried to use this module to capture data from the sensor?

    Your help is much appreciated

  16. Michal Says:

    Small comment to WS1600 sensors ( TX22 )
    Wind speeds are not in m/s but in 0.1 m/s.
    So maximum value is 25.5 m/s. (8bit) ( 91 km/h )
    Maximum value for gusts is 9bit – 51 m/s ( 180 km/h).

    I confirm 8.6 kbps speed.
    Error bit is set for missing wind speed sensor as well
    as for battery low voltage.

  17. Greg Says:

    I’m building my own transmitter as a replacement for TX-22U (868MHz) and I have problem with it.
    My base station (WH1600) correctly receives and decodes first packet from my transmitter (data displayed on LCD), however next packet is not accepted and transmission is lost.
    Do You know how pairing after “power on” protocol is working? Any additional packets? Different frequency? For sure I’m sending correct packet, however it seems some other requirements are not handled and base station denied pairing.

    Best Regards,

  18. mohammad Says:

    Hi Greg,

    It is while since I did this work with TX22U, and I actually didn’t work on transmission to the station at all.
    So unfortunately I can’t answer your questions.



  19. Greg Says:

    Thanks for answer :) .
    Well I don’t like to give up, right now I’m trying to analyze SPI signals in the transmitter. However again I have some troubles.


Leave a Reply

Current month ye@r day *