- Mata Kuliah: Sistem Mikrokontroller
- Dosen Pengampu: Muhammad Ikhwan Fathulloh
Smarthome dengan Platform Blynk
Membuat proyek Smarthome dengan ESP32 yang terhubung ke platform Blynk. Proyek ini mencakup kontrol relay untuk menyalakan LED, pengaturan kecerahan LED dengan potensiometer, pembacaan suhu dan kelembapan dengan DHT22, serta prediksi kondisi berdasarkan suhu dan kelembapan.
- Platform Blynk
- Relay 2 Channel untuk menyalakan LED
- Potensiometer untuk mengatur kecerahan LED dengan PWM
- DHT22 untuk mengukur suhu dan kelembapan
- Prediksi kondisi berdasarkan suhu dan kelembapan
- Restful API untuk integrasi Smarthome
- ESP32
- Relay 2 Channel
- LED
- Potensiometer
- DHT22
- Platform Blynk
#define BLYNK_TEMPLATE_ID "YourTemplateID"
#define BLYNK_DEVICE_NAME "YourDeviceName"
#define BLYNK_AUTH_TOKEN "YourAuthToken"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
- Library WiFi.h: Digunakan untuk menghubungkan ESP32 ke jaringan WiFi.
- Library BlynkSimpleEsp32.h: Digunakan untuk menghubungkan ESP32 ke platform Blynk.
- Library DHT.h: Digunakan untuk membaca data dari sensor DHT22.
- BLYNK_TEMPLATE_ID, BLYNK_DEVICE_NAME, BLYNK_AUTH_TOKEN: Konstanta ini digunakan untuk menghubungkan perangkat ke Blynk.
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define RELAY1_PIN 12
#define RELAY2_PIN 13
#define POT_PIN 34
#define LED_PIN 2
float temperature;
float humidity;
BlynkTimer timer;
- auth, ssid, pass: Variabel ini menyimpan token autentikasi Blynk, nama SSID, dan kata sandi WiFi.
- DHTPIN, DHTTYPE, DHT dht: Pin dan tipe sensor DHT22 serta inisialisasi sensor.
- RELAY1_PIN, RELAY2_PIN, POT_PIN, LED_PIN: Pin yang digunakan untuk relay, potensiometer, dan LED.
- temperature, humidity: Variabel untuk menyimpan data suhu dan kelembapan.
- BlynkTimer timer: Timer yang digunakan untuk menjadwalkan fungsi tertentu.
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
dht.begin();
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
timer.setInterval(1000L, sendSensorData);
}
- Serial.begin(115200): Inisialisasi komunikasi serial dengan baud rate 115200.
- Blynk.begin(auth, ssid, pass): Menghubungkan ESP32 ke Blynk menggunakan token autentikasi, SSID, dan kata sandi WiFi.
- dht.begin(): Inisialisasi sensor DHT22.
- pinMode: Menentukan mode pin sebagai OUTPUT untuk relay dan LED.
- timer.setInterval(1000L, sendSensorData): Menjadwalkan fungsi sendSensorData untuk dijalankan setiap 1000 milidetik (1 detik).
void sendSensorData() {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V5, temperature);
Blynk.virtualWrite(V6, humidity);
String condition = predictCondition(temperature, humidity);
Blynk.virtualWrite(V7, condition);
}
- temperature = dht.readTemperature(): Membaca suhu dari sensor DHT22.
- humidity = dht.readHumidity(): Membaca kelembapan dari sensor DHT22.
- isnan(temperature) || isnan(humidity): Memeriksa apakah pembacaan sensor gagal (jika nilai tidak valid).
- Blynk.virtualWrite(V5, temperature): Mengirim data suhu ke widget di aplikasi Blynk.
- Blynk.virtualWrite(V6, humidity): Mengirim data kelembapan ke widget di aplikasi Blynk.
- predictCondition(temperature, humidity): Memanggil fungsi untuk memprediksi kondisi berdasarkan suhu dan kelembapan.
- Blynk.virtualWrite(V7, condition): Mengirim hasil prediksi ke widget di aplikasi Blynk.
String predictCondition(float temp, float hum) {
if (temp > 30 && hum > 70) {
return "Hot and Humid";
} else if (temp > 30) {
return "Hot";
} else if (hum > 70) {
return "Humid";
} else {
return "Comfortable";
}
}
- predictCondition(float temp, float hum): Fungsi ini mengembalikan string yang menunjukkan kondisi berdasarkan suhu dan kelembapan: A. Hot and Humid: Jika suhu > 30°C dan kelembapan > 70%. B. Hot: Jika suhu > 30°C. C. Humid: Jika kelembapan > 70%. D. Comfortable: Jika tidak ada kondisi di atas yang terpenuhi.
BLYNK_WRITE(V1) {
int relay1State = param.asInt();
digitalWrite(RELAY1_PIN, relay1State);
}
BLYNK_WRITE(V2) {
int relay2State = param.asInt();
digitalWrite(RELAY2_PIN, relay2State);
}
BLYNK_WRITE(V3) {
int potValue = param.asInt();
analogWrite(LED_PIN, potValue);
}
- BLYNK_WRITE(V1): Fungsi ini dipanggil ketika nilai virtual pin V1 di Blynk berubah. Mengubah status relay 1.
- BLYNK_WRITE(V2): Fungsi ini dipanggil ketika nilai virtual pin V2 di Blynk berubah. Mengubah status relay 2.
- BLYNK_WRITE(V3): Fungsi ini dipanggil ketika nilai virtual pin V3 di Blynk berubah. Mengubah nilai PWM pada pin LED sesuai dengan nilai dari potensiometer.
void loop() {
Blynk.run();
timer.run();
}
- Blynk.run(): Menjaga koneksi Blynk tetap aktif dan memproses event.
- timer.run(): Menjalankan fungsi timer yang telah dijadwalkan.
#include <WiFi.h>
#include <WebServer.h>
// Create an instance of the server
WebServer server(80);
// Rest API endpoint handlers
void handleRoot() {
server.send(200, "text/plain", "Welcome to Smarthome API");
}
void handleGetStatus() {
String message = "Temperature: " + String(temperature) + "\n";
message += "Humidity: " + String(humidity) + "\n";
message += "Relay 1: " + String(digitalRead(RELAY1_PIN)) + "\n";
message += "Relay 2: " + String(digitalRead(RELAY2_PIN)) + "\n";
server.send(200, "text/plain", message);
}
void setup() {
// Existing setup code...
// Start the server
server.begin();
// Define API endpoints
server.on("/", handleRoot);
server.on("/status", handleGetStatus);
// Initialize other endpoints as needed
}
void loop() {
Blynk.run();
timer.run();
server.handleClient();
}
Untuk menambahkan Restful API.
- WebServer server(80): Membuat instance server pada port 80.
- server.begin(): Memulai server.
- server.on("/", handleRoot): Menangani permintaan ke root URL dengan fungsi handleRoot.
- server.on("/status", handleGetStatus): Menangani permintaan ke URL /status dengan fungsi handleGetStatus.
Smarthome dengan Platform Blynk, RESTful API dan MQTT
Anggota 1 : Smarthome dengan Platform Blynk
Anggota 2 : Smarthome dengan RESTful API
Anggota 3 : Smarthome dengan MQTT
- Mock API sebagai RESTful API:
- Gunakan layanan mock API (seperti jsonplaceholder atau mockapi.io) untuk membuat endpoint API palsu.
- Tampilan Website dengan HTML, CSS, dan JS:
- Buat halaman web yang menggunakan HTML, CSS, dan JS untuk berinteraksi dengan API.
- Buat tampilan untuk mengendalikan relay dan menampilkan data sensor.
- Relay 2 Channel untuk Menyalakan LED:
- Hubungkan relay 2 channel ke mikrokontroller.
- Buat skema rangkaian untuk menghubungkan relay ke LED.
- Sensor Bebas:
- Pilih sensor lain untuk digunakan (misalnya, sensor jarak atau sensor cahaya).
- Hubungkan sensor tersebut ke mikrokontroller dan baca datanya.
Langkah-langkah:
-
Daftar di Mock API Service:
- Pergi ke mockapi.io dan buat akun jika belum memiliki.
- Buat proyek baru dan tambahkan resource untuk
relays
dansensors
.
-
Buat Endpoint API:
- Tambahkan data dummy untuk
relays
dansensors
. - Endpoint contoh:
GET /relays
untuk mendapatkan daftar relay.POST /relays
untuk menambah atau mengubah status relay.GET /sensors
untuk mendapatkan data sensor.POST /sensors
untuk menambah atau mengubah data sensor.
- Tambahkan data dummy untuk
HTML:/smarthome-restapi/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Smarthome Dashboard</title>
<link rel="stylesheet" href="/smarthome-restapi/styles.css">
</head>
<body>
<div id="app">
<h1>Smarthome Dashboard</h1>
<div id="relay-control">
<h2>Relay Control</h2>
<button onclick="toggleRelay(1)">Toggle Relay 1</button>
<button onclick="toggleRelay(2)">Toggle Relay 2</button>
</div>
<div id="sensor-data">
<h2>Sensor Data</h2>
<ul id="sensor-list"></ul>
</div>
</div>
<script src="/smarthome-restapi/scripts.js"></script>
</body>
</html>
CSS:/smarthome-restapi/style.css
css
body {
font-family: Arial, sans-serif;
}
#app {
width: 600px;
margin: 0 auto;
}
h1, h2 {
text-align: center;
}
#relay-control, #sensor-data {
margin: 20px 0;
}
JS:/smarthome-restapi/script.js
const API_URL = 'https://66a481c45dc27a3c19090f94.mockapi.io';
document.addEventListener('DOMContentLoaded', () => {
fetchSensorData();
});
function toggleRelay(relayId) {
fetch(`${API_URL}/relays/${relayId}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ state: 'toggle' })
})
.then(response => response.json())
.then(data => {
console.log(`Relay ${relayId} toggled`, data);
})
.catch(error => console.error('Error:', error));
}
function fetchSensorData() {
fetch(`${API_URL}/sensors`)
.then(response => response.json())
.then(data => {
const sensorList = document.getElementById('sensor-list');
sensorList.innerHTML = '';
data.forEach(sensor => {
const li = document.createElement('li');
li.textContent = `Sensor ${sensor.id}: ${sensor.value}`;
sensorList.appendChild(li);
});
})
.catch(error => console.error('Error:', error));
}
Arduino : Wowki https://wokwi.com/projects/404543147358835713
arduino
#define BLYNK_TEMPLATE_ID "TMPL6V8BMAwlT"
#define BLYNK_TEMPLATE_NAME "BelajarBlynk"
#define BLYNK_AUTH_TOKEN "le4Ti3_UcNgSpeL3gMVVs_qdIIuHoDHo"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHTesp.h> // Library untuk DHT
#include <HTTPClient.h>
#include <ArduinoJson.h>
char auth[] = BLYNK_AUTH_TOKEN; // Auth Token
char ssid[] = "Wokwi-GUEST"; // Nama hotspot yang digunakan
char pass[] = ""; // Password hotspot yang digunakan
const int DHT_PIN = 15;
int value0, value1;
byte LED_R = 26;
byte LED_Y = 27;
DHTesp dht;
BlynkTimer timer;
// URL Mock API
const char* mockApiUrl = "https://66a481c45dc27a3c19090f94.mockapi.io";
// Function untuk pengiriman sensor
void sendSensor()
{
TempAndHumidity data = dht.getTempAndHumidity();
// Menampilkan temperature pada Serial monitor
Serial.print("% Temperature: ");
Serial.print(data.temperature);
Serial.println("C ");
Serial.print("% Kelembaban: ");
Serial.print(data.humidity);
Serial.println("% ");
Blynk.virtualWrite(V2, data.temperature); // Mengirimkan data temperatur ke Virtual pin V2 di Blynk Cloud
Blynk.virtualWrite(V3, data.humidity); // Mengirimkan data kelembaban ke Virtual pin V3 di Blynk Cloud
// Mengirim data ke mock API
if(WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(mockApiUrl);
http.addHeader("Content-Type", "application/json");
StaticJsonDocument<200> jsonDoc;
jsonDoc["temperature"] = data.temperature;
jsonDoc["humidity"] = data.humidity;
String requestBody;
serializeJson(jsonDoc, requestBody);
int httpResponseCode = http.POST(requestBody);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode);
Serial.println(response);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
http.end();
}
}
BLYNK_WRITE(V0)
{
value0 = param.asInt();
digitalWrite(LED_R, value0);
}
BLYNK_WRITE(V1)
{
value1 = param.asInt();
digitalWrite(LED_Y, value1);
}
void setup()
{
// Debug console
Serial.begin(115200);
dht.setup(DHT_PIN, DHTesp::DHT22);
pinMode(LED_R, OUTPUT);
pinMode(LED_Y, OUTPUT);
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000, sendSensor);
}
void loop()
{
Blynk.run();
timer.run();
}
- Github: Github
1. EMQX sebagai MQTT Broker -Instal dan konfigurasikan EMQX sebagai broker MQTT.
2. Tampilan Website dengan HTML, CSS, dan JS: -Buat halaman web yang menggunakan HTML, CSS, dan JS untuk berinteraksi dengan brokerMQTT. -Buat tampilan untuk mengendalikan relay dan menampilkan data sensor.
3. Relay 2 Channel untuk Menyalakan LED: -Hubungkan relay 2 channel ke mikrokontroller. -Buat skema rangkaian untuk menghubungkan relay ke LED.
4. Sensor Bebas: -Pilih sensor lain untuk digunakan (misalnya, sensor jarak atau sensor cahaya). -Hubungkan sensor tersebut ke mikrokontroller dan baca datanya.
LangkaH-langkah
1.Instalasi EMQX dan Konfigurasi:
- Unduh EMQX dari situs resmi EMQX.
- Ikuti petunjuk instalasi yang sesuai dengan sistem operasi Anda.
2.Konfigurasi EMQX:
- Buka file konfigurasi EMQX (emqx.conf) dan sesuaikan pengaturan seperti port dan pengaturan keamanan jika diperlukan.
- Start EMQX dengan menjalankan perintah ./emqx start atau menggunakan service manager
sesuai OS Anda.
HTML:/smarthome-mqtt/index.html
<title>Smart Home</title> Relay 1 Relay 2 <script src="scripts.js"></script>CSS:/smarthome-mqtt/style.css
body { font-family: Arial, sans-serif; text-align: center; background-color: #f4f4f4; }
button { margin: 10px; padding: 10px 20px; font-size: 16px; }
#sensor-data { margin-top: 20px; }
JS:/smarthome-mqtt/script.js
const brokerUrl = 'ws://your-mqtt-broker-url:port'; const clientId = 'clientId-' + Math.random().toString(16).substr(2, 8); const client = new Paho.MQTT.Client(brokerUrl, clientId);
client.connect({onSuccess: onConnect});
function onConnect() { console.log("Connected to MQTT broker"); client.subscribe('sensor/data'); }
document.getElementById('relay1').onclick = () => { client.publish('relay/control', '1'); };
document.getElementById('relay2').onclick = () => { client.publish('relay/control', '2'); };
client.onMessageArrived = (message) => { if (message.destinationName === 'sensor/data') { document.getElementById('sensor-data').innerHTML = 'Sensor Data: ' + message.payloadString; } };
Arduino : Wowki https://wokwi.com/projects smarthome-mqtt/ #include <WiFi.h> #include <MQTT.h>
const char ssid[] = "Wokwi-GUEST"; const char pass[] = "";
WiFiClient net; MQTTClient client;
unsigned long lastMillis = 0;
int count = 0;
void connect() { Serial.print("checking wifi..."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); }
Serial.print("\nconnecting..."); while (!client.connect("arduino", "public", "public")) { Serial.print("."); delay(1000); }
Serial.println("\nconnected!");
client.subscribe("koalawan/iot/kontak1"); client.subscribe("koalawan/iot/kontak2"); client.subscribe("koalawan/iot/count"); client.subscribe("koalawan/iot/temp"); client.subscribe("koalawan/iot/humd"); }
void messageReceived(String &topic, String &payload) { Serial.println(topic + ": " + payload); if (topic == "koalawan/iot/kontak1") { Serial.println("LED1 " + payload); digitalWrite(19, payload.toInt()); }
if (topic == "koalawan/iot/kontak2") { Serial.println("LED2 " +payload); digitalWrite(18, payload.toInt()); } }
void setup() { Serial.begin(115200);
// start wifi and mqtt WiFi.begin(ssid, pass); client.begin("public.cloud.shiftr.io", net); client.onMessage(messageReceived);
pinMode(19, OUTPUT); pinMode(18, OUTPUT);
connect(); }
void loop() { client.loop(); delay(10);
// check if connected if (!client.connected()) { connect(); }
// publish a message roughly every second. if (millis() - lastMillis > 2000) { lastMillis = millis(); client.publish("/koalawan/iot/temperature", String(count)); client.publish("/koalawan/iot/humidity", String(count)); count++; } }