433mhz weather station protocol?

I'm trying to receive a current temperature and humidity from remote weather station sensor using 433mhz receiver (EMAX EM-RX433-01). This receiver has 3 pins: GND, POWER and DATA. I connected power to 5v, GND to the ground and I'm receiving DATA in a following format:

1111111111101111100011111111111111111111000111111111111100011100001111111111111111111000011111111111111111110000 1111111111111111100011111111111111111111000011111111111110000111000011111111111111111100011111111111111111110000 1111111111111100100001111111111111111111000011111111111110000110000111111111111111111100011111111111111111111000 1111111111111111110001111111111111111111100011111111111110000000000111111111111111111100011111111111111011111000 1111111111111111100001111111111111101111100011111111111110001111000111111101111111111110001111111111111111111000 1111111111111111110001111111111111111111110001111111111110000111000011111110111111111110001111111111111111111100 1111111111111111110000111111111111111111100001111111111111000111000011111111111111111110001111111111111111111100 1001111111111011111000111111111111111111110001111111111111000110000011111111111111111110000111111111111101111100 1111111111110011111000111111111111111111110000111111111111100011000001111100111111111111000111111111111111111100 1111111111111011111100011111111111111111110001111111111111100011100001111111111111111111000111111111111111111110 1111111111111101111000011111111111111111110000111111111111100001100001111111011111111111000111011111111111111110 1111111111111111111100011111111111111111110000111111111111110000100001111111111111111111000111111111111100111110 0111111111111111111100011111111111111111111000111111110111110011100001111111111111111111000011111111111110111111 0111111111111100111100011111111111111101111000111111111111110000110000111111111111111111100011111111111111111111 0111111111111110111110001111111111111111111000011111111111110001110001100011111111111111100011111111111111111110 0111111111111111111100001111111111111111111100011111111111110000110000111111111111111111100001111111111111111111 0011111110011110011110001111111111001111110000111100011111111011000000111111110001111111111100011111100111111000 0011111110011110011111100011111000111111001111110001111100011111100001111000111111111110000111100011111100011111 0011111001111111111110001111111111100111111000111110001111111011100000111111111001111111111110001111111111100011 1000111111001111001111100001111111111100011111000111110001111110001100001111100111111111110001111111110011111100 0011100111111111111001100011111110011110011111000111111001111110001100001111100011111111111000111110001111110001 1100011111100111111000111110001111111111100011011100111111000111110000111110011111111111100011111111111001111110 0001100011111111111000110111111110001111111111100011111111111000111110000111110001111111111100011111111111000111 0001111100011111100011100011111000111111111111000111111100111111000110111000111111111110011100011111100111110011 0000111110001111100011100011111000111111111110000111110011111100011111000111111001111110001101100011111111111000 1111000111110011111100000011100111111111111000110011111110011111100011011000111101111110001100011111100011111001 1000111111111110001111110001111100011111111111000111111111110001111100001111100111111000111100011110001111111111 1000111111000111110001111110001111111111100011100011111001111110001110001111100011111000111100011110001111111111 0001111100111111000111110000111110001111100011111000111111111110000111110001111100011111100111111000111111111110 1100011111100111111000111111001111111111110011100001111100111111000110000111101111100011111100011111000111111111 0000111111111100111111000001111001111110001111100011100011111111000011000011110001111110011111100011111111111000 1100011110001111111111100001111000111111001111110001110011111111111000000111000111110001111110001111100011111000 1110000111111111110001111100011111000111111001111110001111111111100011100001111000111110001111100001111111111100 1100001111001111111111110001111111111100111111000011110001111111111100000110001111001111110001101110001111100011 1110111000111111111101111000011100011111100011111000111111111110001111100011100011111111111000100110001111110011 1110011100111111111110001111110011111100011111100011111000111110000111110001111111111100111111000011110001111110 1111100011111111111000111100011110001111110001111100011111111111000111110001110001111111111100110011111111100011 1000001111000111111111110001111111111100111111000111110001111110001110000011100011111111111111100011110011111100 1111000011111111111001111110001110011111111111000111111000111110001111110011100011111111111000110110001111110011 1100001111000011111000111110000111111111100011111100011111000111110000111100001111111111100111110001111001111110 1111100011111111111000111110001110001111111111100011111111111001111110000101110001110111111100111001111111001111 0001101100011111100111111110111000111111111111111110011100011111000111111000111111111110011111110011100111111111 0001111110001111100011111111011000111111111110001111100001111100111111000000111001111110001111100001111111111000 1111000111110001111110011111100011111111111000111110001110011111100011111000011111111111001111111001100011111111 1000110001111110001111110011111100011111111111000110000111110001111100011111000011111001111111111110001111111111 0011110111000111111001111110000111111111100111111111111000111111111110001111100011111000111111111110001111111111 0011111000011111000111110001101110011111100011111000011111111110001111110000011100011111100111111000111111111110 1111110011100011111000111111000111111111110011111111011000111111111110001110001111100011111100011111000111111111 0001110000111100011111000111110000111110001111111111100011111111111110001111110001111100011111100011111111111001 1011111110001111111111100011111000111111001111111111100001111111111000011111000111110001111100011111100011111000 1111001100011111110011111100011011000111111001111110000111111111100011000111111000111110001111110001011111111100 1101111110001111111111110011110001111000111111000111110001111111111100011110000111000111111001111110001111100011 1111111000011111111111111111111100011111100111111000110001111110001111000011100011111111111000111110001111110011 1111111100011111111111001111110001111100011111100111111000111110001111110001100011111100111111000111110001111110 1111100011001111111001111101111110001111100011111100011001111111001111000011100001111111111100111110001111001111 0001111100001111111111000111111001110001111110011111100011111000111111101110000111111111111111111111000111111001 1110001110001111100011111111111000111111111110001111100001111100111111100111000011111111110011111100001111000111 1001111110001111100011111100011100011111001111110001111100011111100111111000110001111110001111111111100011111000 1111000110001111110001111111111100011111111111001111111001110011111100011111000011110011110001111111101100011111 0111111000001110001111111101001110011111111111111111111000111111111111110001110001111111111111111111100011111111 1111111111000111111111111111111110001111111111111111111100011111111111111001110000111111111111111111100011111111 1111111111000111111111111111111110001111111111111111111100011111111111111000110000111111111111111111100011111111 1111101111000111111111111111001110001111111111111111111000011111111111110000111000011111111111111111110001111111 1111100111000011111111111111011110001111111111111111111100011111111111111000111000011111111111111111110001111111 1111111111100011111111111111111110001111111111111111111110001111111111111110000000011111111111111111110001111111 1111111111100011111111111111111111000111111111111111111110001111111111111100011100011100111111111111111000111111 1111111111100011111111111111101111000111111111111111001110001111111111111100001100011111111111111111111000111111 1111111111110001111111111111111111000011111111111111111110001111111111111110001100001110111111111111111000111111 1111110111110001111111111111100111000011111111111111100111000111111111111110000100001111111111111111111000111111 1111111111110001111111111111111111100011111111111111111111001111001111111110000010001111111111111111111100111111 1111111001110001111111111111111111100011111111111111111111000111111111111110001110001111111111111111111100011111 1111111111111000111111111111111111100011111111111111111111000011111111111111000111000111111111111111111100011111 1111111111111000111111111111111001110001111111111111111111100011111111111110000110000111111111111111111100001111 1111111110111000111111111111111111110001111111111111111111100011111111111111000011000111111111111111111100001111 1111111111111000111111111111111101110001111111111111110111100011111111111111000111000011101111111111111110001111 1111111111111100011111111111111111110000111111111111111111110001111111111111100011000011111111111111111110001111

