#define BLYNK_TEMPLATE_ID "TMPL6PJc_SFzL"
#define BLYNK_TEMPLATE_NAME "Notifikasi lampu"
#define BLYNK_AUTH_TOKEN "yddKoueo6PFO14podNg8m-oJYYDWSD53"
#define MAX_CHARACTER 50
#define MQTT_SERVER "0.tcp.ap.ngrok.io"
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "PubSubClient.h"
#include "CTBot.h"
#include <string>
// Bot Telegram
CTBot robot;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C dan ukuran LCD
// WIFI
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Blynk
char auth[] = BLYNK_AUTH_TOKEN;
// MQTT
char mqtt_topic[] = "MonitoringLampu/sensor";
int mqtt_port = 10212;
char clientId[50];
WiFiClient espClient;
PubSubClient client(espClient);
int relay1;
int light1;
int motion1;
int ledlight1;
// Deklarasi Pin Sensor
int pirPin = 2; // Pin for PIR sensor
int relayPin = 12; // Pin for relay
int ledPin = 13; // Pin for LED
int lightSensorPin = 34; // Pin for light sensor (analog pin on ESP32)
void setup()
{
pinMode(lightSensorPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(relayPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
// MQTT
client.setServer(MQTT_SERVER, mqtt_port);
// Inisialisasi LCD
lcd.init();
lcd.backlight(); // Nyalakan backlight jika LCD memiliki lampu latar
// Inisialisasi Telegram
digitalWrite(relayPin, LOW);
robot.wifiConnect(ssid, pass);
robot.setTelegramToken("6540536874:AAEbhheI6nWUg4rLugyq8L_X6tuIleh4Fo4");
if (robot.testConnection())
Serial.println("Terhubung!");
else
Serial.println("Error!");
}
void mqttReconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.print(clientId);
Serial.println(" connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void telegramConnect()
{
// Periksa pesan Telegram
TBMessage pesan;
if (robot.getNewMessage(pesan))
{
Serial.print("Ada pesan Masuk : ");
Serial.println(pesan.text);
if (pesan.text.equalsIgnoreCase("RELAY ON"))
{
digitalWrite(relayPin, HIGH);
robot.sendMessage(pesan.sender.id, "Relay Menyala");
}
else if (pesan.text.equalsIgnoreCase("RELAY OFF"))
{
digitalWrite(relayPin, LOW);
robot.sendMessage(pesan.sender.id, "Relay Padam");
}
else
{
String balas;
balas = "Maaf, perintahnya salah. Coba kirim RELAY ON atau RELAY OFF.";
robot.sendMessage(pesan.sender.id, balas);
}
}
}
void sensor()
{
relay1 = digitalRead(relayPin);
light1 = analogRead(lightSensorPin);
motion1 = digitalRead(pirPin);
ledlight1 = digitalRead(ledPin);
Serial.print("Relay: ");
Serial.print(relay1);
Serial.print(" Sensor Cahaya: ");
Serial.print(light1);
Serial.print(" Sensor Gerak: ");
Serial.print(motion1);
Serial.print(" LAMPU: ");
Serial.println(ledlight1);
// RELAY
if (relay1 == HIGH)
{
Serial.print(" HIDUP");
}
else
{
Serial.print(" MATI");
}
// Sensor Cahaya
if (light1 > 500)
{
Serial.print(" Cahaya Gelap");
}
else
{
Serial.print(" Cahaya Terang");
}
// Sensor Gerak
if(motion1 == HIGH)
{
Serial.print(" Gerakan Terdeteksi");
}
else
{
Serial.print(" Tidak ada Gerakan");
}
// Lampu
if(ledlight1 == HIGH)
{
Serial.println(" Lampu Dinyalakan");
}
else
{
Serial.println(" Lampu Dimatikan");
}
}
void loop()
{
int pirState = digitalRead(pirPin);
int lightLevel = analogRead(lightSensorPin);
// Balik logika cahaya: Redup (tingkat kecerahan rendah) adalah 1023, Terang (tingkat kecerahan tinggi) adalah 0
lightLevel = map(lightLevel, 0, 1023, 1023, 0);
if (!client.connected())
{
mqttReconnect();
}
client.loop(); // Melakukan berulang-ulang
// Periksa pesan Telegram
telegramConnect();
// Sensor
sensor();
// Lakukan logika cahaya dan gerakan
if (lightLevel > 500)
{
Blynk.logEvent("notifikasi_lampu");
Serial.println("Tidak ada Cahaya, Lampu Otomatis Hidup");
digitalWrite(ledPin, HIGH); // Turn on the LED
// Tampilkan pesan di LCD
lcd.setCursor(0, 0);
lcd.print("Cahaya Gelap!");
lcd.setCursor(0, 1);
lcd.print("Lampu dinyalakan");
client.publish(mqtt_topic, "Lampu Dinyalakan"); // konten
}
else if (pirState == HIGH)
{
Blynk.logEvent("notifikasi_lampu");
Serial.println("Gerakan terdeteksi di sekitar sensor!");
digitalWrite(ledPin, HIGH); // Turn on the LED
// Tampilkan pesan di LCD
lcd.setCursor(0, 0);
lcd.print("Gerakan Terdeteksi!");
lcd.setCursor(0, 1);
lcd.print("Lampu dinyalakan");
client.publish(mqtt_topic, "Lampu Dinyalakan"); // konten
}
else
{
Serial.print(" Relay Mati atau Tidak ada Gerakan dan Cahaya Terang.");
digitalWrite(ledPin, LOW); // Turn off the LED
// Tampilkan pesan di LCD
lcd.setCursor(0, 0);
lcd.print("Tidak ada gerakan");
lcd.setCursor(0, 1);
lcd.print("Cahaya terang");
client.publish(mqtt_topic, "Lampu Dimatikan"); // konten
}
// Dashboard MQTT
StaticJsonDocument<300> doc;
// Relay
if (relay1 == HIGH) {
doc["Relay"] = " HIDUP";
}else {
doc["Relay"] = " MATI";
}
// Sensor Cahaya
if (light1 > 500) {
doc["Sensor_Cahaya"] = " Cahaya Terang";
}else {
doc["Sensor_Cahaya"] = " Cahaya Gelap";
}
// Sensor Gerak
if (motion1 == HIGH) {
doc["Sensor_Gerak"] = " Gerakan Tedeteksi";
}else {
doc["Sensor_Gerak"] = " Tidak ada Gerakan";
}
// Lampu
if (ledlight1 == HIGH) {
doc["LAMPU"] = " Lampu Dinyalakan";
}else {
doc["LAMPU"] = " Lampu Dimatikan";
}
String out;
serializeJson(doc, out);
char json[out.length() + 1];
out.toCharArray(json, out.length() + 1);
// client publish
client.publish(mqtt_topic, json);
delay(2000);
}