#define BLYNK_TEMPLATE_ID "TMPL3YtXSH4YW"
#define BLYNK_TEMPLATE_NAME "My garden"
#define BLYNK_AUTH_TOKEN "2VDkbp1wdGH69c6V5hcrE7kNOdItNZDo"

#define BLYNK_PRINT Serial
#include <ESP32Servo.h>
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
#include <Arduino.h>
#include <HardwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#include <NTPClient.h>
#include <WiFiUdp.h>

#define TIVA_RX_PIN 4 // ESP32 TX pin connected to Tiva RX (PC5)
#define TIVA_TX_PIN 2 // ESP32 RX pin connected to Tiva TX (PC4)
#define BAUD_RATE 9600

int A=0,c=0;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address to 0x27 for a 16 chars and 2 line display

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");

char auth[] = "2VDkbp1wdGH69c6V5hcrE7kNOdItNZDo";
char ssid[] = "vivo X90";
char pass[] = "aqua9635";

BlynkTimer timer;


int data[8]; // Array to store received data
uint8_t sendData[10] = {0,0,0,0,0,0,0,0,0,0}; // Example data to send

void uart() {
    if (Serial.available() >= 8) {
        
        // Read 8 bytes of data from serial buffer
        for (int i = 0; i < 8; i++) {
            data[i] = Serial.read();
        }
      }
    delay(1000); 
    
    if(WiFi.status() == WL_CONNECTED){
      timeClient.update();
      unsigned int currentHour = timeClient.getHours();
      sendData[9]=currentHour;

      lcd.setCursor(0, 0);               // Set the cursor to the first column and first row
      lcd.print("Temperature:");     // Print some text
      lcd.print(data[6]);
      lcd.print(" ");
      lcd.setCursor(0,1);
      lcd.print("Humidity:");     // Print some text
      lcd.print(data[5]);
      lcd.print("  ");
    }
    else 
    {
      sendData[0] = 1;
      sendData[9]=50;
      lcd.print("Waiting For WIFI..");
    }
    // Send the array directly to Tiva   
    Serial.write(sendData,sizeof(sendData)); 
    // delay(1000); // Delay for demonstration purposes
  // }
}

void connectWiFi() {
  Serial.println("Connecting to WiFi...");
  WiFi.begin(ssid, pass);
  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 5) {
    delay(1000);
    Serial.println("Attempting to connect to WiFi...");
    attempts++;
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("WiFi connected.");
    Serial.print("IP Address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("Failed to connect to WiFi. Please check your credentials.");
  }
}

void setup()
{
  // Serial.begin(115200);
  Serial.begin(BAUD_RATE, SERIAL_8N1, TIVA_RX_PIN, TIVA_TX_PIN);

  lcd.init();                       // Initialize the LCD
  lcd.backlight();                  // Turn on the backlight
  lcd.clear();                      // Clear the LCD screen

  connectWiFi(); // Connect to WiFi
  if (WiFi.status() == WL_CONNECTED){
    Blynk.begin(auth, ssid, pass);
    timer.setInterval(10L, sendSensor);
  }
  timeClient.begin();
  timeClient.setTimeOffset(19800);
}

void sendSensor()
{
    uart();
    Blynk.virtualWrite(V4, data[A]);
    Blynk.virtualWrite(V2,data[6]);
    Blynk.virtualWrite(V3, data[5]);
}


void loop()
{
  uart();

  if (WiFi.status() == WL_CONNECTED){
    Blynk.run();
    timer.run();
  }
  // if(c>=100000){
  //   c=0;
  //   if (WiFi.status() != WL_CONNECTED) {
  //     connectWiFi();
  //   }
  // }
  // c++;
}

BLYNK_WRITE(V0)
{

  int ctrl = param.asInt();

  if(ctrl ==0)
  {
    sendData[0]=0;
    for(int i=1;i<9;i++){
    sendData[i]=0;
    }
  }

  if(ctrl ==1)
  {
    sendData[0] = 0;
    sendData[1] = 1;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;

  }
  if(ctrl ==2)
  {
    sendData[0] = 0;
    sendData[1] = 2;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }

  if(ctrl ==3)
  {
    sendData[0] = 0;
    sendData[1] = 3;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }

  if(ctrl ==4)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }

  if(ctrl ==5)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 1;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }

  if(ctrl ==6)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 0;
    sendData[3] = 1;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }

  if(ctrl ==7)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 1;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }

  if(ctrl ==8)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 1;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }

    if(ctrl ==9)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 1;
    sendData[7] = 0;
    sendData[8] = 0;
  }

  if(ctrl ==10)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 1;
    sendData[8] = 0;
  }

  if(ctrl ==11)
  {
    sendData[0] = 0;
    sendData[1] = 4;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 1;
  }

  if(ctrl ==12)
  {
    sendData[0] = 1;
    sendData[1] = 0;
    sendData[2] = 0;
    sendData[3] = 0;
    sendData[4] = 0;
    sendData[5] = 0;
    sendData[6] = 0;
    sendData[7] = 0;
    sendData[8] = 0;
  }
}

BLYNK_WRITE(V1)
{
  int plant = param.asInt();

  switch(plant)
  {
    case 1:
      {
        A=0;
        break;
      }
    
    case 2:
      {
        A=1;
        break;
      }

    case 3:
      {
        A=2;
        break;
      }

    case 4:
      {
        A=3;
        break;
      }

    case 5:
      {
        A=4;
        break;
      }
  }
  
}