Actual signal from the weather station is n the middle of this log. When transmitter transmits nothing, I receive a data looking like this: "11111111111111000011111111111111111110000111111111". I have spent a lot of time reading forums and trying to understand what kind of a protocol it is and how to read it in my arduino. Maybe anyone knows how to decode this in a readable format?

I don't know the format but I like the image of the bits, looks like a heavy rainstorm ;)

It is not clear how you got these samples, how your code looks like, so it is impossible to make an interpretation from here. that said: - you identified a repeating [no info?] pattern, so you should be able to strip that - you need to add timestamps to individual samples, makes analyzing better possible - I think your samples are not the bits, the data looks a bit oversampled. I think that ~3 zero bits = LOW and ~3 one bits = HIGH.

Q: please post the link to the datasheet of the weatherstation (or any other info you have) Q: please post your code

This rainstorm makes me crazy :) :roll_eyes:

-This repeating pattern is always changing a bit, there are random 1/0 sometimes. Do you mean strip it when no signal is received or strip from incoming stream? -The whole stream is received immediately. Each bit is received in: 1/16mhz = 62,5 nanoseconds -You are right, but curently I have no ideas how to receive not oversampled data without noise.

A:Unfortunatelly I have no any datasheets for this station, because it's a quite cheap one: "Precision Weather Station" http://reviews.argos.co.uk/1493-en_gb/2554114/reviews.htm

