Gambaran Umum
Sistem ini mengotomatisasi perangkat elektronik di ruang kelas seperti lampu, proyektor, dan AC berdasarkan:
- Keberadaan orang (sensor gerak PIR)
- Tingkat cahaya ruangan (sensor LDR)
- Jadwal pelajaran (opsional via integrasi kalender)
- Input manual melalui antarmuka web atau Telegram
Cocok untuk pembelajaran mata pelajaran: IoT, Embedded System, Pemrograman Python, dan Otomasi Gedung.
Kebutuhan Perangkat Keras
- ESP32 Development Board (dengan Wi-Fi & Bluetooth)
- Sensor PIR HC-SR501 (deteksi gerak/orang)
- Sensor LDR (Light Dependent Resistor)
- Modul Relay 4-channel (untuk mengontrol lampu, proyektor, AC)
- Lampu LED, proyektor, atau perangkat listrik 220V (dikontrol via relay)
- Resistor 10kΩ (untuk LDR), resistor 220Ω (opsional)
- Breadboard dan kabel jumper
Kebutuhan Perangkat Lunak
- Arduino IDE atau PlatformIO
- Library ESP32:
WiFi.h,WebServer.h,ArduinoJson.h - Akun Telegram Bot (untuk notifikasi dan kontrol jarak jauh)
- Jaringan Wi-Fi di sekolah
Langkah Instalasi
-
Pasang library di Arduino IDE:
Tools → Manage Libraries → Cari "ArduinoJson" dan "ESP32" -
Sambungkan komponen:
- PIR OUT → GPIO 13
- LDR → GPIO 34 (analog input)
- Relay IN1 → GPIO 25 (lampu)
- Relay IN2 → GPIO 26 (proyektor)
- Relay IN3 → GPIO 27 (AC atau kipas)
- Konfigurasi Wi-Fi & Telegram: Ganti SSID, password, token bot, dan chat ID di kode.
- Upload kode ke ESP32: Pilih board “ESP32 Dev Module”, lalu upload.
-
Akses antarmuka web: Buka alamat IP ESP32 di browser (misal:
192.168.1.100).
Kode Program Lengkap (smart_classroom.ino)
#include
#include
#include
// Konfigurasi Wi-Fi
const char* ssid = "NAMA_SSID";
const char* password = "PASSWORD_SSID";
// Telegram
const char* botToken = "ISI_DENGAN_TOKEN_BOT_ANDA";
const char* chatId = "ISI_DENGAN_CHAT_ID_ANDA";
// Pin GPIO
#define PIR_PIN 13
#define LDR_PIN 34
#define RELAY_LAMP 25
#define RELAY_PROJ 26
#define RELAY_FAN 27
WebServer server(80);
bool lampState = false;
bool projState = false;
bool fanState = false;
void sendTelegram(String message) {
String url = "https://api.telegram.org/bot" + String(botToken) + "/sendMessage?chat_id=" + String(chatId) + "&text=" + message;
HTTPClient http;
http.begin(url);
http.GET();
http.end();
}
void handleRoot() {
String html = "Smart Classroom Controller
";
html += "Lampu: " + String(lampState ? "ON" : "OFF") + "
";
html += "
";
html += "";
server.send(200, "text/html", html);
}
void toggleLamp() {
lampState = !lampState;
digitalWrite(RELAY_LAMP, lampState ? LOW : HIGH); // Relay aktif LOW
server.send(200, "text/plain", "OK");
sendTelegram("💡 Lampu " + String(lampState ? "dinyalakan" : "dimatikan"));
}
void toggleProj() {
projState = !projState;
digitalWrite(RELAY_PROJ, projState ? LOW : HIGH);
server.send(200, "text/plain", "OK");
sendTelegram("📽️ Proyektor " + String(projState ? "dinyalakan" : "dimatikan"));
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(RELAY_LAMP, OUTPUT);
pinMode(RELAY_PROJ, OUTPUT);
pinMode(RELAY_FAN, OUTPUT);
digitalWrite(RELAY_LAMP, HIGH);
digitalWrite(RELAY_PROJ, HIGH);
digitalWrite(RELAY_FAN, HIGH);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/lamp/toggle", toggleLamp);
server.on("/proj/toggle", toggleProj);
server.begin();
}
void loop() {
server.handleClient();
// Baca sensor
int pir = digitalRead(PIR_PIN);
int ldr = analogRead(LDR_PIN); // Nilai 0–4095 (gelap → terang)
// Otomatisasi lampu: nyalakan jika ada gerak & gelap
if (pir == HIGH && ldr < 2000 && !lampState) {
lampState = true;
digitalWrite(RELAY_LAMP, LOW);
sendTelegram("💡 Lampu otomatis menyala (ada orang & gelap)");
} else if (pir == LOW && lampState) {
// Tunda matikan lampu 2 menit setelah tidak ada gerak
static unsigned long lastMotion = 0;
if (lastMotion == 0) lastMotion = millis();
if (millis() - lastMotion > 120000) {
lampState = false;
digitalWrite(RELAY_LAMP, HIGH);
sendTelegram("💡 Lampu otomatis dimatikan (tidak ada orang)");
lastMotion = 0;
}
} else if (pir == HIGH) {
// Reset timer saat ada gerak
static unsigned long lastMotion = 0;
lastMotion = millis();
}
delay(100);
}
Diagram Koneksi (Sederhana)
ESP32 ──┬── PIR OUT → GPIO13
├── LDR → GPIO34 (dengan resistor pull-down 10kΩ ke GND)
├── Relay IN1 → GPIO25 → Lampu
├── Relay IN2 → GPIO26 → Proyektor
└── Relay IN3 → GPIO27 → Kipas/AC
Relay VCC → 5V, GND → GND
Perangkat listrik 220V dihubungkan ke terminal NO (Normally Open) relay
Pemecahan Masalah
- ESP32 tidak terhubung ke Wi-Fi: Periksa SSID dan password, pastikan jaringan 2.4 GHz.
- Relay tidak aktif: Pastikan logika relay (aktif HIGH/LOW). Banyak relay aktif LOW.
- PIR terus mendeteksi gerak: Tunggu 30–60 detik setelah power-on; sesuaikan sensitivitas potensiometer di modul PIR.
- LDR tidak responsif: Kalibrasi nilai threshold (misal: ganti
2000dengan nilai sesuai kondisi ruang). - Notifikasi Telegram gagal: Cek koneksi internet ESP32 dan validitas token/chat ID.