Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino UNO-Based Soil Monitoring System with RS485 and Capacitive Moisture Sensor

View and Edit Project In Cirkit DesignerImage of Arduino UNO-Based Soil Monitoring System with RS485 and Capacitive Moisture Sensor

Circuit Documentation

Summary

This circuit is designed to read values from an NPK Soil Sensor using RS485 communication and a Capacitive Soil Moisture Sensor. The sensor values for Nitrogen, Phosphorous, and Potassium are read and printed to the Serial Monitor. The RS485 module is connected to the Arduino UNO. The moisture value is read from the Capacitive Soil Moisture Sensor and printed to the Serial Monitor. Additionally, an LCD Display is used to show the sensor readings, and a potentiometer is used to adjust the contrast of the LCD Display.

Component List

  1. Arduino UNO

    • Description: Microcontroller board based on the ATmega328P.
    • Pins: UNUSED, IOREF, Reset, 3.3V, 5V, GND, Vin, A0, A1, A2, A3, A4, A5, SCL, SDA, AREF, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0
  2. NPK Soil Sensor

    • Description: Sensor to measure Nitrogen, Phosphorous, and Potassium levels in soil.
    • Pins: VCC, GND, A, B
  3. Lipo Battery 2200mAH 30c

    • Description: Rechargeable lithium polymer battery.
    • Pins: VCC, GND
  4. RS485

    • Description: Module for RS485 communication.
    • Pins: VCC, RO, RE, GND, B, A, DE, DI
  5. Capacitive Soil Moisture Sensor V1.2

    • Description: Sensor to measure soil moisture levels.
    • Pins: GND, VCC, AOUT
  6. PH Meter

    • Description: Sensor to measure pH levels in soil.
    • Pins: Signal, VCC, GND
  7. LCD Display (16 pin)

    • Description: 16x2 character LCD display.
    • Pins: VSS, VDD, VO, RS, R_W, E, DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7, A, K
  8. Potentiometer

    • Description: Variable resistor used to adjust the contrast of the LCD display.
    • Pins: GND, Output, VCC

Wiring Details

Arduino UNO

NPK Soil Sensor

RS485

Capacitive Soil Moisture Sensor V1.2

PH Meter

LCD Display (16 pin)

Potentiometer

Code Documentation

#include "SoftwareSerial.h"
#include "Wire.h"

/*
 * This Arduino Sketch reads values from an NPK Soil Sensor using RS485
 * communication and a Capacitive Soil Moisture Sensor. The sensor values for
 * Nitrogen, Phosphorous, and Potassium are read and printed to the Serial
 * Monitor. The RS485 module is connected to the Arduino UNO. The moisture
 * value is read from the Capacitive Soil Moisture Sensor and printed to the
 * Serial Monitor.
 */

#define RE 8
#define DE 7
#define MOISTURE_PIN A0

const byte nitro[] = {0x01, 0x03, 0x00, 0x1e, 0x00, 0x01, 0xe4, 0x0c};
const byte phos[] = {0x01, 0x03, 0x00, 0x1f, 0x00, 0x01, 0xb5, 0xcc};
const byte pota[] = {0x01, 0x03, 0x00, 0x20, 0x00, 0x01, 0x85, 0xc0};

byte values[11];
SoftwareSerial mod(2, 3);

void setup() {
  Serial.begin(9600);
  mod.begin(9600);
  pinMode(RE, OUTPUT);
  pinMode(DE, OUTPUT);
  delay(500);
}

void loop() {
  byte val1, val2, val3;
  val1 = nitrogen();
  delay(250);
  val2 = phosphorous();
  delay(250);
  val3 = potassium();
  delay(250);
  int moisture = analogRead(MOISTURE_PIN);

  Serial.print("Nitrogen: ");
  Serial.print(val1);
  Serial.println(" mg/kg");
  Serial.print("Phosphorous: ");
  Serial.print(val2);
  Serial.println(" mg/kg");
  Serial.print("Potassium: ");
  Serial.print(val3);
  Serial.println(" mg/kg");
  Serial.print("Moisture: ");
  Serial.println(moisture);
  delay(2000);
}

byte nitrogen() {
  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  if (mod.write(nitro, sizeof(nitro)) == 8) {
    digitalWrite(DE, LOW);
    digitalWrite(RE, LOW);
    for (byte i = 0; i < 7; i++) {
      values[i] = mod.read();
      Serial.print(values[i], HEX);
    }
    Serial.println();
  }
  return values[4];
}

byte phosphorous() {
  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  if (mod.write(phos, sizeof(phos)) == 8) {
    digitalWrite(DE, LOW);
    digitalWrite(RE, LOW);
    for (byte i