A:Code is quite simple

void setup() { Serial.begin(57600); pinMode(40, INPUT); }

void loop() { int sensorValue = digitalRead(40); Serial.print(sensorValue, DEC); }

Looks like you're using a mega, rather than trying to read the data bit by bit on a digital input, where getting the timing right will be tricky, how about trying one of the other serial ports?

Each bit is received in: 1/16mhz = 62,5 nanoseconds

Very unlikely as the code (e.g. serial.print(val, DEC)) takes far more time to execute. 57600 baud means 5760 chars per second can be send, so the time between the above samples is at best in the order of 1/5760 sec ~~ 174 microseconds. Further the digitalRead also takes some time ....

based upon my assumption that the three -sometimes 4- zeros form one logical LOW => one real bit is in the order of 3.25 x 1/5760 == 0.00053 second. So the signal could be a 2Khz signal (which is quite a reasonable number). Below code to sample at this frequency (not compiled or tested)

void setup()
{
  Serial.begin(115200);  // as fast as possible
  pinMode(40, INPUT);
}

unsigned long last = 0;

void loop() 
{
  unsigned long t = micros();
  if (t - last >= 500)
  {
    last = t + t - last - 500;                    //  the t- last - 500 is to prevent drifting ...
    int sensorValue = digitalRead(40);
    Serial.print(sensorValue, DEC);
  }
}

Can you test this code and look if the pulses make more sense?

2wildbill: yes, I'm using mega. Good idea! I'll definitely try it soon.

2robtillaart: result is more convenient now, but still there are random 1/0 sometimes...

