#define BLYNK_TEMPLATE_ID "TMPL6r2GH-9hs"
#define BLYNK_TEMPLATE_NAME "UTPIOT"
#define BLYNK_AUTH_TOKEN "Om_feHSO4vdiYcjEEhXvxSS81dfveVeP"
#define BLYNK_PRINT Serial

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

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

#define echo 12
#define trig 13
int pinbuz = 5;
int chanbuz = 0;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

bool buzzerState = false;
bool labelState = false;

void hidupBuzzer() {
  tone(pinbuz, 200);
  delay(1000);
  tone(pinbuz, 250);
  delay(1000);
}

void matiBuzzer() {
  noTone(pinbuz);
}

void notifhama(){
  Blynk.virtualWrite(V4,"ADA HAMAAAAA");
}
void notifaman(){
  Blynk.virtualWrite(V4,"Aman");
}

void notifmati(){
  Blynk.virtualWrite(V4,"Mati");
}

void updateDisplay(int distance) {
  oled.clearDisplay();
  oled.setTextSize(1);
  oled.setTextColor(WHITE);
  oled.setCursor(0, 2);
  if(labelState){
  if (distance <= 200) {
    oled.print("Ada hama di jarak : ");
    oled.print(distance);
    oled.println(" cm");
    if (buzzerState) {
      hidupBuzzer();
    }notifhama();
  } else {
    oled.print("Kondisi aman");
    matiBuzzer();
    notifaman();
  }
  }else{
    notifmati();
  }
  oled.display();
}

BLYNK_WRITE(V3) {
  int pin_value = param.asInt();
  if (pin_value == 1) {
    buzzerState = true;
    labelState = true;
  } else {
    buzzerState = false;
    labelState = false;
    matiBuzzer();
    
    
  }
}

void setup() {
  Serial.begin(115200);
  Serial.println("Hello world");
  if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3c)) {
    Serial.println(F("oled failed"));
    while (1);
  };

  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  ledcAttachPin(pinbuz, chanbuz);

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

void loop() {
  // Membaca jarak dari sensor ultrasonik
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  int waktu = pulseIn(echo, HIGH);
  int jarak = waktu * 0.034 / 2; 
  updateDisplay(jarak); 

  Blynk.run();
}