AI Assistant
Detail Karya Portofolio

Kontrol Relay Berdasarkan Suhu

Sha'Bani Septriansyah Oleh: Sha'Bani Septriansyah

Ringkasan Portofolio

 Sistem Monitoring IoT ini menggunakan ESP8266 yang terhubung dengan sensor DHT11 untuk mengukur suhu dan kelembapan lingkungan. Data yang dikumpulkan kemudian dikirimkan ke server FLASK melalui HTTP, di mana data suhu, kelembapan, dan status relay disimpan dalam database MySQL. Server Flask menyediakan API untuk mengambil data yang disimpan dan menampilkannya dalam aplikasi frontend, seperti Postman, menggunakan tabel. ESP8266 juga mengontrol relay secara otomatis berdasarkan suhu yang terdeteksi, menyalakan perangkat seperti kipas jika suhu melebihi 35°C. Sistem ini memungkinkan pemantauan dan pengendalian perangkat secara jarak jauh berbasis IoT.

Deskripsi & Detail Proyek

ALAT & BAHAN
• NodeMCU ESP8266 
• Relay 1 Channel/2Channel 5V terhubung ke GPIO2
• DHT11 terhubung ke GPIO4 

////////////////////////////////////////////////////////////////////////////////// 

   1. Menyiapkan Database “shbn_sensor”  dan tabel  sensor_data
CREATE DATABASE shbn_sensor;
USE shbn_sensor;
CREATE TABLE sensor_data (
   id INT AUTO_INCREMENT PRIMARY KEY,         -- ID unik untuk setiap data
   temperature FLOAT NOT NULL,                -- Suhu dalam derajat Celsius
   humidity FLOAT NOT NULL,                   -- Kelembapan dalam persentase (%)
   relay_status TINYINT(1) NOT NULL,          -- Status relay (1 = ON, 0 = OFF)
   timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Waktu data direkam
); 

 

///////////////////////////////////////////////////////////////////////////////////////////////////

   2 . Menyiapkan Backend python di VPS
from flask import Flask, request, jsonify
import mysql.connector

app = Flask(__name__)

def db_connection():
   connection = mysql.connector.connect(
       host='localhost',        
       user='root',              
       password='root',          
       database='shbn_sensor' 
   )
   return connection

# Endpoint untuk menerima data dari sensor (POST)
@app.route('/data', methods=['POST'])
def receive_data():
   data = request.get_json()  # Mengambil data dalam format JSON
   temperature = data.get('temperature')
   humidity = data.get('humidity')
   relay_status = data.get('relay_status')  # Ambil status relay

   # Validasi input
   if temperature is None or humidity is None or relay_status is None:
       return jsonify({"error": "Invalid data"}), 400

   # Koneksi ke database dan simpan data
   connection = db_connection()
   cursor = connection.cursor()
   query = """
       INSERT INTO sensor_data (temperature, humidity, relay_status) 
       VALUES (%s, %s, %s)
   """
   cursor.execute(query, (temperature, humidity, relay_status))
   connection.commit()
   cursor.close()
   connection.close()

   return jsonify({"message": "Data saved successfully"}), 201

# Endpoint untuk memperbarui data berdasarkan ID (PUT)
@app.route('/data/<int:id>', methods=['PUT'])
def update_data(id):
   data = request.get_json()
   temperature = data.get('temperature')
   humidity = data.get('humidity')
   relay_status = data.get('relay_status')  # Ambil status relay

   # Validasi input
   if temperature is None or humidity is None or relay_status is None:
       return jsonify({"error": "Invalid data"}), 400

   # Koneksi ke database dan perbarui data berdasarkan ID
   connection = db_connection()
   cursor = connection.cursor()
   query = """
       UPDATE sensor_data 
       SET temperature = %s, humidity = %s, relay_status = %s 
       WHERE id = %s
   """
   cursor.execute(query, (temperature, humidity, relay_status, id))
   connection.commit()
   cursor.close()
   connection.close()

   if cursor.rowcount == 0:
       return jsonify({"error": "Data not found"}), 404

   return jsonify({"message": "Data updated successfully"}), 200

# Endpoint untuk melihat data terbaru (GET)
@app.route('/data', methods=['GET'])
def get_data():
   connection = db_connection()
   cursor = connection.cursor(dictionary=True)
   cursor.execute("SELECT * FROM sensor_data ORDER BY timestamp DESC LIMIT 10")
   rows = cursor.fetchall()
   cursor.close()
   connection.close()

   return jsonify(rows), 200

if __name__ == '__main__':
   app.run(host='0.0.0.0', port=6789) 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

3. Menyiapkan program untuk esp8266 nya
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <DHT.h>

// Pin dan tipe sensor DHT
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

// Pin untuk relay
#define RELAY_PIN 2

// Konfigurasi WiFi
const char* ssid = "SHBN 23_2,4G"; 
const char* password = "shbn1243";

