Smart Classroom Controller

Panduan lengkap sistem otomasi ruang kelas berbasis IoT untuk efisiensi energi dan kenyamanan belajar mengajar di SMK TKJ.

Smart Classroom

Gambaran Umum

Sistem ini mengotomatisasi perangkat elektronik di ruang kelas seperti lampu, proyektor, dan AC berdasarkan:

Cocok untuk pembelajaran mata pelajaran: IoT, Embedded System, Pemrograman Python, dan Otomasi Gedung.

Kebutuhan Perangkat Keras

Kebutuhan Perangkat Lunak

Langkah Instalasi

  1. Pasang library di Arduino IDE:
    Tools → Manage Libraries → Cari "ArduinoJson" dan "ESP32"
  2. 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)
  3. Konfigurasi Wi-Fi & Telegram: Ganti SSID, password, token bot, dan chat ID di kode.
  4. Upload kode ke ESP32: Pilih board “ESP32 Dev Module”, lalu upload.
  5. 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