#define BLYNK_TEMPLATE_ID "TMPL6AmhA05AH"
#define BLYNK_TEMPLATE_NAME "Instrumen Sensor proteus"
#define BLYNK_AUTH_TOKEN "yG3iq0YId6V_YL1bZQe6o1QjqlZ_0S3k"

#define BLYNK_PRINT Serial

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

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

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

#define FLOW_SENSOR_PIN 32
#define PRESSURE_SENSOR_PIN 33

LiquidCrystal_I2C lcd(0x27, 20, 4);

unsigned long lastUpdate = 0;
const unsigned long interval = 100; // 1 detik

void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  dht.begin();
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Monitoring Sensor");
}

void loop() {
  Blynk.run();

  if (millis() - lastUpdate >= interval) {
    lastUpdate = millis();

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    int flowADC = analogRead(FLOW_SENSOR_PIN);
    float flow_lpm = (flowADC / 4095.0) * 30.0;

    int pressureADC = analogRead(PRESSURE_SENSOR_PIN);
    float pressure_atm = (pressureADC / 4095.0) * 6.8;

    if (!isnan(h) && !isnan(t)) {
      Blynk.virtualWrite(V3, t);
      Blynk.virtualWrite(V4, h);
    }

    Blynk.virtualWrite(V2, flow_lpm);
    Blynk.virtualWrite(V1, pressure_atm);

    // Tampilkan ke LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp : ");
    lcd.print(t, 1);
    lcd.print(" C");

    lcd.setCursor(0, 1);
    lcd.print("Humid: ");
    lcd.print(h, 1);
    lcd.print(" %");

    lcd.setCursor(0, 2);
    lcd.print("Flow : ");
    lcd.print(flow_lpm, 1);
    lcd.print(" L/m");

    lcd.setCursor(0, 3);
    lcd.print("Press: ");
    lcd.print(pressure_atm, 2);
    lcd.print(" atm");

    // Debug ke Serial
    Serial.printf("Temp: %.2f C | Humid: %.2f %% | Flow: %.2f L/m | Pressure: %.2f atm\n", t, h, flow_lpm, pressure_atm);
  }
}
Sensor Tekanan
Sensor Flow Rate