/*
ESP32 pin RFID RC-522 pin
3.3v 3.3v
GND GND
22 RST
- IRQ
19 MISO
23 MOSI
18 SCK
5 SDA
ESP32 pin ULN2003
26 in 1
25 in 2
33 in 3
32 in 4
ESP32 pin Komponen
2 lampu 1
4 lampu 2
27 lampu3
12 servo
34 sensor gas(MQ-2)
35 sensor api
14 led_api
16 triger HC-SR04 samping
13 echo HC-SR04 samping
21 triger HC-SR04 atas
17 echo HC-SR04 atas
*/
/////////////////////// Inisialisasi Sinic Pro //////////////////////
#ifdef ENABLE_DEBUG
#define DEBUG_ESP_PORT Serial
#define NODEBUG_WEBSOCKETS
#define NDEBUG
#endif
#include <Arduino.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
#include <WiFi.h>
#endif
#include "SinricPro.h"
#include "SinricProSwitch.h"
#define WIFI_SSID "Wokwi-GUEST" // ganti nama wifi
#define WIFI_PASS ""
#define APP_KEY "84e0599b-5b67-4d0f-8785-a5f3cbf44124"
#define APP_SECRET "49386316-c9e1-4438-b441-848846d06b27-a8396b75-c7b2-496d-9d8e-a8d72a5f9a63"
#define SWITCH_ID_1 "66472db66443b9bfe2bae63e"
#define RELAYPIN_1 2
#define SWITCH_ID_2 "66437f806443b9bfe2b9451b"
#define RELAYPIN_2 4
#define SWITCH_ID_3 "664757a8202b1b3e1f5adffc"
#define RELAYPIN_3 27
/////////////////////// Inisialisasi Telegram dan sensor gas & api //////////////////////
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// Wifi network station credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "7175374685:AAElg8MvtzWWZ_J2mcTtYovVt3WwsQkLlA4"
#define CHAT_ID "1838205197"
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
// Pin sensor dan led_api
const int gasSensorPin = 34; // GPIO34
const int flameSensorPin = 35; // GPIO35
const int led_api = 14; // GPIO14 untuk led_api
/////////////////////////// Inisialisasi RFID, Servo, Stepper ///////////////////////////
#include <SPI.h>
#include <MFRC522.h>
#include <ESP32Servo.h>
#include <Stepper.h>
#define SERVO_PIN 12 // ESP32 pin GPIO12 dihubungkan ke servo motor
#define SS_PIN 5
#define RST_PIN 22
#define IN1 26 // ESP32 pin GPIO26 dihubungkan ke ULN2003 pin IN1
#define IN2 25 // ESP32 pin GPIO25 dihubungkan ke ULN2003 pin IN2
#define IN3 33 // ESP32 pin GPIO33 dihubungkan ke ULN2003 pin IN3
#define IN4 32 // ESP32 pin GPIO32 dihubungkan ke ULN2003 pin IN4
MFRC522 mfrc522(SS_PIN, RST_PIN); // Inisialisasi RC-522(RFID)
Servo servoMotor; // Inisialisasi Servo
int setpoint_servo = 90; // setpoint bukaan servo
const int steps_per_rev = 512; // Banyaknya step tiap 1 putaran
Stepper motor(steps_per_rev, IN1, IN3, IN2, IN4); // Inisialisasi Driver Stepper ULN2003
///// Fungsi Servo Untuk Membuka /////
void servo_buka(){
for (int pos = 0; pos <= setpoint_servo; pos += 1) {
servoMotor.write(pos);
delay(15);
}
}
///// Fungsi Servo Untuk Membuka /////
void servo_tutup(){
for (int pos = setpoint_servo; pos >= 0; pos -= 1) {
servoMotor.write(pos);
delay(15);
}
}
///// Fungsi Stepper Untuk Membuka dan Menutup Otomatis /////
void stepper(){
Serial.println("Membuka...");
motor.step(steps_per_rev);
delay(5000); // Atur Lama Jeda Membuka dan menutup gerbang
Serial.println("Menutup...");
motor.step(-steps_per_rev);
delay(1000);
}
//////////// Inisialisasi HCSR samping dan atas ///////////
const int trigPin1 = 16; //samping
const int echoPin1 = 13;
const int trigPin2 = 21; //atas
const int echoPin2 = 17;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
long duration1;
float distanceCm1;
long duration2;
float distanceCm2;
/////////////////////// Setup Fungsi IO Sinric Pro //////////////////////////////////
bool onPowerState1(const String &deviceId, bool &state) {
Serial.printf("Device 1 turned %s", state?"on":"off");
digitalWrite(RELAYPIN_1, state ? HIGH:LOW);
return true;
}
bool onPowerState2(const String &deviceId, bool &state) {
Serial.printf("Device 2 turned %s", state?"on":"off");
digitalWrite(RELAYPIN_2, state ? HIGH:LOW);
return true;
}
bool onPowerState3(const String &deviceId, bool &state) {
Serial.printf("Device 3 turned %s", state?"on":"off");
digitalWrite(RELAYPIN_3, state ? HIGH:LOW);
return true;
}
///// Setup Koneksi WiFi /////
void setupWiFi() {
Serial.printf("\r\n[Wifi]: Connecting");
#if defined(ESP8266)
WiFi.setSleepMode(WIFI_NONE_SLEEP);
WiFi.setAutoReconnect(true);
#elif defined(ESP32)
WiFi.setSleep(false);
WiFi.setAutoReconnect(true);
#endif
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.printf(".");
delay(250);
}
Serial.printf("connected!\r\n[WiFi]: IP-Address is %s\r\n", WiFi.localIP().toString().c_str());
}
///// Setup Koneksi WiFi & Telegram /////
void setuptg(){
Serial.print("Connecting to Wifi SSID ");
Serial.print(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.print("\nWiFi connected. IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Retrieving time: ");
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
time_t now = time(nullptr);
while (now < 24 * 3600)
{
Serial.print(".");
delay(100);
now = time(nullptr);
}
Serial.println(now);
bot.sendMessage(CHAT_ID, "Bot started up", "");
}
///// Setup Output Perangkat dari Sinric Pro /////
void setupSinricPro() {
pinMode(RELAYPIN_1, OUTPUT);
pinMode(RELAYPIN_2, OUTPUT);
pinMode(RELAYPIN_3, OUTPUT);
SinricProSwitch& mySwitch1 = SinricPro[SWITCH_ID_1];
mySwitch1.onPowerState(onPowerState1);
SinricProSwitch& mySwitch2 = SinricPro[SWITCH_ID_2];
mySwitch2.onPowerState(onPowerState2);
SinricProSwitch& mySwitch3 = SinricPro[SWITCH_ID_3];
mySwitch3.onPowerState(onPowerState3);
SinricPro.onConnected([](){
Serial.printf("Connected to SinricPro\r\n");
});
SinricPro.onDisconnected([](){
Serial.printf("Disconnected from SinricPro\r\n");
});
SinricPro.begin(APP_KEY, APP_SECRET);
}
/////////////////////// Setup ESP32 untuk RFID, Servo, dan Stepper ///////////////////////
void setup() {
Serial.begin(9600); // Initiate a serial communication
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(gasSensorPin, INPUT);
pinMode(flameSensorPin, INPUT);
pinMode(led_api, OUTPUT);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
Serial.println("Approximate your card to the reader...");
Serial.println();
servoMotor.attach(SERVO_PIN);
//setupWiFi();
setuptg();
motor.setSpeed(50); // setting kecepatan stepper
setupSinricPro();
}
/////////////////////// Program Utama RFID, Servo, dan Stepper ///////////////////////
void loop() {
Serial.println('Memulai Loop');
SinricPro.handle(); //Menjalankan Sinric Pro
Serial.print('.');
///// Program Deteksi Gas dan Api /////
if (digitalRead(gasSensorPin) == LOW) {
String message = "Peringatan: Kebocoran gas terdeteksi! ";
bot.sendMessage(CHAT_ID, message, "");
Serial.println(message);
digitalWrite(led_api, HIGH);
}else {
// Matikan LED jika tidak ada api
digitalWrite(led_api, LOW);
}
// Deteksi api
if (digitalRead(flameSensorPin) == HIGH) {
String message = "Peringatan: Api terdeteksi!";
bot.sendMessage(CHAT_ID, message, "");
Serial.println(message);
// Aktifkan LED
digitalWrite(led_api, HIGH);
} else {
// Matikan LED jika tidak ada api
digitalWrite(led_api, LOW);
}
Serial.print('.');
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distanceCm1 = duration1 * SOUND_SPEED/2;
Serial.print("HC-SR04 samping (cm): ");
Serial.println(distanceCm1);
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration2 = pulseIn(echoPin2, HIGH);
distanceCm2 = duration2 * SOUND_SPEED/2;
Serial.print("HC-SR04 atas (cm): ");
Serial.println(distanceCm2);
if (distanceCm1 <= 10 && distanceCm1 >= 5){ // Ganti jarak deteksi sensor ultrasonik
String message = "Peringatan: Terdeteksi Ada Penyusup! ";
bot.sendMessage(CHAT_ID, message, "");
Serial.println(message);
}
if (distanceCm2 <= 10 && distanceCm2 >= 5){ // Ganti jarak deteksi sensor ultrasonik
String message = "Peringatan: Terdeteksi Ada Penyusup! ";
bot.sendMessage(CHAT_ID, message, "");
Serial.println(message);
}
Serial.println("###");
///// Membaca Kartu RFID /////
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
///// Menampilkan Pembacaan Kartu RFID /////
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
Serial.print('.');
///// Program Servo & Stepper dengan Kartu RFID /////
if (content.substring(1) == "70 5A 7F 58") // Jika kartu biru, maka servo akan terbuka kemudian tertutup otomatis dengan delay
{
Serial.println("Terdeteksi Kartu Biru");
servo_buka();
Serial.println();
delay(5000);
servo_tutup();
}
else if (content.substring(1) == "23 61 16 05") // Jika kartu putih, maka stepper akan terbuka kemudian tertutup otomatis dengan delay
{
Serial.println("Terdeteksi Kartu Putih");
stepper();
}
else // Jika terdapat kartu selain itu, maka tidak dapat membuka gerbang & pintu
{
Serial.println("Akses Ditolak");
delay(3000);
}
//delay(1000);
Serial.println('---');
}