#define BLYNK_TEMPLATE_ID "TMPLUcb24bPO"
#define BLYNK_DEVICE_NAME "Sensor Jarak"
#define BLYNK_AUTH_TOKEN "crtJfP8pP_10bThGKHgd_cK6F8a2tk79"

char auth[] = "crtJfP8pP_10bThGKHgd_cK6F8a2tk79";

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

#include "DHTesp.h"
const int DHT_PIN = 27;

DHTesp dhtSensor;

#define BLYNK_PRINT Serial

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

BlynkTimer timer;
String note;
String noted;

#include <Servo.h>
#define triggerPin  2
#define echoPin     15

long bacaJarakCM(){
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2); 
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(triggerPin, LOW);
  int durasi = pulseIn(echoPin, HIGH);
  return (durasi / 2) / 29.1; 
}

void deteksi() {
  int jarak = bacaJarakCM();
  Serial.print("Kondisi Makanan: ");
  Serial.print(bacaJarakCM());
  Serial.print(" Distance | ");
  Serial.println(noted);
  Blynk.virtualWrite(V4, bacaJarakCM());
  Blynk.virtualWrite(V13, noted);

  if (jarak <= 8){
  noted ="Full";
  }
  else if(jarak >= 9 && jarak <=15) {
  noted = "Enough";
  }
  else if(jarak >= 16){
  noted = "Empty";
  } 
  else {
  noted = "";
  }
  delay(50);
}

void Temperature()
{
  // Request temperature to all devices on the data line
  sensors.requestTemperatures(); 
  
  Serial.print("Celsius temperature: ");
  //We can connect more than one IC on the same data wire. 0 refers to the first IC on the wire
  Serial.print(sensors.getTempCByIndex(0)); 
  Serial.println("                      ");
  int tempC=sensors.getTempCByIndex(0);
  delay(1000);
  
  // You can send any value at any time.
  // Please don't send more that 10 values per second.
    Blynk.virtualWrite(V5, tempC);
    delay(500);
      Serial.println(note);

  if(tempC <= 24){
  //digitalWrite(D4, HIGH);
  note ="Cool";
    
  }
  else if(tempC >= 28 && tempC <= 34){
  note = "Normal";
  
  }
  else if(tempC >= 35){
//  digitalWrite(D4, LOW);
//  myservo.write(60);
//  delay(500);
//  myservo.write(0);
  note = "Hot";
  }

  else {
  note = "";
  }
  delay(50);
}

BLYNK_WRITE(V9) {
 int pinValue = param.asInt(); // Assigning incoming value from pin V0 to a variable
 if (pinValue == 1) {
     doFeed();
     myservo.write(90);
  } else {
    myservo.write(0);
 }
}

BLYNK_WRITE(V12){ ////Lampu UV
  int pinValue = param.asInt();
  if(pinValue == 1){
    digitalWrite(14, HIGH);

  }
  if(pinValue == 0){
    digitalWrite(14, LOW);
  }
}

void doFeed(){
  Serial.println("Do feeding:");
  Serial.println(i++);
 }

void setup()
{
  // Debug console
  Serial.begin(9600);
  sensors.begin();
  pinMode(triggerPin, OUTPUT);//D2  pinMode(echoPin, INPUT);//D2
  pinMode(14, OUTPUT); //LED Hijau - Lampu UV
  myservo.attach(4); // LED Hijau - JarFish

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
  //Blynk.begin(auth, ssid, pass, IPAddress(10,22,228,129), 8080);
}

void loop()
{
  Blynk.run();
  deteksi();
  Temperature();
  timer.run();
}
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
led1:A
led1:C
r1:1
r1:2
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
led2:A
led2:C
led3:A
led3:C
r2:1
r2:2
r3:1
r3:2
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
servo1:GND
servo1:V+
servo1:PWM