#define BLYNK_TEMPLATE_ID "TMPL6xoT44vYU"
#define BLYNK_TEMPLATE_NAME "Sistem Monitoring Ruangan"
#define BLYNK_AUTH_TOKEN "2t9_RDpyBr6NtKmamPH62EoGwKjA0YMU"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
// Konfigurasi pin dan tipe sensor
#define NTC_PIN 34 // Pin sensor NTC
#define PIR_SENSOR1_PIN 13
#define PIR_SENSOR2_PIN 12
#define BUZZER_PIN 14
#define LED_PIN 26
#define SERVO_PIN 32 // Pin servo
// Inisialisasi objek Servo
Servo myServo;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
int personCount = 0;
bool manualControl = false;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(PIR_SENSOR1_PIN, INPUT);
pinMode(PIR_SENSOR2_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
lcd.init();
lcd.backlight();
Serial.begin(115200);
myServo.attach(SERVO_PIN); // Hubungkan servo ke pin yang telah ditentukan
myServo.write(0); // Atur posisi awal servo ke 0 derajat
updateLCD();
Blynk.begin(auth, ssid, pass);
// Uji Servo
Serial.println("Testing servo...");
myServo.write(90); // Atur posisi servo ke 90 derajat untuk menguji
delay(2000); // Tunggu 2 detik
myServo.write(0); // Kembali ke posisi awal
Serial.println("Servo test complete.");
}
void loop() {
Blynk.run();
int pirState1 = digitalRead(PIR_SENSOR1_PIN);
int pirState2 = digitalRead(PIR_SENSOR2_PIN);
// Entrance PIR Sensor
if (pirState1 == HIGH) {
personCount++;
buzz();
updateLCD();
delay(500); // Prevents rapid incrementing from same detection
}
// Exit PIR Sensor
if (pirState2 == HIGH) {
if (personCount > 0) {
personCount--;
buzz();
updateLCD();
}
delay(500); // Prevents rapid decrementing from same detection
}
// LED Control
if (!manualControl) {
if (personCount > 0) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
// Baca nilai analog dari NTC dan konversi ke suhu
int ntcValue = analogRead(NTC_PIN); // Membaca nilai analog dari NTC
float suhu = convertNTCToTemperature(ntcValue); // Konversi nilai NTC ke suhu
// Tampilkan pembacaan sensor dan suhu di serial monitor
Serial.print("NTC Value: ");
Serial.println(ntcValue);
Serial.print("Temperature: ");
Serial.println(suhu);
// Kontrol servo berdasarkan suhu
if (suhu > 30) {
myServo.write(90); // Putar servo ke 90 derajat jika suhu > 30°C
} else {
myServo.write(0); // Kembali ke posisi 0 derajat jika suhu <= 30°C
}
delay(1000); // Tambahkan delay agar pembacaan suhu tidak terlalu sering
}
// Fungsi untuk mengonversi nilai NTC ke suhu (contoh sederhana)
float convertNTCToTemperature(int analogValue) {
// Asumsi: hubungan linear sederhana
// Gantilah rumus ini sesuai dengan karakteristik NTC Anda
float voltage = analogValue * (3.3 / 4095.0); // Konversi nilai ADC ke tegangan
float resistance = (10000.0 * voltage) / (3.3 - voltage); // Perhitungan resistansi NTC
float temperature = (resistance - 10000.0) / -40.0 + 25; // Contoh konversi ke suhu
return temperature;
}
// Buzzer Function
void buzz() {
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
}
// LCD Update Function
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Jumlah Orang:");
lcd.setCursor(0, 1);
lcd.print(personCount);
}
// Manual Control Toggle from Blynk
BLYNK_WRITE(V0) {
int pinValue = param.asInt();
manualControl = (pinValue == 1);
}
// LED Control from Blynk
BLYNK_WRITE(V1) {
int pinValue = param.asInt();
if (manualControl) {
if (pinValue == 1) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
}