#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BLYNK_TEMPLATE_ID "TMPL3QJQivVfd"
#define BLYNK_TEMPLATE_NAME "soil nutrition"
#define BLYNK_AUTH_TOKEN "8iOetXtUc-o9pArkfeM0FSC6W2ewjBoV"
#define SOIL_MOISTURE_PIN 32
#define TEMPERATURE_PIN 34
#define HUMIDITY_PIN 35
#define NITROGEN_PIN 33
#define PHOSPHORUS_PIN 36
#define POTASSIUM_PIN 39
#define WATER_PUMP_LED 12
#define BUZZER_LED 13

LiquidCrystal_I2C LCD(0x27, 16, 2);

const int moistThreshold = 60;

void setup() {
  Serial.begin(115200);
  pinMode(WATER_PUMP_LED, OUTPUT);
  pinMode(BUZZER_LED, OUTPUT);
  LCD.init();
  LCD.backlight();
}

void loop() {
  int soilMoistureValue = analogRead(SOIL_MOISTURE_PIN);
  int temperatureValue = analogRead(TEMPERATURE_PIN);
  int humidityValue = analogRead(HUMIDITY_PIN);
  int nitrogenValue = analogRead(NITROGEN_PIN);
  int phosphorusValue = analogRead(PHOSPHORUS_PIN);
  int potassiumValue = analogRead(POTASSIUM_PIN);

  float soilMoisture = map(soilMoistureValue, 0, 4095, 0, 100);  // Simulated soil moisture
  float temperature = map(temperatureValue, 0, 4095, -10, 50);   // Simulated temperature
  float humidity = map(humidityValue, 0, 4095, 0, 100);          // Simulated humidity
  float nitrogen = map(nitrogenValue, 0, 4095, 0, 100);          // Simulated nitrogen
  float phosphorus = map(phosphorusValue, 0, 4095, 0, 100);      // Simulated phosphorus
  float potassium = map(potassiumValue, 0, 4095, 0, 100);        // Simulated potassium

  // Display values on LCD
  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.print("Moist: ");
  LCD.print(soilMoisture);
  LCD.print("%");

  LCD.setCursor(0, 1);
  LCD.print("Temp: ");
  LCD.print(temperature);
  LCD.print("C");

  delay(2000);  // Display for 2 seconds

  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.print("Hum: ");
  LCD.print(humidity);
  LCD.print("%");

  LCD.setCursor(0, 1);
  LCD.print("N: ");
  LCD.print(nitrogen);
  LCD.print("%");

  delay(2000);  // Display for 2 seconds

  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.print("P: ");
  LCD.print(phosphorus);
  LCD.print("%");

  LCD.setCursor(0, 1);
  LCD.print("K: ");
  LCD.print(potassium);
  LCD.print("%");

  delay(2000);  // Display for 2 seconds

  // Control water pump and buzzer
  if (soilMoisture < moistThreshold) {
    digitalWrite(WATER_PUMP_LED, HIGH);
    digitalWrite(BUZZER_LED, HIGH);
  } else {
    digitalWrite(WATER_PUMP_LED, LOW);
    digitalWrite(BUZZER_LED, LOW);
  }

  delay(1000); // Update every second
}