DIY Cloud Weather Station menggunakan DHT11, ESP32, dan PHP MYSQL

Tujuan:
Membangun sistem monitoring cuaca sederhana menggunakan ESP32/ESP8266 yang dapat menyimpan data suhu dan kelembapan ke database MySQL pada server lokal (XAMPP) dan menampilkan data dalam bentuk tabel dan grafik.
Alat dan Bahan
- Hardware:
- ESP32 atau ESP8266.
- Sensor DHT11.
- Kabel jumper.
- Breadboard.
- Software:
- Arduino IDE.
- XAMPP (untuk Apache dan MySQL).
- Browser (untuk mengakses halaman PHP).
Langkah Kerja
Bagian 1: Persiapan Server
- Instalasi XAMPP:
- Download dan instal XAMPP.
- Aktifkan Apache dan MySQL melalui kontrol panel XAMPP.
- Buka http://localhost/phpmyadmin dan buat database bernama weather_station.
- Buat Tabel MySQL: Jalankan query berikut di phpMyAdmin:
CREATE TABLE SensorData ( id INT AUTO_INCREMENT PRIMARY KEY, sensor VARCHAR(50), location VARCHAR(50), temperature FLOAT, humidity FLOAT, reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Bagian 2: Membuat File PHP
- File PHP untuk menerima data:
Buat file esp-post-data.php di folder htdocs, isi dengan skrip untuk menerima data dari ESP. - File PHP untuk menampilkan data:
Buat file display-data.php untuk membaca data dari database dan menampilkan dalam tabel atau grafik.
Bagian 3: Pemrograman ESP32/ESP8266
- Library:
- Tambahkan library DHT di Arduino IDE: Adafruit_Sensor dan DHT.
- Kode ESP: Gunakan kode berikut (modifikasi URL ke http://localhost/esp-post-data.php):
#include <WiFi.h> #include <HTTPClient.h> #include <DHT.h> const char* ssid = "Nama_WiFi"; const char* password = "Password_WiFi"; const char* serverName = "http://192.168.1.x/esp-post-data.php"; #define DHTPIN 4 // Pin DHT11 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(1000); dht.begin(); } void loop() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(serverName); http.addHeader("Content-Type", "application/x-www-form-urlencoded"); float temp = dht.readTemperature(); float hum = dht.readHumidity(); String postData = "temperature=" + String(temp) + "&humidity=" + String(hum); http.POST(postData); http.end(); } delay(60000); }
File esp-post-data.php (Untuk Menerima Data)
Buat file dengan nama esp-post-data.php di folder htdocs XAMPP. Isi file dengan skrip berikut untuk menerima data dari ESP32/ESP8266 dan menyimpannya ke database MySQL:
<?php $servername = "localhost"; $username = "root"; $password = ""; // Password MySQL Anda $dbname = "weather_station"; // Membuat koneksi $conn = new mysqli($servername, $username, $password, $dbname); // Cek koneksi if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Periksa apakah data diterima if ($_SERVER["REQUEST_METHOD"] == "POST") { $temperature = $_POST['temperature']; $humidity = $_POST['humidity']; $sql = "INSERT INTO SensorData (sensor, location, temperature, humidity) VALUES ('DHT11', 'Lab IoT', '$temperature', '$humidity')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } } else { echo "No data received!"; } $conn->close(); ?>
File display-data.php (Untuk Menampilkan Data)
Buat file dengan nama display-data.php untuk membaca data dari database dan menampilkannya dalam tabel serta grafik:
<?php $servername = "localhost"; $username = "root"; $password = ""; // Password MySQL Anda $dbname = "weather_station"; // Membuat koneksi $conn = new mysqli($servername, $username, $password, $dbname); // Cek koneksi if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Membaca data dari database $sql = "SELECT * FROM SensorData ORDER BY reading_time DESC LIMIT 20"; $result = $conn->query($sql); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Weather Station Dashboard</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> </head> <body> <h1>Weather Station Data</h1> <table border="1"> <tr> <th>ID</th> <th>Sensor</th> <th>Location</th> <th>Temperature (°C)</th> <th>Humidity (%)</th> <th>Timestamp</th> </tr> <?php if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "<tr> <td>{$row['id']}</td> <td>{$row['sensor']}</td> <td>{$row['location']}</td> <td>{$row['temperature']}</td> <td>{$row['humidity']}</td> <td>{$row['reading_time']}</td> </tr>"; } } else { echo "<tr><td colspan='6'>No data available</td></tr>"; } ?> </table> <h2>Temperature and Humidity Chart</h2> <canvas id="chart"></canvas> <script> const ctx = document.getElementById('chart').getContext('2d'); const data = { labels: [ <?php $result->data_seek(0); // Reset pointer while ($row = $result->fetch_assoc()) { echo "'{$row['reading_time']}',"; } ?> ], datasets: [ { label: 'Temperature (°C)', data: [ <?php $result->data_seek(0); // Reset pointer while ($row = $result->fetch_assoc()) { echo "{$row['temperature']},"; } ?> ], borderColor: 'red', fill: false }, { label: 'Humidity (%)', data: [ <?php $result->data_seek(0); // Reset pointer while ($row = $result->fetch_assoc()) { echo "{$row['humidity']},"; } ?> ],
Soal Diskusi
- Perancangan Sistem dan Infrastruktur
Soal:
Deskripsikan arsitektur sistem dari stasiun cuaca berbasis ESP32 dengan sensor DHT11 serta PHP–MySQL. Apa saja komponen utama dan bagaimana alur data dijalankan dari sensor hingga tampil di web?
Point diskusi:
- Peran ESP32, DHT11, koneksi Wi-Fi
- Server (XAMPP lokal atau hosting) dan struktur database
- PHP untuk penerimaan data (POST) dan visualisasi
- Tantangan dalam integrasi komponen hardware dan web
- Sensor dan Ketepatan Data
Soal:
Sensor DHT11 biasa digunakan karena murah dan mudah digunakan. Namun, ada keterbatasan akurasi dibanding DHT22 atau BME280. Analisis dampaknya terhadap hasil yang ditampilkan. Dalam situasi apa sensor DHT11 sudah cukup? Kapan sebaiknya diganti?
Point diskusi:
- Rentang pengukuran dan presisi DHT11 vs alternatif
- Tipe aplikasi yang toleran terhadap presisi rendah
- Keterbatasan sampling rate dan kestabilan jangka panjang
- Pemrograman ESP32 dan IoT
Soal:
Proyek ini menggunakan ESP32 yang dikode melalui Arduino IDE. Apa kelebihan pilihan ini dibanding menggunakan platform seperti MicroPython atau mengintegrasikan langsung ke platform cloud (misalnya Ubidots, ThingSpeak)?
Point diskusi:
- Pro & kontra Arduino IDE vs MicroPython (kemudahan, performa, komunitas)
- Mengapa memilih backend sendiri (PHP + MySQL) vs platform IoT siap pakai
- Skalabilitas, fleksibilitas, dan kontrol data saat hosting sendiri
- Keamanan dan Infrastruktur Web
Soal:
Jika sistem ini ditempatkan secara online, apa risiko keamanannya? Bagaimana cara mengamankan endpoint PHP dan data dari ESP32 (validasi input, API key, HTTPS, dll.)?
Point diskusi:
- Perlindungan API seperti API key dan validasi
- Pentingnya HTTPS dan sertifikat SSL
- Perlindungan SQL Injection dan sanitasi input
- Keamanan database dan akses web
- Optimasi dan Fitur Tambahan
Soal:
Bagaimana cara memperkaya proyek ini agar lebih user-friendly dan efisien? Misalnya dengan menambahkan visualisasi data real-time, notifikasi, atau efisiensi konsumsi daya pada ESP32.
Point diskusi:
- Integrasi visualisasi seperti grafik, statistik (min/max/avg)
- Alert via email atau Telegram saat suhu/kelembapan abnormal
- Implementasi deep sleep pada ESP32 untuk efisiensi daya
- Alternatif protokol seperti MQTT untuk komunikasi real-time
- Skalabilitas & Deployment
Soal:
Bayangkan Anda ingin memperluas sistem ini untuk digunakan oleh 100 pengguna yang tersebar. Apa saja tantangan dan hal-hal yang perlu disiapkan agar sistem bisa berjalan stabil?
Point diskusi:
- Penyesuaian arsitektur backend (server, load balancing)
- Database indexing dan manajemen data historis
- Manajemen keamanan multi-user dan autentikasi
- Hosting: VPS vs shared hosting vs Cloud (AWS, DigitalOcean)