Example Code for Arduino-Blue Green Algae and Temperature Monitoring

This project demonstrates how to connect the RS485 Blue Green Algae Sensor to an Arduino development board, read real-time blue green algae concentration and temperature data using the ModBus-RTU protocol, and set up a real-time monitoring environment. Users will learn RS485 communication basics, ModBus-RTU protocol application, and how to process sensor data for accurate readings.

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.

Other Preparation Work

  • Confirm the sensor's default device address (0x01) and baud rate (4800bit/s) match the settings in the sample code
  • Ensure RS485 A/B lines are connected correctly (A to A, B to B) between the adapter module and the sensor
  • Remove the black rubber protective cover from the sensor before measurement
  • The sensor is factory-calibrated and ready to use; no initial calibration is required

Sample Code

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);  //TX,RX
uint8_t Com[8] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x03, 0x05, 0xCb };

void setup() {
  Serial.begin(9600);
  mySerial.begin(4800);
}
void loop() {
  Cyanobacteria_TEM();
  delay(1000);
}

void Cyanobacteria_TEM(void) {
  float tem;
  uint32_t val = 0;
  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 == 0x06) {
                Data[2] = ch;
                if (readN(&Data[3], 8) == 8) {
                  if (CRC16_2(Data, 9) == (Data[9] * 256 + Data[10])) {
                    val = Data[3];
                    val = (val << 8) | Data[4];
                    val = (val << 8) | Data[5];
                    val = (val << 8) | Data[6];
                    float *chi = (float *)&val;
                    Serial.print("Cyanobacteria = ");
                    Serial.print(*chi);
                    Serial.print(" cells/ml ");
                    tem = (Data[7] * 256 + Data[8]) / 10.0;
                    Serial.print(" Temperature = ");
                    Serial.print(tem, 1);
                    Serial.println("°C ");
                    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 Blue Green Algae value, temperature data collected by the sensor.

Was this article helpful?

TOP