#include <WiFi.h>
#include <PubSubClient.h>
#include <HX711_ADC.h>
#include <LiquidCrystal_I2C.h>
// WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT
const char* mqtt_server = "broker.emqx.io";
// const char* mqtt_server = "test.mosquitto.org";
const char* SUBTOPIC_WEIGHT = "barisanjuang/thetimbang";
WiFiClient espClient;
PubSubClient client(espClient);
// PIN Untuk Loadcell HX711
const int pinData = 4;
const int pinSCK = 5;
float nilaiLoadCell;
float beratDalamGram;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti alamat ini jika perlu
// Inisiasi nama HX711 ke LoadCell
HX711_ADC LoadCell(pinData, pinSCK);
float calibrationValue;
unsigned long timeStore = 0;
unsigned long waktuStabil = 5000; // Delay waktu stabil loadcell
boolean _tare = true; // set this to false if you don't want tare to be performed in the next step
void setup_wifi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
String clientId = "mqttx_abf8d7a6";
// String clientId = "2397";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
// Tidak perlu subscribe karena hanya publish
} else {
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
nilaiLoadCell = 0;
beratDalamGram = 0;
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Aktifkan backlight
lcd.clear(); // Bersihkan layar LCD
lcd.print("Kosongkan Muatan");
lcd.clear();
delay(5000);
setup_wifi();
// client.setServer(mqtt_server, 1883);
client.setServer(mqtt_server, 1883);
client.setCallback(NULL); // Tidak perlu callback karena hanya publish
LoadCell.begin();
// LoadCell.setReverseOutput(); // Uncomment ini jika ingin kalkulasi minus dijadikan plus
calibrationValue = 420.00; // Nilai kalibrasi yang sudah tercatat (ganti ini jika nilai yang sudah tercatat beda)
LoadCell.start(waktuStabil, _tare);
if (LoadCell.getTareTimeoutFlag()) {
Serial.println("Timeout, ada masalah pada wiring atau loadcell");
while (1);
} else {
LoadCell.setCalFactor(calibrationValue); // set calibration value (float)
Serial.println("Startup is complete");
}
}
void loop() {
static boolean newDataReady = false;
const int serialPrintInterval = 1000; // Nilai delay untuk proses pembacaan loadcell
// Cek data apakah siap dikonversi
if (LoadCell.update()) {
newDataReady = true;
}
// Menggunakan fungsi millis untuk delay
if (newDataReady) {
if (millis() > timeStore + serialPrintInterval) {
nilaiLoadCell = LoadCell.getData();
beratDalamGram = nilaiLoadCell * 1000;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.setCursor(0, 1);
lcd.print(beratDalamGram);
lcd.print(" gram");
// Konversi berat ke string
String beratStr = String(beratDalamGram, 2); // Konversi ke string dengan 2 desimal
// Kirim data ke MQTT
client.publish(SUBTOPIC_WEIGHT, beratStr.c_str());
Serial.print("Berat= ");
Serial.print(beratDalamGram);
Serial.println(" gram");
newDataReady = false;
timeStore = millis();
}
}
if (!client.connected()) {
reconnect();
}
}