1011111110101111101111110011111100111111001111110111111101111111011111110101111 0011111100111111001111110011111101111111011111110111111101011111011111100011111 0011111101111111011111110111111101111111010111110111111101111111011111100101111 0011111101111111011111110111111101111111011111110111111001011110011111101111111 0111111101011111011111110111111101111110010111100111111011111110111111101011111 0111111101111111011111110101111001111110111111101111111010111110111111001111110 0111111011111110111111101111111011111110101111101111110011111100111111010111110 1111111011111110111111001011111011111100111111011111110101111101111111011111110 1111111010111100111111001111110111111101011111011111110111111101111110010111100 1111110111111101111111010111110111111101111110011111101101111011111110111111101 1111110111111101111111011111110111111001011110011111101111111011111110101111101 1111110111111101111111010111110111111011111110111111101011111011111110111111101 1111110101111011111110111111101111111010111110111111101111111011110100101110110 1111110111101101111010110111101110110010110110110110101111011011011010110101101 1111101101011010111100111110110111101011011011011111100111110101101101101011010 1111110101101011011110111101101101101101111011011111010111101011011110111101011 1101101011110110110110101110110110110111101101111111011011110111101101011011001 1110101101101101101100101101010110110110110101101111010101100111010110111101010 1101101111011010110110110111001111111011011001111111011011110111101101011111101 1011011011011011110110101101101111010110111101101110010101111011110110110111101 0101101101101011011101111110010111101111011001111111011110110101101101101101101 0111101101101101101101011101011011010110111101111011001101101111011110110110111 1110001111110110110101101111010111100101011110111101001011011011011011010110110 1101011110110101111001011110111101111011110101101111010110110110110101011110011 0110110111110110110101101111011110110101011011011011011011110110101101101111011 1101011010110101111011010111101111100110111101101101101111001111110010110110101 1110001111010110111101111011011011110110110101101100101101101110111101111011011 1101011111101111011011011110111111001011011010111110110110101111011010110110101 1110011011110110110110110110110111001011011011011110111101101010111101111010110 1111011111110101111011011011011110101111101101101011011110101111011010111100111 0110110111101101101011011010011110101101111011110110111101110111101011011011011 1101011110110110101101111010101101001110111101101111011110101011110110110110110 1101101110110110110110111100111111101101111011110110101111010110110101111011011 1110111011101111011011011110111111001110111101111010110111101101101101101101011 0110111101101011110011101100111111101111011010110110111101011110110110111101111 1110111111101111111010111110111111101111111011111101111111011111110111111101111 1110101111101111111011111110111111001111110111111101111111011111110101111101111 1100111111011111110101111101111111011111110111111101111111011111110111111101111 1101111111011111110111111101111111011111110111111001111110011111101111111011111 0101111111011111110101111101111110111111101111111011111110111111101111101011111

now there becomes a repeating pattern of 0111111 = 0x7F = 127 visible. This is a typical value.

And it looks like almost every 8-th bit is a zero.

The most used parts of the ascii table for tekst are in hex: 0x41 - 0x5A (uppercase) 0x61 - 0x7A (lowercase) // I see a lot of 0110xxxx0110xxxx in the stream that could mean lower case ascii

Now you have to write a program that read the bitstream at every position and convert the bits to char's and try to print them you need to try to sync with 0x7F's

But first you have to get the sample speed right, you need to write a sketch that gets the timing better. Connect the signal to IRQ line ( don't know the MEGA iRQ PIN's) and trigger on CHANGING in the "idle" mode.

(code not tested)

void setup()
{
  Serial.begin(115200);
  attachInterrupt(0, IRQ, CHANGE);
}

void loop()
{}

volatile unsigned long t = 0;
void IRQ()
{
  unsigned long interval = micros() - t;
  t = micros();
  Serial.println(interval, DEC);  // ok print statements in IRQ is not advised but as the IRQ's are expected approx every 500 microseconds it might work.
}

During the idle time this code should give a short interval (one LOW ) and a long interval (7 HIGH's). If you have those two values you should be able to calculate the bitrate of the device pretty precise.

I was playing a bit with serial connection but without success: I'm receiving a lot of 255 and 253 bytes in the idle mode and random numbers while receiving... can't guess a correct baud rate. EM-RX433-01 board is using CHMC S23 S358F chip, but I can't find data sheet for it.

Great! Thanks! :) That's what I was searching for. I'll try it to find out a bitrate

Output is pretty weird :cold_sweat:

