Gambaran Umum
Sistem ini memantau kondisi fisik server rack secara real-time menggunakan sensor suhu, kelembaban, asap, dan pintu. Ketika terjadi anomali seperti suhu berlebih, kebakaran, atau akses tidak sah, sistem akan memberikan peringatan melalui:
- LED indikator (hijau = normal, merah = bahaya)
- Buzzer alarm
- Notifikasi Telegram
- Kipas pendingin otomatis (jika suhu > threshold)
Cocok untuk pembelajaran mata pelajaran: IoT, Sistem Embedded, Keamanan Fisik Infrastruktur TI, dan Pemrograman Python.
Kebutuhan Perangkat Keras
- Raspberry Pi 3B+ atau 4 (2GB RAM atau lebih)
- Sensor DHT22 (suhu & kelembaban)
- Sensor MQ-2 (asap/gas mudah terbakar)
- Reed switch + magnet (deteksi pintu rack)
- Kipas DC 5V + transistor NPN (sebagai pendingin otomatis)
- Buzzer aktif 5V
- LED merah & hijau
- Kabel jumper, breadboard, resistor 10kΩ & 220Ω
Kebutuhan Perangkat Lunak
- Raspberry Pi OS (64-bit recommended)
- Python 3.9+
- Pustaka Python:
Adafruit_DHT,RPi.GPIO,requests,time - Akun Telegram Bot (untuk notifikasi)
Langkah Instalasi
- Siapkan Raspberry Pi: Install Raspberry Pi OS, aktifkan SSH dan GPIO.
-
Instal dependensi Python:
sudo apt update sudo apt install python3-pip pip3 install Adafruit_DHT RPi.GPIO requests -
Sambungkan komponen elektronik:
- DHT22 → GPIO 4
- MQ-2 → GPIO 17 (analog via MCP3008 opsional, atau gunakan digital out)
- Reed switch → GPIO 27
- Kipas → GPIO 22 (via transistor)
- Buzzer → GPIO 23
- LED hijau → GPIO 5, LED merah → GPIO 6
- Buat bot Telegram: Gunakan BotFather, simpan token dan chat ID.
-
Jalankan skrip utama:
python3 rack_monitor.py
Kode Program Lengkap (rack_monitor.py)
import RPi.GPIO as GPIO
import time
import requests
import Adafruit_DHT
# Konfigurasi GPIO
DHT_PIN = 4
MQ2_PIN = 17
DOOR_PIN = 27
FAN_PIN = 22
BUZZER_PIN = 23
LED_GREEN = 5
LED_RED = 6
# Telegram
BOT_TOKEN = 'ISI_DENGAN_TOKEN_BOT_ANDA'
CHAT_ID = 'ISI_DENGAN_CHAT_ID_ANDA'
GPIO.setmode(GPIO.BCM)
GPIO.setup([FAN_PIN, BUZZER_PIN, LED_GREEN, LED_RED], GPIO.OUT)
GPIO.setup([MQ2_PIN, DOOR_PIN], GPIO.IN)
# Matikan semua output awal
GPIO.output([FAN_PIN, BUZZER_PIN, LED_GREEN, LED_RED], GPIO.LOW)
def send_telegram(msg):
url = f'https://api.telegram.org/bot{BOT_TOKEN}/sendMessage'
try:
requests.post(url, data={'chat_id': CHAT_ID, 'text': msg})
except:
pass
def read_dht():
humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, DHT_PIN)
return temperature, humidity
def main():
last_alert_time = 0
while True:
# Baca sensor
temp, hum = read_dht()
smoke = GPIO.input(MQ2_PIN) # 1 = asap terdeteksi
door_open = GPIO.input(DOOR_PIN) # 1 = pintu terbuka (reed switch terbuka)
alert_msg = []
danger = False
if temp is not None and temp > 35:
alert_msg.append(f"Suhu tinggi: {temp:.1f}°C")
danger = True
GPIO.output(FAN_PIN, GPIO.HIGH)
else:
GPIO.output(FAN_PIN, GPIO.LOW)
if smoke == 1:
alert_msg.append("⚠️ Asap terdeteksi!")
danger = True
if door_open == 1:
alert_msg.append("🚪 Pintu rack dibuka!")
danger = True
# Kontrol LED & buzzer
if danger:
GPIO.output(LED_GREEN, GPIO.LOW)
GPIO.output(LED_RED, GPIO.HIGH)
GPIO.output(BUZZER_PIN, GPIO.HIGH)
time.sleep(0.2)
GPIO.output(BUZZER_PIN, GPIO.LOW)
else:
GPIO.output(LED_GREEN, GPIO.HIGH)
GPIO.output(LED_RED, GPIO.LOW)
# Kirim notifikasi (max sekali per 60 detik)
if danger and (time.time() - last_alert_time > 60):
msg = "🚨 ALERT RACK SERVER:\n" + "\n".join(alert_msg)
send_telegram(msg)
last_alert_time = time.time()
time.sleep(5)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
GPIO.cleanup()
Diagram Koneksi (Sederhana)
Raspberry Pi ──┬── DHT22 (VCC → 3.3V, GND → GND, DATA → GPIO4)
├── MQ-2 (VCC → 5V, GND → GND, DO → GPIO17)
├── Reed Switch (GPIO27 ──/ ── GND, dengan pull-up internal)
├── Kipas (GPIO22 → Basis transistor → Kipas → 5V)
├── Buzzer (GPIO23 → Buzzer → GND)
├── LED Hijau (GPIO5 → Resistor 220Ω → LED → GND)
└── LED Merah (GPIO6 → Resistor 220Ω → LED → GND)
Pemecahan Masalah
- Sensor DHT22 tidak terbaca: Pastikan kabel data terhubung ke GPIO4 dan gunakan resistor pull-up 4.7kΩ antara DATA dan VCC.
- MQ-2 terus aktif: Sensor perlu pemanasan awal (~30 detik). Gunakan output digital (DO), bukan analog (AO) jika tidak pakai ADC.
- Pintu selalu "terbuka": Periksa posisi magnet dan reed switch. Aktifkan pull-up internal:
GPIO.setup(DOOR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP). - Notifikasi Telegram gagal: Cek koneksi internet dan validitas token/chat ID.