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

Arduino UNO Based Soil Nutrient and Moisture Analyzer with RS485 Communication

View and Edit Project In Cirkit DesignerImage of Arduino UNO Based Soil Nutrient and Moisture Analyzer with RS485 Communication

Circuit Documentation

Summary

The circuit in question is designed to monitor soil conditions using an Arduino UNO as the central processing unit. It interfaces with an NPK Soil Sensor and a Capacitive Soil Moisture Sensor V1.2 to measure the levels of Nitrogen, Phosphorus, and Potassium, as well as the moisture content of the soil. The data from the sensors is communicated to the Arduino UNO via an RS485 module for serial communication. The system is powered by a lipo battery with a capacity of 2200mAh at 30C.

Component List

Arduino UNO

NPK Soil Sensor

Lipo Battery 2200mAh 30C

RS485 Module

Capacitive Soil Moisture Sensor V1.2

Wiring Details

Arduino UNO

NPK Soil Sensor

Lipo Battery 2200mAh 30C

RS485 Module

Capacitive Soil Moisture Sensor V1.2

Documented Code

#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 = 0; i < 7; i++) {
      values[i] = mod.read();
      Serial.print(values[i], HEX);
    }
    Serial.println();
  }
  return values[4];
}

byte potassium() {
  digitalWrite(DE, HIGH);
  digitalWrite(RE, HIGH);
  delay(10);
  if (mod.write(pota, sizeof(pota)) == 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];
}

This code is responsible for initializing the serial communication, setting up the RS485 communication, and reading the values from the NPK Soil Sensor and the Capacitive Soil Moisture Sensor. It then prints these values to the Serial Monitor for analysis. The nitrogen(), phosphorous(), and potassium() functions handle the communication with the NPK Soil Sensor to retrieve the respective nutrient values. The moisture level is read directly from the analog pin A0 connected to the Capacitive Soil Moisture Sensor.