Example Code for Arduino-Turbidity and Temperature Monitoring

Tutorials are provided for connecting the sensor to an Arduino development board and DFRobot LoRaWAN, allowing for quick setup of a test environment and real-time data monitoring.

Hardware Preparation

Software Preparation

Wiring Diagram

If the power of the RS485 device is small and the required current is less than 12V-160mA, the RS485 to UART signal conversion module does not require a 12V external power supply, making wiring more convenient.

Sensor RS485 to UART Module
Brown wire 12V
Black wire GND
Yellow wire A
Blue wire B
RS485 to UART Module Arduino UNO
Red wire(+) 5V
Black wire(-) GND
Blue wire (RX) D2
Green wire (TX) D3

Other Preparation Work

Ensure the sensor is properly installed according to the installation methods, and the RS485 wiring is correct (A and B lines not reversed). Remove the black rubber protective cover from the sensor before use.

Sample Code

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);                                        //TX,RX
uint8_t Com[8] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B };  //Turbidity, Temperature
float ntu, tem;

void setup() {
  Serial.begin(9600);
  mySerial.begin(4800);
}
void loop() {
  Turbidity();
  Serial.print("Turbidity = ");
  Serial.print(ntu, 1);
  Serial.print(" NTU  ");
  Serial.print(" Temperature = ");
  Serial.print(tem, 1);
  Serial.println("°C");
  delay(1000);
}

void Turbidity(void) {
  uint8_t Data[12] = { 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 == 0x04) {
                Data[2] = ch;
                if (readN(&Data[3], 6) == 6) {
                  if (CRC16_2(Data, 7) == (Data[7] * 256 + Data[8])) {
                    ntu = (Data[3] * 256 + Data[4]) / 10.0;
                    tem = (Data[5] * 256 + Data[6]) / 10.0;
                    flag = 0;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

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;
}

Result

The serial monitor displays the Turbidity value, temperature data collected by the sensor.

Additional Information

  • The sensor includes automatic temperature compensation to ensure accurate readings under varying environmental conditions.
  • For long-term use, you can re-calibrate the sensor using the provided calibration solution and ModBus register settings (refer to the Communication Protocol section for details).
  • The sensor's IP68 waterproof rating allows it to be submerged in water for extended periods, suitable for various aquatic monitoring applications.

Was this article helpful?

TOP