GithubHelp home page GithubHelp logo

sistem-mikrokontroller's Introduction

Final Proyek Mikrokontroller

Kelompok

  • Kelompok: 12
  • Proyek: Smarthome
  • Anggota:

Judul Proyek 1

Smarthome dengan Platform Blynk

Penjelasan

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.

Alat-alat

Spesifikasi Proyek

  1. Platform Blynk
  2. Relay 2 Channel untuk menyalakan LED
  3. Potensiometer untuk mengatur kecerahan LED dengan PWM
  4. DHT22 untuk mengukur suhu dan kelembapan
  5. Prediksi kondisi berdasarkan suhu dan kelembapan
  6. Restful API untuk integrasi Smarthome

Komponen yang Diperlukan

  1. ESP32
  2. Relay 2 Channel
  3. LED
  4. Potensiometer
  5. DHT22
  6. Platform Blynk

Dokumentasi Wokwi

#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.

Judul Proyek 2

Smarthome dengan Platform Blynk, RESTful API dan MQTT

Pembagian Tim

Anggota 1 : Smarthome dengan Platform Blynk

Anggota 2 : Smarthome dengan RESTful API

Anggota 3 : Smarthome dengan MQTT

Anggota 1 : Proyek Smarthome dengan Platform Blynk

Penjelasan Proyek

Demo Proyek Smarthome dengan MQTT

Anggota 2 : Proyek Smarthome dengan RESTful API

Smarthome dengan RESTful API

Penjelasan Proyek

Spesifikasi

  1. Mock API sebagai RESTful API:
    • Gunakan layanan mock API (seperti jsonplaceholder atau mockapi.io) untuk membuat endpoint API palsu.
  2. 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.
  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.

1. Mock API sebagai RESTful API

Langkah-langkah:

  1. Daftar di Mock API Service:

    • Pergi ke mockapi.io dan buat akun jika belum memiliki.
    • Buat proyek baru dan tambahkan resource untuk relays dan sensors.
  2. Buat Endpoint API:

    • Tambahkan data dummy untuk relays dan sensors.
    • 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.

2. Tampilan Website dengan HTML, CSS, dan JS

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();
}

Demo Proyek Smarthome dengan RESTful API

Anggota 3 : Proyek Smarthome dengan MQTT

Penjelasan Proyek

Spesifikasi

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.

1. 1. EMQX sebagai MQTT Broker:

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.

2. Tampilan Website dengan HTML, CSS, dan JS

HTML:/smarthome-mqtt/index.html

<title>Smart Home</title>

Smart Home Control

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++; } }

Demo Proyek Smarthome dengan MQTT

sistem-mikrokontroller's People

Contributors

ages96 avatar 26babyl avatar agussetiawanz avatar

Watchers

 avatar

Forkers

agussetiawanz

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.