Weather station serial data

Hi Forum,
I've been playing around with Arduino s for a few years but never got into the data "management" of this wonderful little MC.
I recently got a weather station which communicates via RS485. Currently there is no software to extract all the information. I have tried various of ways to extract the info but with no luck. As far as I understand, the serial data is 34 bytes send every 16 seconds, each representing two hex numbers that must be extracted for further calculations.
My problem is that the bytes printed as BIN to the serial monitor are not all eight bits.
Below is a link to the communications protocol as well as a user manual.

My code:

uint8_t dataArray[17];
int charArray[17];
String Main;
int bytes;

void setup(){
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop(){
  data1(); 
}

void data1(){
  while(Serial.available()>0){
   delay(1000);
   if (Serial.available()>0) {
     for(int i=0; i < 17; i++){
      bytes=Serial.read();
       dataArray[i]=bytes;
       //charArray[i]=char(dataArray[i]);
       //if(sizeof(charArray[i])<2){
       // charArray[i]="0"+charArray[i];
       Serial.println(bytes,BIN);
       }
       //Serial.print(" ");
     }
     Serial.println("--Finished--");
   }

My serial output:

21:24:02.653 -> 100100
21:24:02.687 -> 11110100
21:24:02.687 -> 11100
21:24:02.687 -> 11100010
21:24:02.721 -> 1010100
21:24:02.721 -> 1000011
21:24:02.721 -> 0
21:24:02.721 -> 0
21:24:02.721 -> 0
21:24:02.721 -> 10000110
21:24:02.755 -> 0
21:24:02.755 -> 0
21:24:02.755 -> 0
21:24:02.755 -> 0
21:24:02.755 -> 0
21:24:02.755 -> 11111011
21:24:02.755 -> 101110
21:24:02.789 -> --Finished--

Please help

1 Like

The protocol is 17 bytes

Can you explain why that's a problem?
Why binary?

Don't worry! Serial.print() always suppresses leading zeroes. Any leading digits that aren't shown are zeroes.

Just pretend the output looks like this:

21:24:02.653 -> 00100100
21:24:02.687 -> 11110100
21:24:02.687 -> 00011100
21:24:02.687 -> 11100010
21:24:02.721 -> 01010100
21:24:02.721 -> 01000011
21:24:02.721 -> 00000000
21:24:02.721 -> 00000000
21:24:02.721 -> 00000000
21:24:02.721 -> 10000110
21:24:02.755 -> 00000000
21:24:02.755 -> 00000000
21:24:02.755 -> 00000000
21:24:02.755 -> 00000000
21:24:02.755 -> 00000000
21:24:02.755 -> 11111011
21:24:02.755 -> 00101110
21:24:02.789 -> --Finished--
2 Likes

Serial skips leading zeroes?

According to the manual, the 17 bytes each represent two hex numbers. These numbers will be read into a string of character with the following format:
24 0D 14 62 A4 38 22 05 00 1C 00 03 00 15 18 FF F9
If all the bits are not in, the conversion to hex ends up with alot of FF.

What hardware are you using to convert the RS485 protocol that can be used by the Arduino

When printing using the BIN specifier leading zeros are not printed.

I am using a TTL to RS485 converter,

The bits are in, they're just zero.
I don't know what "alot of FF" means.

Even then, if I save the BIN into a int Array and serial print the array elements, they are not printed as two hex symbols/characters, but as FF, which tells me that the leading 0 are not saved in the array

That is not a conclusion I would come to.
If it helps, HEX doesn't print leading zeroes either.
(But it's a lot easier to add them than for BIN, if that's what you want)

But when I convert these bytes to Hex, the format comes out all wrong. I tracked it down to the missing bits being the culprits. The rest of the code I took out as I do not think the problem is there, but I will run the whole code and post the print out.

The bits are not missing, they're simply not significant.

This is the code for the printout in Hex:

int8_t dataArray[17];
int charArray[17];
String dataStr[17];
String Main;
int bytes;

void setup() {
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
    data1();  
   
}

void data1(){
  while(Serial.available()>0){
     delay(1000);
   if (Serial.available()>=17) {
     for(int i=0; i < 17; i++){
      dataArray[i]=Serial.read();
      charArray[i]=dataArray[i];
      dataStr[i]=String(charArray[i],HEX);
      
     }
      
       Serial.flush();
       //Serial.println(bytes,HEX);
       //Serial.print(" ");
   }
   
   String dataStr0=String(charArray[0],HEX); 
   String dataStr1=String(charArray[1],HEX); 
   String dataStr2=String(charArray[2],HEX);
   String dataStr3=String(charArray[3],HEX);
   String dataStr4=String(charArray[4],HEX);
   String dataStr5=String(charArray[5],HEX); 
   String dataStr6=String(charArray[6],HEX);
   String dataStr7=String(charArray[7],HEX);
   String dataStr8=String(charArray[8],HEX);
   String dataStr9=String(charArray[9],HEX); 
   String dataStr10=String(charArray[10],HEX);
   String dataStr11=String(charArray[11],HEX);
   String dataStr12=String(charArray[12],HEX);
   String dataStr13=String(charArray[13],HEX); 
   String dataStr14=String(charArray[14],HEX);
   String dataStr15=String(charArray[15],HEX);
   String dataStr16=String(charArray[16],HEX);
   Main=dataStr[0]+dataStr[1]+dataStr[2]+dataStr[3]+dataStr[4]+dataStr[5]+dataStr[6]+dataStr[7]+dataStr[8]+dataStr[9]+dataStr[10]+dataStr[11]+dataStr[12]+dataStr[13]+dataStr[14]+dataStr[15]+dataStr[16];
   Serial.println("Done");
   Serial.print("--Main String--");Serial.println(Main); 
    Serial.print("Data1-");Serial.println(charArray[0],HEX);Serial.print("Data2-");Serial.println(charArray[1],HEX);
    Serial.print("Data3-");Serial.println(charArray[2],HEX);Serial.print("Data4-");Serial.println(charArray[3],HEX);
    Serial.print("Data5-");Serial.println(charArray[4],HEX);Serial.print("Data6-");Serial.println(charArray[5],HEX);
    Serial.print("Data7-");Serial.println(charArray[6],HEX);Serial.print("Data8-");Serial.println(charArray[7],HEX);
    Serial.print("Data9-");Serial.println(charArray[8],HEX);Serial.print("Data10-");Serial.println(charArray[9],HEX);
    Serial.print("Data11-");Serial.println(charArray[10],HEX);Serial.print("Data12-");Serial.println(charArray[11],HEX);
    Serial.print("Data13-");Serial.println(charArray[12],HEX);Serial.print("Data14-");Serial.println(charArray[13],HEX);
    Serial.print("Data15-");Serial.println(charArray[14],HEX);Serial.print("Data16-");Serial.println(charArray[15],HEX);
    Serial.print("Data17-");Serial.println(charArray[16],HEX);
    wind_dir();
    wind_spd();
    wind_gust();
    temp();
    hum();
    rainfall();
    UV();
    light();
}
}

void wind_dir(){
  int spacePosition1 = 4;
  int spacePosition2 = 5;
  int spacePosition3 = 6;
  char Anum;
  char Bnum;
  char Cnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  Cnum=Main.charAt(spacePosition3);
  Serial.print("--W/Dir--");
  Serial.print(Anum);Serial.print(Bnum);Serial.println(Cnum);
}


void wind_spd(){
  int spacePosition1 = 12;
  int spacePosition2 = 13;
  //int spacePosition3 = 6;
  char Anum;
  char Bnum;
  //char Cnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  //Cnum=Main.charAt(spacePosition3);
  Serial.print("--W/speed--");
  Serial.print(Anum);Serial.println(Bnum); 
}
void wind_gust(){
  int spacePosition1 = 14;
  int spacePosition2 = 15;
  //int spacePosition3 = 6;
  char Anum;
  char Bnum;
  //char Cnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  //Cnum=Main.charAt(spacePosition3);
  Serial.print("--W/Gust--");
  Serial.print(Anum);Serial.println(Bnum);
}
void hum(){
  int spacePosition1 = 10;
  int spacePosition2 = 11;
  char Anum;
  char Bnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  Serial.print("--Humidity--");
  Serial.print(Anum);Serial.println(Bnum); 
}
void temp(){
  int spacePosition1 = 7;
  int spacePosition2 = 8;
  int spacePosition3 = 9;
  char Anum;
  char Bnum;
  char Cnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  Cnum=Main.charAt(spacePosition3);
  Serial.print("--Temp--");
  Serial.print(Anum);Serial.print(Bnum);Serial.println(Cnum);
}
void rainfall(){
  int spacePosition1 = 16;
  int spacePosition2 = 17;
  int spacePosition3 = 18;
  int spacePosition4 = 19;
  char Anum;
  char Bnum;
  char Cnum;
  char Dnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  Cnum=Main.charAt(spacePosition3);
  Dnum=Main.charAt(spacePosition4);
  Serial.print("--Rainfall--");
  Serial.print(Anum);Serial.print(Bnum);Serial.print(Cnum);Serial.println(Dnum);
}
void UV(){
  int spacePosition1 = 16;
  int spacePosition2 = 17;
  int spacePosition3 = 18;
  int spacePosition4 = 19;
  char Anum;
  char Bnum;
  char Cnum;
  char Dnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  Cnum=Main.charAt(spacePosition3);
  Dnum=Main.charAt(spacePosition4);
  Serial.print("--UV--");
  Serial.print(Anum);Serial.print(Bnum);Serial.print(Cnum);Serial.println(Dnum);
}
void light(){
  int spacePosition1 = 24;
  int spacePosition2 = 25;
  int spacePosition3 = 26;
  int spacePosition4 = 27;
  int spacePosition5 = 28;
  int spacePosition6 = 29;
  char Anum;
  char Bnum;
  char Cnum;
  char Dnum;
  char Enum;
  char Fnum;
  Anum=Main.charAt(spacePosition1);
  Bnum=Main.charAt(spacePosition2);
  Cnum=Main.charAt(spacePosition3);
  Dnum=Main.charAt(spacePosition4);
  Enum=Main.charAt(spacePosition5);
  Fnum=Main.charAt(spacePosition6);
  Serial.print("--Light--");
  Serial.print(Anum);Serial.print(Bnum);Serial.print(Cnum);Serial.print(Dnum);Serial.print(Enum);Serial.println(Fnum);
}

The serial output:

00:15:31.180 -> --Main String--24fff4ffd8623d49000ff8600000ff86ffe4
00:15:31.247 -> Data1-24
00:15:31.247 -> Data2-FFFFFFF4
00:15:31.247 -> Data3-FFFFFFD8
00:15:31.281 -> Data4-62
00:15:31.281 -> Data5-3D
00:15:31.315 -> Data6-49
00:15:31.315 -> Data7-0
00:15:31.315 -> Data8-0
00:15:31.315 -> Data9-0
00:15:31.349 -> Data10-FFFFFF86
00:15:31.349 -> Data11-0
00:15:31.383 -> Data12-0
00:15:31.383 -> Data13-0
00:15:31.383 -> Data14-0
00:15:31.383 -> Data15-0
00:15:31.417 -> Data16-FFFFFF86
00:15:31.417 -> Data17-FFFFFFE4
00:15:31.451 -> --W/Dir--f4f
00:15:31.451 -> --W/speed--3d
00:15:31.485 -> --W/Gust--49
00:15:31.485 -> --Temp--fd8
00:15:31.485 -> --Humidity--62
00:15:31.519 -> --Rainfall--000f
00:15:31.553 -> --UV--000f
00:15:31.553 -> --Light--0000ff

0010 0100 = 0x24 = TX type
1111 0100 = 0xF4 'security code?'
0001 1100 1110 = 0x1CE = 16+12 = 28° wind direction
0010 0101 0100 = 0x254 = (596 - 400)/ 10 = 19.6°C
0100 0011 = 0x43 = 67% humidity
0000 0000  = 0x00 = 0 / 8 * 1.12 = 0 wind speed
0000 0000  = 0x00 = 0 * 1.12 = 0 gust speed
0000 0000 1000 0110 = 0x0086 = 134 * 0.3 = 40.2 mm rainfall
0000 0000 0000 0000 = 0x00 = 0 UV Index
0000 0000 0000 0000 0000 0000 = 0x0000 /10 = 0 LUX
1111 1011 = 0xFB Checksum type?
0010 1110 = 0x2E checksum

If I do a port reading in Hex using Realterm I get the correct format and "hex characters"

Try casting them to an unsigned type when printing, and the leading Fs disappear.

What is this supposed to be doing? Why wait for a second?
As soon a something is available, you assume there are 16 bytes available. There may be only 12 or 13 actually in the buffer.
Why not just read available bytes until you fill your 17 byte buffer and then continue?
Paul

To make sure the whole message has been buffered :roll_eyes:

The data are send through every 16 seconds. I added the delay to make sure that all bytes are in before I start with the reading