Troubleshooting

SEN0657 code sample is broken- here is a fixed version

userHead lakid 2025-09-25 18:47:42 123 Views1 Replies

The sample code provided does not compile with latest Arduino. It's got functions that are declared void returning a value. Secondly, the functions to read light, pressure and the wind speed/direction reference array elements beyond the declared size, which results in an ESP32 Stack Smash reboot. 

Code below works, but have not tested for accuracy . 

 

 

#include <SoftwareSerial.h>

SoftwareSerial mySerial(12, 13); //TX,RX

uint8_t Com[8] = { 0x01, 0x03, 0x01, 0xF4, 0x00, 0x04, 0x04, 0x07 }; //Wind speed and direction

uint8_t Com1[8] = { 0x01, 0x03, 0x01, 0xF8, 0x00, 0x02, 0x44, 0x06 }; //Temperature and humidity

uint8_t Com2[8] = { 0x01, 0x03, 0x01, 0xFD, 0x00, 0x03, 0x95, 0xC7 }; //Atmospheric pressure, light

uint8_t Com3[8] = { 0x01, 0x03, 0x02, 0x01, 0x00, 0x01, 0xD4, 0x72 }; //Rainfall

float tem, hum, ws, ap, Rain;

int wd, wdangle, lux, dummy;


 

void setup() {

Serial.begin(115200);

mySerial.begin(4800);

}

void loop() {

dummy=readhumiture();

Serial.print("TEM = ");

Serial.print(tem, 1);

Serial.print("°C ");

Serial.print("HUM = ");

Serial.print(hum, 1);

Serial.print("%RH ");

Serial.flush();


 

dummy=readAtmosphericPressure_Light();

Serial.print("AP = ");

Serial.print(ap, 1);

Serial.print("Kpa ");

Serial.print("Lux = ");

Serial.print(lux);

Serial.print("(lux) ");

Serial.flush();


 

Rain = readRainfall();

Serial.print("Rain = ");

Serial.print(Rain, 1);

Serial.println("mm ");

Serial.flush();


 

dummy = readWindSpeed_WindDirection();

Serial.print("Wind Speed = ");

Serial.print(ws, 1);

Serial.print("m/s ");

Serial.print("Wind Direction = ");

Serial.print(wd);

Serial.print(" WindDirection_Angle = ");

Serial.print(wdangle);

Serial.println("° ");

Serial.println(" ");

Serial.flush();

delay(2000);

}


 

int readWindSpeed_WindDirection(void) {

uint8_t Data[13] = { 0 };

uint8_t ch = 0;

bool flag = 1;

long timeStart = millis();

long timeStart1 = 0;

while (flag) {


 

if ((millis() - timeStart1) > 100) {

while (mySerial.available() > 0) {

mySerial.read();

}

mySerial.write(Com, 8);

timeStart1 = millis();

}


 

if ((millis() - timeStart) > 1000) {

Serial.println("Time out");

return -1;

}


 

if (readN(&ch, 1) == 1) {

if (ch == 0x01) {

Data[0] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x03) {

Data[1] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x08) {

Data[2] = ch;

if (readN(&Data[3], 10) == 10) {

if (CRC16_2(Data, 11) == (Data[11] * 256 + Data[12])) {

ws = (Data[3] * 256 + Data[4]) / 100.00;

wd = Data[7] * 256 + Data[8];

wdangle = Data[9] * 256 + Data[10];

flag = 0;

}

}

}

}

}

}

}

}

}

return 1;

}



 

int readhumiture(void) {

uint8_t Data[10] = { 0 };

uint8_t ch = 0;

bool flag = 1;

long timeStart = millis();

long timeStart1 = 0;

while (flag) {


 

if ((millis() - timeStart1) > 100) {

while (mySerial.available() > 0) {

mySerial.read();

}

mySerial.write(Com1, 8);

timeStart1 = millis();

}


 

if ((millis() - timeStart) > 1000) {

Serial.println("Time out1");

return -1;

}


 

if (readN(&ch, 1) == 1) {

if (ch == 0x01) {

Data[0] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x03) {

Data[1] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x04) {

Data[2] = ch;

if (readN(&Data[3], 6) == 6) {

if (CRC16_2(Data, 7) == (Data[7] * 256 + Data[8])) {

hum = (Data[3] * 256 + Data[4]) / 10.00;

tem = (Data[5] * 256 + Data[6]) / 10.00;

flag = 0;

}

}

}

}

}

}

}

}

}

return 1;

}



 

int readAtmosphericPressure_Light(void) {

uint8_t Data[11] = { 0 };

uint8_t ch = 0;

long timeStart = millis();

long timeStart1 = 0;

bool flag = 1;

while (flag) {


 

if ((millis() - timeStart1) > 100) {

while (mySerial.available() > 0) {

mySerial.read();

}

mySerial.write(Com2, 8);

timeStart1 = millis();

}



 

if ((millis() - timeStart) > 1000) {

Serial.println("Time out2");

return -1;

}


 

if (readN(&ch, 1) == 1) {

if (ch == 0x01) {

Data[0] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x03) {

Data[1] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x06) {

Data[2] = ch;

if (readN(&Data[3], 8) == 8) {

if (CRC16_2(Data, 9) == (Data[9] * 256 + Data[10])) {

ap = (Data[3] * 256 + Data[4]) / 10.00;

lux = Data[5] << 24 | Data[6] << 16 | Data[7] << 8 | Data[8];

flag = 0;

}

}

}

}

}

}

}

}

}

return 1;

}


 

float readRainfall(void) {

uint8_t Data[10] = { 0 };

uint8_t ch = 0;

long timeStart = millis();

long timeStart1 = 0;

bool flag = 1;

float data;

while (flag) {


 

if ((millis() - timeStart1) > 100) {

while (mySerial.available() > 0) {

mySerial.read();

}

mySerial.write(Com3, 8);

timeStart1 = millis();

}



 

if ((millis() - timeStart) > 1000) {

Serial.println("Time out3");

return -1;

}


 

if (readN(&ch, 1) == 1) {

if (ch == 0x01) {

Data[0] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x03) {

Data[1] = ch;

if (readN(&ch, 1) == 1) {

if (ch == 0x02) {

Data[2] = ch;

if (readN(&Data[3], 4) == 4) {

if (CRC16_2(Data, 5) == (Data[5] * 256 + Data[6])) {

data = (Data[3] * 256 + Data[4]) / 10.00;

flag = 0;

}

}

}

}

}

}

}

}

}

return data;

}




 

uint8_t readN(uint8_t *buf, size_t len) {

size_t offset = 0, left = len;

int16_t Tineout = 500;

uint8_t *buffer = buf;

long curr = millis();

while (left) {

if (mySerial.available()) {

buffer[offset] = mySerial.read();

offset++;

left--;

}

if (millis() - curr > Tineout) {

break;

}

}

return offset;

}


 

unsigned int CRC16_2(unsigned char *buf, int len) {

unsigned int crc = 0xFFFF;

for (int pos = 0; pos < len; pos++) {

crc ^= (unsigned int)buf[pos];

for (int i = 8; i != 0; i--) {

if ((crc & 0x0001) != 0) {

crc >>= 1;

crc ^= 0xA001;

} else {

crc >>= 1;

}

}

}


 

crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);

return crc;

}

 

2025-09-26 02:45:24

Thanks for sharing.

userHeadPic ahsrab.rifat