#include <WiFi.h>
#include <HTTPClient.h>
#include <HX711.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
// ====================== WIFI =====================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ====================== SERVER =====================
const char* serverName = "http://iot.informatika-unes.com/api/timbang"; // Ganti dengan URL server kamu
// ====================== HX711 (Timbangan) =====================
#define DT 32
#define SCK 33
HX711 scale;
// ====================== RFID =====================
#define RST_PIN 22
#define SS_PIN 21
MFRC522 rfid(SS_PIN, RST_PIN); // SDA, RST
// ====================== LCD =====================
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ====================== PIN =====================
const int tombolPin = 15;
const int ledHijau = 26;
const int ledMerah = 27;
// ====================== UID → Nama Dummy =====================
String getNamaByUID(String uid) {
uid.toUpperCase();
if (uid == "A1B2C3D4") return "Andi";
if (uid == "11223344") return "Siti";
return "Tidak Dikenal";
}
void setup() {
Wire.begin(21, 22); // Wokwi default I2C
Serial.begin(115200);
pinMode(tombolPin, INPUT_PULLUP);
pinMode(ledHijau, OUTPUT);
pinMode(ledMerah, OUTPUT);
while (!Serial);
Serial.println("\nI2C Scanner");
// LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Timbangan IoT");
// RFID
SPI.begin();
rfid.PCD_Init();
// Load Cell
scale.begin(DT, SCK);
scale.set_scale(420.0); // Sesuaikan hasil kalibrasi
scale.tare();
// WiFi
lcd.setCursor(0, 1);
lcd.print("Menghubungkan...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Terhubung");
lcd.clear();
lcd.print("WiFi Terhubung!");
delay(1000);
lcd.clear();
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Scan Kartu... ");
// Cek kartu RFID
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
delay(100);
return;
}
// Baca UID
String uid = "";
for (byte i = 0; i < rfid.uid.size; i++) {
uid += String(rfid.uid.uidByte[i], HEX);
}
uid.toUpperCase();
Serial.println("UID: " + uid);
// Cek nama pengguna
String nama = getNamaByUID(uid);
Serial.println("Nama: " + nama);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nama:");
lcd.setCursor(0, 1);
lcd.print(nama);
delay(2000);
// Timbang
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Timbang...");
scale.tare();
delay(2000);
float berat = scale.get_units(10);
Serial.print("Berat: ");
Serial.println(berat);
lcd.setCursor(0, 1);
lcd.print("Berat: " + String(berat, 2) + " kg");
// Tunggu tombol kirim
lcd.setCursor(0, 0);
lcd.print("Tekan Kirim...");
while (digitalRead(tombolPin) == HIGH) {
delay(100);
}
// Kirim ke server
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverName);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
String postData = "uid=" + uid + "&nama=" + nama + "&berat=" + String(berat, 2);
Serial.println("Mengirim: " + postData);
int httpResponseCode = http.POST(postData);
String response = http.getString();
lcd.clear();
if (httpResponseCode == 200) {
Serial.println("✅ Terkirim");
lcd.print("Data Terkirim!");
digitalWrite(ledHijau, HIGH);
digitalWrite(ledMerah, LOW);
} else {
Serial.println("❌ Gagal Kirim");
Serial.println(response);
lcd.print("Gagal Kirim!");
digitalWrite(ledMerah, HIGH);
digitalWrite(ledHijau, LOW);
}
http.end();
} else {
Serial.println("❌ Tidak Terhubung ke WiFi");
lcd.clear();
lcd.print("Koneksi Gagal");
digitalWrite(ledMerah, HIGH);
digitalWrite(ledHijau, LOW);
}
delay(3000);
digitalWrite(ledHijau, LOW);
digitalWrite(ledMerah, LOW);
lcd.clear();
// Reset RFID
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}