Example Code for Arduino-PH and Temperature Monitoring

This project demonstrates how to connect the RS485 Water Quality pH Sensor to an Arduino development board, set up a testing environment, and realize real-time monitoring of pH and temperature data. You will learn how to communicate with the sensor using the Modbus-RTU protocol via RS485, read measurement data, and display it on the serial monitor.

Hardware Preparation

Software Preparation

  • Arduino IDE: No additional libraries are required for this sample code.

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.

Connection Diagram

Other Preparation Work

  1. Ensure the sensor is installed correctly according to the Installation Methods in the Getting Started section.
  2. Confirm the sensor's default communication parameters: address 0x01, baud rate 4800bit/s, 8 data bits, no parity, 1 stop bit, CRC error checking.
  3. Connect the RS485 to UART module to the Arduino correctly: TX of module to pin 3 of Arduino, RX of module to pin 2 of Arduino, VCC and GND as per power requirements.

Sample Code

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

void setup() {
  Serial.begin(9600);
  mySerial.begin(4800);
}
void loop() {
  PH_Temperature();
  Serial.print("PH = ");
  Serial.print(ph,2);
  Serial.print("  ");
  Serial.print(" Temperature = ");
  Serial.print(tem, 1);
  Serial.println("°C");
  delay(1000);
}

void PH_Temperature(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])) {
                    ph = (Data[3] * 256 + Data[4]) / 100.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 pH and temperature data collected by the sensor.

Was this article helpful?

TOP