// URL server Flask
const char* serverName = "http://152.42.180.245:6789/data";
// Buat objek WiFiClient
WiFiClient wifiClient;

void setup() {
 Serial.begin(115200);
 dht.begin();

 // Mengatur pin relay sebagai output
 pinMode(RELAY_PIN, OUTPUT);
 digitalWrite(RELAY_PIN, HIGH); // Pastikan relay mati saat awal

 // Menghubungkan ke WiFi
 Serial.print("Connecting to WiFi");
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }
 Serial.println(" WiFi connected!");
}

void loop() {
 // Membaca suhu dan kelembaban
 float temperature = dht.readTemperature();
 float humidity = dht.readHumidity();

 // Validasi pembacaan sensor
 if (isnan(temperature) || isnan(humidity)) {
   Serial.println("Failed to read from DHT sensor!");
   delay(2000);
   return;
 }

 // Menampilkan data suhu dan kelembaban
 Serial.print("Temperature: ");
 Serial.print(temperature);
 Serial.print(" °C, Humidity: ");
 Serial.print(humidity);
 Serial.println(" %");

 // Kontrol relay berdasarkan suhu
 if (temperature > 35) {
   digitalWrite(RELAY_PIN, LOW); // Nyalakan relay (Relay NC)
   Serial.println("Relay ON (Suhu > 35°C)");
 } else {
   digitalWrite(RELAY_PIN, HIGH); // Matikan relay
   Serial.println("Relay OFF (Suhu <= 35°C)");
 }

 // Mengirim data ke server jika WiFi terhubung
 if (WiFi.status() == WL_CONNECTED) {
   HTTPClient http;
   http.begin(wifiClient, serverName); // Perbarui metode dengan WiFiClient
   http.addHeader("Content-Type", "application/json"); // Header JSON

   // Tambahkan relay_status ke JSON payload
   int relayStatus = digitalRead(RELAY_PIN) == LOW ? 1 : 0; // LOW = Relay ON
   String jsonPayload = "{"temperature":"" + String(temperature) + 
                        "","humidity":"" + String(humidity) + 
                        "","relay_status":"" + String(relayStatus) + ""}";
   
   int httpResponseCode = http.POST(jsonPayload); // Kirim POST request
   
   // Menampilkan respon server
   Serial.print("HTTP Response code: ");
   Serial.println(httpResponseCode);

   http.end(); // Tutup koneksi
 } else {
   Serial.println("WiFi not connected!");
 }

 delay(5000); // Tunggu 5 detik sebelum mengirim data berikutnya
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4. Uji coba 


1. Jalankan Program app.py(backend python nya)
 


2. Nyalakan NodeMCU dan upload Program nya
 
3. (POST) Data yang dikirimkan nodemcu akan di terima oleh server dan di masukan ke database
  

4. (POST) Ujicoba POST dengan Postman
 

 

5. (GET) Selanjutnya untuk menampilkan data yang tadi terkirim dan di terima server caranya dengan menggunakan postman
Buka postman dan buat method GET  http://152.42.180.245:6789/data 
 Selanjutnya untuk mengubah tampilan data menjadi lebih mudah dibaca, buat script di bagian scripts

var template = '
<style type="text/css">
   .tftable {font-size:14px;color:#333333;width:100%;border-width: 1px;border-color: #87ceeb;border-collapse: collapse;}
   .tftable th {font-size:18px;background-color:#87ceeb;border-width: 1px;padding: 8px;border-style: solid;border-color: #87ceeb;text-align:left;}
   .tftable tr {background-color:#ffffff;}
   .tftable td {font-size:14px;border-width: 1px;padding: 8px;border-style: solid;border-color: #87ceeb;}
   .tftable tr:hover {background-color:#e0ffff;}
</style>

<table class="tftable" border="1">
   <tr>
       <th>ID</th>
       <th>Timestamp</th>
       <th>Temperature</th>
       <th>Humidity</th>
       <th>Relay Status</th>
   </tr>
   
   {{#each response}}
       <tr>
           <td>{{id}}</td>
           <td>{{timestamp}}</td>
           <td>{{temperature}}</td>
           <td>{{humidity}}</td>
           <td>{{relay_status}}</td>
       </tr>
   {{/each}}
</table>
';

function constructVisualizerPayload() {
   return { response: pm.response.json() }
}

pm.visualizer.set(template, constructVisualizerPayload());

   
Data akan muncul di Postman

6. (PUT) selanjutnya akan mencoba mengubah data dengan method PUT di postman. Caranya buat method PUT http://152.42.180.245:6789/data/ ( masukan id yg ingin di ubah)
 

Data berhasil di ubah 
 


7. Ujicoba Fitur Relay nyala otomatis saat suhu > 35 derajat C

Saat suhu <35
 

Saat Suhu >35