Proyek ini adalah Timbangan Digital Berbasis IoT yang menggunakan sensor HX711 untuk mengukur berat benda, menampilkan hasilnya pada layar LCD, dan mengirimkan data secara nirkabel melalui Wi-Fi menggunakan modul ESP32. Sistem ini tidak hanya menunjukkan berat dalam kilogram, tetapi juga mengkategorikan berat ke dalam tiga kategori: Kecil, Sehat, dan Obesitas. Pengguna dapat mengakses data berat dan kategori secara real-time melalui halaman web sederhana dengan menghubungkan ke alamat IP perangkat. Proyek ini cocok untuk aplikasi rumah pintar, kesehatan, atau pemantauan berat di berbagai industri.
Proyek ini adalah pengembangan Timbangan Digital Berbasis IoT yang tidak hanya mengukur berat benda dan menampilkan hasilnya secara lokal melalui LCD, tetapi juga mengintegrasikan data tersebut dengan server virtual untuk penyimpanan dan analisis lebih lanjut. Sistem ini dilengkapi dengan API (Application Programming Interface) yang memungkinkan pengguna untuk mengakses, mengirim, atau memperbarui data berat melalui aplikasi seperti Postman menggunakan metode GET, POST, dan PUT. Berikut adalah deskripsi lengkap proyek ini:
1. Latar Belakang
Dalam era digital, perangkat pintar yang dapat terhubung ke server untuk berbagi dan menyimpan data sangat diminati. Timbangan digital tradisional biasanya hanya menampilkan hasil pengukuran secara lokal tanpa kemampuan integrasi data. Proyek ini dirancang untuk:
2. Komponen Utama
3. Cara Kerja Sistem
#include "HX711.h"
#include <WiFi.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
// Pin untuk HX711
const int pinDOUT = 2;
const int pinSCK = 4;
HX711 scale;
// Pin dan konfigurasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// WiFi konfigurasi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* serverUrl = "http://152.42.180.245:2320/config";
void setup() {
Serial.begin(115200);
// Inisialisasi HX711
scale.begin(pinDOUT, pinSCK);
scale.set_scale(0.42); // Kalibrasi nilai sesuai kebutuhan
scale.tare(); // Reset berat ke nol
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Koneksi ke WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi!");
}
void loop() {
if (scale.is_ready()) {
long reading = scale.get_units(3); // Membaca rata-rata dari 3 kali pengukuran
float kg = float(reading) / 1000; // Konversi ke kilogram
Serial.print("Berat: ");
Serial.print(kg, 2);
Serial.println(" kg");
// Menentukan kategori berat
String kategori;
if (kg < 2.0) {
kategori = "Kecil";
} else if (kg >= 2.0 && kg < 3.0) {
kategori = "Sehat";
} else {
kategori = "Obesitas";
}
// Menampilkan hasil ke LCD
lcd.setCursor(0, 0);
lcd.print("Berat: " + String(kg, 2) + "kg");
lcd.setCursor(0, 1);
lcd.print("Kategori: " + kategori);
delay(2000);
// Mengirim data ke server
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl );
http.addHeader("Content-Type", "application/json");
// Membuat JSON data
String jsonData = "{ \"weight\": " + String(kg, 2) + ", \"kategori\": \"" + kategori + "\"}";
int httpResponseCode = http.POST(jsonData);
// Cek respons dari server
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Data sent: " + jsonData);
Serial.println("Server response: " + response);
} else {
Serial.printf("Error sending data, HTTP response code: %d\n", httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi not connected.");
}
} else {
Serial.println("Error: Sensor tidak siap!");
lcd.setCursor(0, 0);
lcd.print("Sensor Error...");
delay(2000);
lcd.clear();
}
delay(5000); // Tunggu 5 detik sebelum membaca ulang
}
from flask import Flask, request, jsonify
import mysql.connector
# Membuat aplikasi Flask
app = Flask(__name__)
# Membuat koneksi ke database MySQL
db = mysql.connector.connect(
host="localhost", # Host database
user="root", # Username database
password="root", # Password database
database="iot_config" # Nama database
)
# Endpoint untuk menyimpan data baru
@app.route('/config', methods=['POST'])
def save_config():
# Mendapatkan data dari request dalam format JSON
data = request.json
try:
# Membuat cursor untuk menjalankan query
cursor = db.cursor()
# Query untuk memasukkan data baru ke tabel 'config'
query = "INSERT INTO config (weight, kategori) VALUES (%s, %s)"
# Mengeksekusi query dengan parameter data
cursor.execute(query, (data['weight'], data['kategori']))
# Menyimpan perubahan ke database
db.commit()
# Mengembalikan pesan sukses dalam format JSON
return jsonify({"status": "success", "message": "Insert Successfully"})
except Exception as e:
# Mengembalikan pesan error dalam format JSON
return jsonify({"status": "error", "message": str(e)})
# Endpoint untuk mendapatkan semua data
@app.route('/config', methods=['GET'])
def get_config():
# Membuat cursor dengan dictionary=True untuk mendapatkan hasil dalam bentuk dictionary
cursor = db.cursor(dictionary=True)
# Query untuk mengambil semua data dari tabel 'config'
cursor.execute("SELECT * FROM config")
# Mengambil semua hasil query
result = cursor.fetchall()
# Mengembalikan hasil dalam format JSON
return jsonify(result)
# Endpoint untuk memperbarui data (belum lengkap)
@app.route('/config/<id>', methods=['PUT'])
def update_config(id):
# Mendapatkan data dari request dalam format JSON
data = request.json
# ... (kode untuk memperbarui data berdasarkan ID)
try:
cursor = db.cursor()
query = "UPDATE config SET weight = %s, kategori = %s WHERE id = %s"
cursor.execute(query, (data['weight'], data['kategori'], id))
db.commit()
return jsonify({"status": "success", "message": "Update Successfully"})
except Exception as e:
return jsonify({"status": "error", "message": str(e)})
If __name__ == ‘__main__’:
App.run(host=’0.0.0.0’, port = 2320)
Sensor HX711 membaca berat benda, mengolahnya, dan mengonversi hasil ke dalam satuan kilogram.
Data ini dikirimkan ke ESP32/ESP8266 untuk diproses lebih lanjut.
Berat benda dan kategori (Kecil, Sehat, Obesitas) ditampilkan di layar LCD I2C.
ESP32/ESP8266 mengirimkan data berat ke server virtual menggunakan metode HTTP POST.
Data berat yang sudah tersimpan di server dapat diakses kembali melalui HTTP GET.
Pengguna juga dapat memperbarui data yang ada menggunakan HTTP PUT.
Jika sensor gagal membaca data atau server tidak merespons, sistem menampilkan pesan kesalahan di LCD dan Serial Monitor.
4. Alur API dan Data ke Server Virtual
a. Endpoint API:
GET /weight
Mengambil semua data berat yang tersimpan di server.
POST /weight
Mengirim data berat baru ke server. Data dikirim dalam format JSON.
PUT /weight/{id}
Memperbarui data berat berdasarkan ID. Data baru dikirim dalam format JSON.
5. Fitur Utama
Pengukuran Berat Akurat:
Sensor HX711 memberikan hasil pengukuran berat dengan presisi tinggi.
Antarmuka Visual Lokal:
Layar LCD I2C menampilkan berat benda dan kategori secara real-time.
Integrasi dengan Server Virtual:
Data berat tersimpan di server untuk analisis dan pelacakan lebih lanjut.
API Berbasis HTTP:
Mendukung metode GET, POST, dan PUT untuk fleksibilitas pengolahan data.
Pengujian API dengan Postman:
Endpoint API diuji menggunakan Postman untuk memastikan pengiriman, pembacaan, dan pembaruan data berjalan lancar.
Kategori Berat Otomatis:
Sistem secara otomatis mengkategorikan berat benda berdasarkan parameter yang ditentukan.
6. Kesimpulan
Proyek Timbangan Digital Berbasis IoT dengan Integrasi Server Virtual dan API ini menawarkan solusi modern untuk pengukuran dan pelacakan berat secara otomatis. Dengan kemampuan mengintegrasikan data ke server dan API, sistem ini memberikan fleksibilitas tinggi untuk berbagai aplikasi di era digital, menjadikannya perangkat pintar yang andal dan fungsional.
0 Orang Menyukai Karya Ini