Interfacing NPK Sensor with Arduino

1,958 views

Introduction

Agriculture is the backbone of many economies, and the need for sustainable farming practices has never been greater. One critical aspect of sustainable farming is the efficient use of fertilizers. Nitrogen, Phosphorus, and Potassium (NPK) are the primary macronutrients needed for plant growth. Farmers need to monitor the NPK levels in their soil to determine the right amount and type of fertilizer to use. However, traditional soil testing methods are time-consuming and costly.

In this article, we will explore how to interface an NPK sensor with an Arduino microcontroller to provide a quick and cost-effective solution to measure NPK levels in the soil.

What is NPK Sensor?

NPK sensor is a type of sensor used in agriculture to measure the soil’s nutrient levels of Nitrogen (N), Phosphorous (P), and Potassium (K), which are essential for plant growth. The NPK sensor can detect the nutrient levels in the soil accurately and provide the necessary information for farmers to take appropriate actions. The NPK sensor can be interfaced with an Arduino board to automate the process of measuring nutrient levels and enable farmers to take timely decisions about fertilization and irrigation.

Hardware Components

To interface NPK Sensor with Arduino, you’ll need the following hardware components to get started:

ComponentsValueQty
Arduino UNO1
USB Cable Type A to B1
DC Power for Arduino1
NPK Soil Sensor1
RS485 to TTL Converter Module1
Jumper Wires1

NPK Sensor Pinout

npk-sensor-pinout
npk-sensor-pinout
Pin NamePin Description
VCCVCC is the VCC pin. Connects to 5V – 30V
AA is a differential signal that is connected to the A pin of the MAX485 Modbus Module
BB is another differential signal that is connected to the B pin of the MAX485 Modbus Module.
GNDGND is the Ground pin

NPK Sensor Arduino Circuit

Make connections according to the circuit diagram given below.

Wiring / Connections

ArduinoNPK Sensor RS485 Module
5VVCC
GNDGND
AA
BB
D2RO
D8RE
D7DE
D3DI

Installing Arduino IDE

First, you need to install Arduino IDE Software from its official website Arduino. Here is a simple step-by-step guide on “How to install Arduino IDE“.

Installing Libraries

Before you start uploading a code, download and unzip the following libraries at /Program Files(x86)/Arduino/Libraries (default), in order to use the sensor with the Arduino board. Here is a simple step-by-step guide on “How to Add Libraries in Arduino IDE“.

Code

Now copy the following code and upload it to Arduino IDE Software. The Arduino code below reads the NPK sensor data over RS485.

#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define RE 8
#define DE 7

//const byte code[]= {0x01, 0x03, 0x00, 0x1e, 0x00, 0x03, 0x65, 0xCD};
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);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
delay(500);
display.clearDisplay();
display.setCursor(25, 15);
display.setTextSize(1);
display.setTextColor(WHITE);
display.println(" NPK Sensor");
display.setCursor(25, 35);
display.setTextSize(1);
display.print("Initializing");
display.display();
delay(3000);
}

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


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");
delay(2000);

display.clearDisplay();


display.setTextSize(2);
display.setCursor(0, 5);
display.print("N: ");
display.print(val1);
display.setTextSize(1);
display.print(" mg/kg");

display.setTextSize(2);
display.setCursor(0, 25);
display.print("P: ");
display.print(val2);
display.setTextSize(1);
display.print(" mg/kg");

display.setTextSize(2);
display.setCursor(0, 45);
display.print("K: ");
display.print(val3);
display.setTextSize(1);
display.print(" mg/kg");

display.display();
}

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

Code Explanation

This Arduino code is used for interfacing an NPK (Nitrogen, Phosphorous, and Potassium) sensor with an Arduino board. The code includes various libraries such as SoftwareSerial, Wire, Adafruit_GFX, and Adafruit_SSD1306 to interface with the sensor and display the data on an OLED display.

The code defines the sensor pins and sends commands to the sensor to obtain values for Nitrogen, Phosphorous, and Potassium. It then prints these values to the serial monitor and displays them on the OLED display.

The setup function initializes the serial monitor and OLED display and displays an initialization message on the OLED display. The loop function obtains the sensor values, prints them to the serial monitor, clears the OLED display, and displays the values on the OLED display.

Overall, this code enables the user to obtain NPK sensor values and display them in an easily readable format.

Applications

Here are some applications of NPK Sensor:

  • Precision agriculture.
  • Soil analysis & fertility assessment.
  • Crop management.
  • Fertilizer optimization.
  • Research and development in agricultural technology.
  • Monitoring of plant nutrient levels.
  • Environmental monitoring of soil nutrient levels.
  • Horticulture and greenhouse management.
  • Livestock feed analysis.
  • Bioremediation.
  • Education and scientific studies.

Conclusion.

Interfacing an NPK sensor with an Arduino microcontroller can be an efficient and cost-effective solution for measuring NPK levels in the soil. By using this technology, farmers can obtain accurate and timely information about the nutrient status of their soil, enabling them to make informed decisions about fertilizer use.