Example Code for Arduino-Soil Temperature Humidity PH Monitoring

This project demonstrates how to use the RS485 Soil Sensor (Temperature&Humidity&PH) with Arduino UNO R3 to read and display real-time soil temperature, humidity, and pH values via the serial port. Users will learn RS485 ModBus-RTU communication integration and sensor data processing.

Hardware Preparation

Name Model/SKU Quantity Purchase Link
DFRduino UNO R3 DFR0009 1 DFRduino UNO R3
RS485 Shield for Arduino DFR0161 1 RS485 Shield for Arduino
RS485 Soil Sensor(Temperature&Humidity&PH) SEN0602 1 RS485 Soil Sensor

Software Preparation

Wiring Diagram

Arduino Wiring diagram

Other Preparation Work

  1. Switch the RS485 Shield's transceiver mode switch to AUTO
  2. Switch the RS485 Shield's run/compile switch to OFF before uploading code
  3. After code upload, switch run/compile switch to ON
  4. Set Arduino IDE serial monitor to 9600 baud rate

Sample Code

uint8_t Com[8] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09 };
float tem, hum, ph;
void setup() {
  Serial.begin(9600);  
}
void loop() {
  readHumiturePH();
  Serial.print("TEM = ");
  Serial.print(tem, 1);
  Serial.print(" °C  ");
  Serial.print("HUM = ");
  Serial.print(hum, 1);
  Serial.print(" %RH  ");
  Serial.print("PH = ");
  Serial.println(ph, 1);
  delay(1000);
}
void readHumiturePH(void) {
  uint8_t Data[13] = { 0 };
  uint8_t ch = 0;
  bool flag = 1;
  while (flag) {
    delay(100);
    Serial.write(Com, 8);
    delay(10);
    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])) {
                    hum = (Data[3] * 256 + Data[4]) / 10.00;
                    tem = (Data[5] * 256 + Data[6]) / 10.00;
                    ph = (Data[9] * 256 + Data[10]) /10.00;
                    flag = 0;
                  }
                }
              }
            }
          }
        }
      }
    }
    Serial.flush();
  }
}

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 (Serial.available()) {
      buffer[offset] = Serial.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

Insert the soil sensor into the soil, and the serial port prints out the temperature, humidity and PH values detected by the sensor.

Was this article helpful?

TOP