668 1276 1064 6956 672 1156 1308 6376 672 1292 676 3844 668 288 512 592 1852 668 1316 668 508 4294966784 620 192 640 1812 672 1292 956 508 3564 668 1324 908 1084 668 1284 892 3116 668 1808 668 1816 672 896 588 1856 672 292 908 1128 668 980 580 512 512 1696 672 1304 896 3060 672 1900 672 4800 668 1292 908 4116 672 1772 672 1376 668 1308 668 3816 672 280 1108 672 4294966780 624 4294966912 1648 736 892 3104 672 1864 672 3780 672 856 704 512 524 7692 668 1316 948 2672 668 1208 684 2608 672 556 912 508 3572 672 1304 668 512 4294966784 4294966892 620 992 508 1916 688 1088 668 1092 916 9060 672 1876 672 516 508 1748 668 512 1780 672 300 824 2232 672 244 512 596 1888 672 540 512 508 4294966784 4294966892 656 808 2076 672 1288 984

There are only a few numbers under 500, so I consider that noise There are a few very large values, => ignored too.

It looks like the basic bit width is around 512 micros()

I interpret the values between 512-700 as the times between 2 bytes. When the weather station has clocked out one byte they wait a little longer than one bit before sending the next byte.

Now the step is to write a sketch that accepts 8 bits clocked out to be samples every 512 micros() and that sketch needs to synchronize on the first LOW.

Rob

I would search the net for whatever brand/model of sensor you are using and "radio protocol" to see if some of the work has been done for you already. For example if you have a Oregon Scientific sensor theses articles describe the various protocols:

Decoding data of Oregon Scientific radio frequency sensors... http://alyer.frihost.net/thn128decoding.htm

Oregon Scientific RF Protocol Description http://wmrx00.sourceforge.net/Arduino/OregonScientific-RF-Protocols.pdf

If you are on Windows you might also find the entire Weather Station Data Logger project of Interest. The have written quite a bit of code for receiving signals from various sensors, which might be helpful to you to look at. http://wmrx00.sourceforge.net/

I spent some time working on the eavesdropping on the 433Mhz sensors, but the range never amounted to what I needed in my environment, so I went with a wired solution instead.

Hope it helps, willnue

i think the protocol is OOK

On
Off
and then some data

see if you can find an on and then off followed by data

hope this helps

willnue: Decoding data of Oregon Scientific radio frequency sensors... http://alyer.frihost.net/thn128decoding.htm

It's the best way to start. I wrote a decoder several months ago and used the wave like the one displayed in figure 1 to interpret 1's and 0's. Then I made a small change in temperature and looked at the wave again to guess where in the stream the data is stored. The protocol I decoded was totaly different from the one Oregon Scientific uses.

Until I saw that page, I wasted a lot of time trying to read the radio receiver and writing the state to serial.

There are lots of problems with decoding an unknown RF packet format if you want to recreate it over the air:

The things that you need to identify are:

carrier frequency modulation type deviation (if FM) baud rate manchester coding, whitening, bit-stuffing or other clock-recovery feature present. preamble and header, CRC algorithm

I'm wondering how you know your rx433 unit is actually picking up the correct signal and not some other 433MHz device?

That radio receiver has a variable gain feature which causes it to turn up the gain as the transmitter gets further and further away. If the transmitter gets "infinitely" far away, as in, is OFF, the gain goes to max and it interprets just about anything as a 0 or 1, hence it starts to generate random data, literally hallucinating.

There is virtually nothing you can about that. The transmitter program is probably sending an inital prefix code over and over a number of times, knowing that the first few times will get trashed, but eventually, the radio receiver will lower its gain (now that a real signal is coming in) and eventually it get the code. In other words, the transmitting program sends about 10 bytes of some known code, say "37" hex, doesn't much matter what, and the receiving program looks for a 37, ignores all incoming data until it gets a few 37's, then the next non-37 is the true first byte of the data. Other ways to do it, but that is the gist.

So, in your case, find some valid data and then look back at what proceeds it always, that is the radio "wakeup code".

Hope that helps, SS.

The best way to try and figure out what the data protocol is , is to look at the data stream in the Transmitter, ie before its transmitted. That way, all the noise and garbage data is removed and all you see is what the Sensor is sending. You can then look for data which is common, ie never changes, and data which changes when the Sensor is heated or cooled.