AI Assistant
Detail Karya Portofolio

Timbangan Digital Berbasis IoT

Muhammad Harits Zulkifli Oleh: Muhammad Harits Zulkifli

Ringkasan Portofolio

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.

Deskripsi & Detail Proyek

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: 

  • Mengukur berat benda dengan sensor HX711 secara akurat. 
  • Menampilkan data secara real-time di layar LCD. 
  • Mengintegrasikan hasil pengukuran ke server virtual untuk penyimpanan dan akses jarak jauh. 
  • Memberikan kemampuan interaksi data melalui API yang mendukung metode GET, POST, dan PUT untuk fleksibilitas pengolahan data. 
  • Aplikasi ini sangat berguna untuk bidang kesehatan, logistik, atau aplikasi industri lainnya yang membutuhkan pelacakan data berat secara otomatis dan berbasis jaringan. 

2. Komponen Utama 

  • Sensor Berat HX711: Digunakan untuk mengukur berat benda dengan presisi tinggi. Data dikalibrasi untuk memastikan hasil yang akurat dalam satuan kilogram. 
  • LCD I2C 16x2: Digunakan untuk menampilkan berat benda dan kategori berat secara langsung kepada pengguna. 
  • ESP32: Modul mikrokontroler dengan konektivitas Wi-Fi yang bertugas untuk:  
    • Mengirimkan data ke server virtual melalui protokol HTTP. 
    • Menyediakan API untuk interaksi data. 
  • Server Virtual: Berfungsi sebagai tempat penyimpanan data berat. Server ini dapat diakses untuk membaca, menambah, atau memperbarui data menggunakan API. 
  • Postman: Digunakan untuk menguji endpoint API dan memverifikasi fungsi GET, POST, dan PUT pada server virtual. 

3. Cara Kerja Sistem 

  • Source Code : 
    • Wokwi 

#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 

  • Flask 

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) 

  • Proses Pengukuran Berat

Sensor HX711 membaca berat benda, mengolahnya, dan mengonversi hasil ke dalam satuan kilogram. 

Data ini dikirimkan ke ESP32/ESP8266 untuk diproses lebih lanjut. 

  • Tampilan Lokal

Berat benda dan kategori (Kecil, Sehat, Obesitas) ditampilkan di layar LCD I2C. 

 

  • Integrasi dengan Server Virtual

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. 

  • Penggunaan API di Postman
    • GET: Mengambil data berat dari server virtual. 
    • POST: Menambahkan data baru ke server. 
    • PUT: Memperbarui data berat yang sudah tersimpan. 
  • Pengolahan Kesalahan

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.