// chickenfeeding.kist@gmail.com
//kist@2024

#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL2w0FNBAk6"
#define BLYNK_TEMPLATE_NAME "CHICKEN FEEDING VIA IOT"
#define BLYNK_AUTH_TOKEN "MhWx_CUMkVOObLev7K5q1ruT04Xb8AGa"

#define buzzer      23
#define en1         16
#define en2         17
#define ir1         13
#define ir2         14
#define triggerPin 19
#define echoPin    18

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <HCSR04.h>
#include <LiquidCrystal_I2C.h>

char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";

HCSR04 hc(triggerPin,echoPin);
LiquidCrystal_I2C lcd(0x27,20,4);

float reserve;
bool rstate=LOW;
String notification;

BLYNK_WRITE(V2)
{
  int data=param.asInt();
  if(data!= rstate)
  {
    rstate=data;
  }
}

void setup()
{
  lcd.init();                  
  lcd.backlight();
  loadingdisplay();
  
  Serial.begin(115200);
  delay(500);

  pinMode(en1,OUTPUT);
  pinMode(en2,OUTPUT);
  pinMode(ir1,INPUT_PULLUP);
  pinMode(ir2,INPUT_PULLUP);
  pinMode(buzzer,OUTPUT);
  digitalWrite(buzzer,LOW);
  digitalWrite(en1,LOW);
  digitalWrite(en2,LOW);

  Blynk.begin(auth, ssid, pass);
}

void loop()
{
 Blynk.run();
 get_data();
 send_update();
 homedisplay();

 if(rstate) 
 {
  alert_display("FEEDING IN PROGRESS");
  Blynk.virtualWrite(V1,"FEEDING IN PROGRESS");
  Alert(5);
  feedChicken();
 }

if(reserve<10)
 {
  alert_display("INSUFFICIENT FOOD ");
  Blynk.virtualWrite(V1,"INSUFFICIENT FOOD ");
  Alert(3); 
  }
else
{
  Blynk.virtualWrite(V1,"ENOUGH FOOD PRESENT");
}
delay(1000);
}

void feedChicken()
{
  while(digitalRead(ir2)==LOW)
  {
    digitalWrite(en1,HIGH);
    digitalWrite(en2,LOW);
  }
  while(digitalRead(ir1)==LOW)
  {
    digitalWrite(en1,LOW);
    digitalWrite(en2,HIGH);
  }
}

void get_data() 
{
  reserve=map(hc.dist(),0,400,100,0);
}

void send_update() 
{     
  Blynk.virtualWrite(V0,reserve);
  delay(150);  
}

void loadingdisplay()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("SMART FEEDING SYSTEM"); 
  lcd.setCursor(0,1);
  lcd.print("FOR CHICKEN VIA IoT"); 
  lcd.setCursor(0,2);
  lcd.print(" SYSTEM INITIALIZE ");
  lcd.setCursor(0,3);
  lcd.print("PLEASE WAIT");
  for(int k=11;k<20;k++)
  {
    lcd.setCursor(k,3);
    lcd.print(".");
    delay(500);
  }
}

void homedisplay()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("SMART FEEDING SYSTEM"); 
  lcd.setCursor(0,1);
  lcd.print("FOR CHICKEN VIA IoT"); 
  lcd.setCursor(0,2);
  lcd.print("RESERVE:"); 
  lcd.print(reserve); 
  lcd.setCursor(0,3);
  if(rstate){lcd.print("  FEEDING ACTIVATED "); }
  else{lcd.print(" FEEDING DEACTIVATED");}
}

void alert_display(String textAlert)
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("----SYSTEM ALERT----");
  lcd.setCursor(0,1);
  lcd.print("********************");
  lcd.setCursor(0,2);
  lcd.print(textAlert);
  lcd.setCursor(0,3);
  lcd.print("********************");
}

void Alert(uint8_t num)
{
  for(num;num>0;num--)
  {
    digitalWrite(buzzer,HIGH);
    delay(500);
    digitalWrite(buzzer,LOW);
    delay(500);
  }
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
r3:1
r3:2
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
bz1:1
bz1:2
led3:A
led3:C
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
led5:A
led5:C
led6:A
led6:C
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r