Smart Garden & Plant Monitoring

Panduan lengkap sistem penyiraman otomatis dan pemantauan tanaman berbasis IoT untuk area hijau sekolah SMK TKJ.

Smart Garden

Gambaran Umum

Sistem ini memantau kelembaban tanah di taman sekolah dan mengaktifkan pompa air secara otomatis ketika tanah kering. Data kelembaban juga dapat dilihat melalui antarmuka web atau notifikasi Telegram.

Cocok untuk pembelajaran mata pelajaran: IoT, Embedded System, Pemrograman Python, dan Teknologi Pertanian Digital.

Kebutuhan Perangkat Keras

Kebutuhan Perangkat Lunak

Langkah Instalasi

  1. Instal dependensi Python:
    sudo apt update
    sudo apt install python3-pip python3-spidev
    pip3 install RPi.GPIO requests flask
  2. Aktifkan SPI (jika pakai MCP3008):
    sudo raspi-config → Interface Options → SPI → Enable
  3. Sambungkan komponen:
    • Sensor kelembaban → MCP3008 CH0 (jika analog)
    • MCP3008 → SPI ke Raspberry Pi
    • Relay IN → GPIO 18
    • Pompa → Relay NO terminal
  4. Konfigurasi Telegram: Ganti BOT_TOKEN dan CHAT_ID di kode.
  5. Jalankan skrip:
    python3 smart_garden.py

Kode Program Lengkap (smart_garden.py)

import RPi.GPIO as GPIO
import time
import spidev
import requests
from flask import Flask, jsonify

# Konfigurasi
PUMP_PIN = 18
BOT_TOKEN = 'ISI_DENGAN_TOKEN_BOT_ANDA'
CHAT_ID = 'ISI_DENGAN_CHAT_ID_ANDA'

# Inisialisasi GPIO & SPI
GPIO.setmode(GPIO.BCM)
GPIO.setup(PUMP_PIN, GPIO.OUT)
GPIO.output(PUMP_PIN, GPIO.HIGH)  # Relay aktif LOW

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000

app = Flask(__name__)

def read_moisture():
    # Baca dari MCP3008 CH0
    adc = spi.xfer2([1, (8 + 0) << 4, 0])
    data = ((adc[1] & 3) << 8) + adc[2]
    return data  # 0 (basah) – 1023 (kering)

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 water_plants(duration=5):
    GPIO.output(PUMP_PIN, GPIO.LOW)
    send_telegram("🌱 Penyiraman dimulai selama {} detik.".format(duration))
    time.sleep(duration)
    GPIO.output(PUMP_PIN, GPIO.HIGH)
    send_telegram("💧 Penyiraman selesai.")

@app.route('/status')
def status():
    moisture = read_moisture()
    return jsonify({
        'moisture_value': moisture,
        'moisture_percent': round((1023 - moisture) / 1023 * 100, 1),
        'needs_water': moisture > 700
    })

@app.route('/water')
def manual_water():
    water_plants(5)
    return jsonify({'status': 'success'})

# Loop utama (jalan di thread terpisah jika perlu)
def main_loop():
    while True:
        moisture = read_moisture()
        if moisture > 700:  # Threshold kering
            water_plants(5)
        time.sleep(300)  # Cek tiap 5 menit

if __name__ == '__main__':
    try:
        # Jalankan Flask di thread terpisah jika ingin loop + web server
        import threading
        threading.Thread(target=main_loop, daemon=True).start()
        app.run(host='0.0.0.0', port=5000)
    except KeyboardInterrupt:
        GPIO.cleanup()
        spi.close()

Diagram Koneksi (Sederhana)

Raspberry Pi ──┬── GPIO18 → Relay IN
              ├── 3.3V, GND → MCP3008 VDD, GND
              ├── MOSI, MISO, SCLK, CE0 → MCP3008
              └── MCP3008 CH0 → Sensor Kelembaban Tanah

Relay NO → Pompa Air 5V
Relay VCC → 5V, GND → GND
            

Pemecahan Masalah