AI Assistant
Detail Karya Portofolio

Monitoring Nilai Potensiometer Backend Flask

Rima Nur Badriyah Oleh: Rima Nur Badriyah

Ringkasan Portofolio

Project  ini mengintegrasikan teknologi Flask sebagai backend untuk menyimpan dan memproses data IoT yang diterima dari simulator Wokwi. Dengan endpoint API seperti POST, PUT, dan GET, proyek ini mempermudah pengelolaan data berbasis IoT

Deskripsi & Detail Proyek

Langkah-Langkah Implementasi

A. Backend Flask

  1. Setup Backend:
    • Flask digunakan sebagai server untuk menerima data POST dari ESP32.
    • MySQL digunakan untuk menyimpan data yang dikirim.
  2. API Endpoint:
    • POST /data: Menerima data dari ESP32 dalam format JSON dan menyimpannya ke database.
    • GET /data: Mengembalikan semua data dalam bentuk JSON.
    • PUT /data/<id>: Memperbarui data tertentu berdasarkan ID.
  3. Kode Program Flask:  
  • Buat file config.py untuk menyimpan konfigurasi database:

db_config = {

    'host': 'localhost',  # atau IP VM

    'user': 'root',       # Username MySQL

   'password': 'root', # Password MySQL

   'database': 'iot_data'       # Nama database

}

  • Buat file app.py untuk menambahkan endpoint:

from flask import Flask, request, jsonify

from flask_cors import CORS

import mysql.connector

from config import db_config

 

app = Flask(__name__)

CORS(app)

 

# Koneksi database

def get_db_connection():

    return mysql.connector.connect(

       host=db_config['host'],

       user=db_config['user'],

       password=db_config['password'],

        database=db_config['database']

    )

 

# Endpoint POST

@app.route('/data', methods=['POST'])

def add_data():

    data = request.json

   device_name = data.get('device_name')

   data_value = data.get('data_value')

 

    conn = get_db_connection()

    cursor = conn.cursor()

    query = "INSERT INTO device_data (device_name, data_value) VALUES (%s, %s)"

   cursor.execute(query, (device_name, data_value))

   conn.commit()

   cursor.close()

   conn.close()

    return jsonify({'message': 'Data added successfully'}), 201

 

# Endpoint GET

@app.route('/data', methods=['GET'])

def get_data():

    conn = get_db_connection()

    cursor = conn.cursor(dictionary=True)

   cursor.execute("SELECT * FROM device_data ORDER BY timestamp DESC")

    data = cursor.fetchall()

   cursor.close()

   conn.close()

    return jsonify(data)

 

# Endpoint PUT

@app.route('/data/<int:data_id>', methods=['PUT'])

def update_data(data_id):

    data = request.json

   device_name = data.get('device_name')

    data_value = data.get('data_value')

 

    conn = get_db_connection()

    cursor = conn.cursor()

    query = "UPDATE device_data SET device_name = %s, data_value = %s WHERE id = %s"

   cursor.execute(query, (device_name, data_value, data_id))

   conn.commit()

   cursor.close()

   conn.close()

    return jsonify({'message': 'Data updated successfully'})

 

if __name__ == '__main__':

   app.run(debug=True, host='0.0.0.0', port=5000)

        4. Jalankan aplikasi:

python3 app.py

B. Konfigurasi Database MySQL

  1. Pastikan MySQL sudah diinstal di VM yang digunakan. Masuk ke MySQL:

mysql -u root -p

    2. Buat database dan tabel dengan file schema.sql:

CREATE DATABASE iot_data;

USE iot_data;

CREATE TABLE device_data (

    id INT AUTO_INCREMENT PRIMARY KEY,

   device_name VARCHAR(50),

   data_value FLOAT,

    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

C. Frontend IoT (ESP32)

  1. Setup ESP32:
    • ESP32 diatur untuk membaca data analog dari potensiometer melalui pin GPIO34.
    • Data analog dikonversi menjadi nilai tegangan (0-3.3V).
  2. Komunikasi dengan LCD:
    • LCD I2C digunakan untuk menampilkan nilai data sensor.
    • ESP32 berkomunikasi dengan LCD melalui pin SDA (GPIO21) dan SCL (GPIO22).
  3. Koneksi WiFi dan Pengiriman Data:
    • ESP32 terhubung ke jaringan WiFi menggunakan SSID dan password.
    • Data sensor dikirim ke backend Flask menggunakan metode HTTP POST.
  4. Kode Program ESP32 :

#include <WiFi.h>

#include <HTTPClient.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

 

// WiFi Configuration

const char* ssid = "Wokwi-GUEST";

const char* password = "";

 

// API URL

String serverName = "http://152.42.180.245:5000/data";

 

// Sensor dan LCD

#define SENSOR_PIN 34

LiquidCrystal_I2C lcd(0x27, 16, 2);

 

void setup() {

   Serial.begin(115200);

    WiFi.begin(ssid, password);

 

   lcd.init();

   lcd.backlight();

   lcd.setCursor(0, 0);

   lcd.print("Connecting...");

 

    while (WiFi.status() != WL_CONNECTED) {

       delay(500);

       Serial.println("Connecting to WiFi...");

    }

    lcd.clear();

   lcd.setCursor(0, 0);

   lcd.print("WiFi Connected");

}

 

void loop() {

    int sensorValue = analogRead(SENSOR_PIN);

    float dataValue = sensorValue * (3.3 / 4095.0); // Convert to voltage

 

   lcd.clear();

   lcd.setCursor(0, 0);

    lcd.print("Value: ");

   lcd.print(dataValue);

 

    if (WiFi.status() == WL_CONNECTED) {

       HTTPClient http;

       http.begin(serverName);

 

       http.addHeader("Content-Type", "application/json");

       String jsonPayload = "{"device_name": "Sensor1", "data_value": " + String(dataValue) + "}";

        int httpResponseCode = http.POST(jsonPayload);

 

        if (httpResponseCode > 0) {

           Serial.println("Data sent successfully");

        } else {

           Serial.println("Failed to send data");

        }

       http.end();

    } else {

       Serial.println("WiFi Disconnected");

    }

 

   delay(5000); // Send data every 5 seconds

}

        4. Jalankan program di Wokwi, Periksa Serial Monitor untuk log pengiriman data ke backend.

D. Pengujian dengan Postman

  1. POST Data:
    • Mengirim data baru dari perangkat ke backend dan menyimpannya di database MySQL.
    • Hasil : Data berhasil dimasukkan ke database

    2. GET Data:

  • Mengambil semua data yang ada di database untuk ditampilkan atau digunakan oleh aplikasi.
  • Hasil: Mengembalikan semua data dalam database.

 

    3. PUT Data:

  • Memperbarui data tertentu di database berdasarkan ID.
  • Hasil: Data pada ID tertentu diperbarui.

 

 

E. Hasil Akhir

  1. Data dari potensiometer berhasil dikirim ke server setiap 5 detik.
  2. Nilai data sensor ditampilkan pada LCD.
  3. Backend Flask berhasil menyimpan data dan menyediakan endpoint untuk mengakses serta memperbarui data.

F. Kesimpulan

Project ini berhasil mengintegrasikan sistem monitoring berbasis IoT menggunakan ESP32, LCD, dan backend Flask. Dengan menggunakan Postman, semua endpoint berhasil diuji untuk memastikan pengiriman, pengambilan, dan pembaruan data.