Arduino UNO-Based Soil Nutrient and Moisture Monitoring System with RS485 Communication
View and Edit Project In Cirkit Designer
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.
Component List
Arduino UNO
- Description: A 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
NPK Soil Sensor
- Description: A sensor used to measure the Nitrogen, Phosphorous, and Potassium levels in the soil.
- Pins: VCC, GND, A, B
Lipo Battery 2200mAH 30c
- Description: A rechargeable lithium polymer battery.
- Pins: VCC, GND
RS485
- Description: A module used for RS485 communication.
- Pins: VCC, RO, RE, GND, B, A, DE, DI
Capacitive Soil Moisture Sensor V1.2
- Description: A sensor used to measure soil moisture levels.
- Pins: GND, VCC, AOUT
LDR
- Description: A light-dependent resistor used to measure light intensity.
- Pins: A0, D0, GND, VCC
Wiring Details
Arduino UNO
GND is connected to:
- RS485 GND
- Capacitive Soil Moisture Sensor V1.2 GND
5V is connected to:
- RS485 VCC
- Capacitive Soil Moisture Sensor V1.2 VCC
A0 is connected to:
- Capacitive Soil Moisture Sensor V1.2 AOUT
D8 is connected to:
- RS485 RE
D7 is connected to:
- RS485 DE
D3 is connected to:
- RS485 DI
D2 is connected to:
- RS485 RO
NPK Soil Sensor
VCC is connected to:
- Lipo Battery 2200mAH 30c VCC
GND is connected to:
- Lipo Battery 2200mAH 30c GND
A is connected to:
- RS485 A
B is connected to:
- RS485 B
Lipo Battery 2200mAH 30c
VCC is connected to:
- NPK Soil Sensor VCC
GND is connected to:
- NPK Soil Sensor GND
RS485
GND is connected to:
- Arduino UNO GND
VCC is connected to:
- Arduino UNO 5V
RE is connected to:
- Arduino UNO D8
DE is connected to:
- Arduino UNO D7
DI is connected to:
- Arduino UNO D3
RO is connected to:
- Arduino UNO D2
A is connected to:
- NPK Soil Sensor A
B is connected to:
- NPK Soil Sensor B
Capacitive Soil Moisture Sensor V1.2
GND is connected to:
- Arduino UNO GND
VCC is connected to:
- Arduino UNO 5V
AOUT is connected to:
- Arduino UNO A0
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 = 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 initializes the Arduino UNO to read values from the NPK Soil Sensor and the Capacitive Soil Moisture Sensor. The values are then printed to the Serial Monitor. The RS485 module is used for communication with the NPK Soil Sensor, and the Capacitive Soil Moisture Sensor is read using an analog pin.