#include <HX711.h>
#include <WiFi.h>
#include <PubSubClient.h>
// ---------- WiFi & MQTT ----------
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = "";
const char* MQTT_BROKER = "test.mosquitto.org";
const int MQTT_PORT = 1883;
const char* MQTT_CLIENT_ID = "esp32-mqtt-demo";
const char* TOPIC_SUB = "river/scale/cmd"; // single command topic
// We’ll publish weights on per-scale topics:
const char* TOPIC_PUB_1 = "river/scale1/weight";
const char* TOPIC_PUB_2 = "river/scale2/weight";
WiFiClient espClient;
PubSubClient mqttClient(espClient);
// ---------- Pins ----------
const int pinSCKB1 = 14;
const int pinDOUT1 = 13;
const int pinSCKB2 = 12;
const int pinDOUT2 = 11;
const int pinLED1 = 6;
const int pinLED2 = 5;
// ---------- HX711 + state ----------
HX711 scale1, scale2;
void onMessage(char* topic, byte* payload, unsigned int len) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("]: ");
for (int i = 0; i < len; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(" Connected!");
}
void connectToMQTT() {
mqttClient.setServer(MQTT_BROKER, MQTT_PORT);
mqttClient.setCallback(onMessage);
while (!mqttClient.connected()) {
Serial.print("Connecting to MQTT...");
if (mqttClient.connect(MQTT_CLIENT_ID)) {
Serial.println("connected!");
mqttClient.subscribe(TOPIC_SUB); // listen for commands
} else {
Serial.print("failed (");
Serial.print(mqttClient.state());
Serial.println("), retrying in 2s");
delay(2000);
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
connectToWiFi();
connectToMQTT();
scale1.begin(pinDOUT1, pinSCKB1);
while (!scale1.is_ready()) {
Serial.println("Waiting for scale 1...");
delay(100);
}
scale1.set_scale(4.2);
scale1.tare();
scale2.begin(pinDOUT2, pinSCKB2);
while (!scale2.is_ready()) {
Serial.println("Waiting for scale 2...");
delay(100);
}
scale2.set_scale(4.2);
scale2.tare();
pinMode(pinLED1, OUTPUT);
pinMode(pinLED2, OUTPUT);
}
void loop() {
if (!mqttClient.connected()) connectToMQTT();
mqttClient.loop();
float kg1 = 0, kg2 = 0;
if (scale1.is_ready()) {
kg1 = float(scale1.get_units(10)) / 100.0;
Serial.print("Loadcell 1: ");
Serial.print(kg1, 2);
Serial.println(" Kg");
if(kg1 < 1.0){
digitalWrite(pinLED1, HIGH);
}else{
digitalWrite(pinLED1, LOW);
}
}
if (scale2.is_ready()) {
kg2 = float(scale2.get_units(10)) / 100.0;
Serial.print("Loadcell 2: ");
Serial.print(kg2, 2);
Serial.println(" Kg");
if(kg2 < 1.0){
digitalWrite(pinLED2, HIGH);
}else{
digitalWrite(pinLED2, LOW);
}
}
delay(100);
static unsigned long lastPub = 0;
if (millis() - lastPub > 2000) {
lastPub = millis();
String p1 = String("{\"weightKg\":") + String(kg1, 3) + "}";
String p2 = String("{\"weightKg\":") + String(kg2, 3) + "}";
mqttClient.publish(TOPIC_PUB_1, p1.c_str());
mqttClient.publish(TOPIC_PUB_2, p2.c_str());
mqttClient.publish(TOPIC_PUB_3, p3.c_str());
Serial.print("Published 1: "); Serial.println(p1);
Serial.print("Published 2: "); Serial.println(p2);
}
}