*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 2); // RX, TX
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
unsigned int Min_nitrogen = 10; // You Can Change the minimum Value of Nitrogen
unsigned int Min_phosphorus = 10; // You Can Change the minimum Value of phosphorus
unsigned int Min_potassium = 10; // You Can Change the minimum Value of potassium
unsigned int Min_soilPH = 4; // You Can Change the minimum Value of Soil PH
unsigned int Min_soilHumidity = 10; // You Can Change the minimum Value of Soil Humidity
unsigned int Min_soilConductivity = 10; // You Can Change the minimum Value of Soil Conductivity
unsigned int Min_Tem = 10; // You Can Change the minimum Value of Soil Conductivity
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int DE = 3;
int RE = 4;
int Buzzer = 12;
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
} // Clear the buffer
display.clearDisplay();
// Display sensor data on OLED
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.setCursor(2, 20);
display.print("Welcome");
display.display();
mySerial.begin(4800);
pinMode(Buzzer, OUTPUT);
digitalWrite(Buzzer, LOW);
pinMode(DE, OUTPUT);
pinMode(RE, OUTPUT);
digitalWrite(Buzzer, HIGH);
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
delay(1000);
digitalWrite(Buzzer, LOW);
}
void loop() {
byte queryData[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x07, 0x04, 0x08 };
byte receivedData[19];
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
mySerial.write(queryData, sizeof(queryData)); // send query data to NPK
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
delay(1000);
if ((mySerial.available() >= sizeof(receivedData))) { // Check if there are enough bytes available to read
mySerial.readBytes(receivedData, sizeof(receivedData)); // Read the received data into the receivedData array
// Parse and print the received data in decimal format
unsigned int soilHumidity = (receivedData[3] << 8) | receivedData[4];
unsigned int soilTemperature = (receivedData[5] << 8) | receivedData[6];
unsigned int soilConductivity = (receivedData[7] << 8) | receivedData[8];
unsigned int soilPH = (receivedData[9] << 8) | receivedData[10];
unsigned int nitrogen = (receivedData[11] << 8) | receivedData[12];
unsigned int phosphorus = (receivedData[13] << 8) | receivedData[14];
unsigned int potassium = (receivedData[15] << 8) | receivedData[16];
// Clear the display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Soil pH : "); // you an edit
display.println((float)soilPH / 10.0);
display.print("Humidi.: "); // you an edit
display.print((float)soilHumidity / 10.0);
display.println("%");
display.print("Temp : "); // you an edit
display.print((float)soilTemperature / 10.0);
display.println("C");
display.print("Conductivity: "); // you an edit
display.println(soilConductivity);
display.setCursor(0, 35);
display.print("Nitro. : "); // you an edit
display.print(nitrogen);
display.println("mg/Kg");
display.print("Phos.: "); // you an edit
display.print(phosphorus);
display.println("mg/Kg");
display.print("Pota. : "); // you an edit
display.print(potassium);
display.println("mg/Kg");
// Display the buffer
display.display();
buzzerX(nitrogen, phosphorus, potassium, soilHumidity, soilConductivity, soilPH, soilTemperature );
} else {
Display();
}
}
void Display() { // Clear the buffer
display.clearDisplay();
display.setTextSize(3);
display.setCursor(20, 20);
display.print("ERROR");
display.display();
}
void buzzerX(int nitrogen, int phosphorus, int potassium, int soilHumidity, int soilConductivity, int soilPH, int soilTemperature ) {
if (nitrogen < Min_nitrogen) {
digitalWrite(12, 0);
} else if (phosphorus < Min_phosphorus) {
delay(100);
digitalWrite(Buzzer, LOW);
} else if (potassium < Min_potassium) {
delay(100);
digitalWrite(Buzzer, LOW);
} else if ((soilHumidity / 10) < Min_soilHumidity) {
delay(100);
digitalWrite(Buzzer, LOW);
} else if ((soilConductivity / 10) < Min_soilConductivity) {
delay(100);
digitalWrite(Buzzer, LOW);
} else if ((soilPH / 10) < Min_soilPH) {
delay(100);
digitalWrite(Buzzer, LOW);
} else if ((soilTemperature / 10) < Min_Tem) {
delay(100);
digitalWrite(Buzzer, LOW);
} else {
delay(100);
digitalWrite(Buzzer, HIGH);
}
delay(100);
}