#include <Arduino.h>
#include <Wire.h>
#include "HX711.h"
#include <LiquidCrystal_I2C.h>
// --- KONFIGURACJA PINÓW ---
const int HX711_DOUT = 18;
const int HX711_SCK = 19;
const int TARE_BUTTON_PIN = 23;
const int CALIBRATE_BUTTON_PIN = 32;
// --- KONFIGURACJA WYŚWIETLACZA LCD ---
const int LCD_COLS = 16;
const int LCD_ROWS = 2;
const int LCD_ADDR = 0x27;
// --- KONFIGURACJA WAGI ---
const float KNOWN_WEIGHT = 990.0;
// Inicjalizacja obiektów
HX711 scale;
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS);
float calibration_factor = 0.42;
void setup() {
Serial.begin(115200);
Serial.println("Inicjalizacja wagi z biblioteka HX711...");
Wire.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Waga ESP32");
lcd.setCursor(0, 1);
lcd.print("Inicjalizacja...");
pinMode(TARE_BUTTON_PIN, INPUT_PULLUP);
pinMode(CALIBRATE_BUTTON_PIN, INPUT_PULLUP);
scale.begin(HX711_DOUT, HX711_SCK);
if (scale.is_ready()) {
Serial.println("HX711 gotowy.");
scale.set_scale(calibration_factor);
scale.tare();
} else {
Serial.println("HX711 nie znaleziony! Sprawdz polaczenia w Wokwi.");
lcd.clear();
lcd.print("Blad HX711!");
while(1);
}
Serial.println("Waga gotowa.");
delay(1000);
lcd.clear();
lcd.print("Gotowy.");
delay(1000);
}
// --- ZMIENIONA FUNKCJA LOOP ---
void loop() {
// Usuwamy sprawdzanie "is_ready()" i zakładamy, że połączenie jest stabilne.
// Jest to bezpieczne w symulatorze, jeśli przeszło test w setup().
float reading = scale.get_units(5);
if (reading < 0.5 && reading > -0.5) {
reading = 0.0;
}
displayWeight(reading);
checkButtons();
delay(100); // Dodajemy małe opóźnienie dla stabilności symulacji
}
void displayWeight(float weight) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Waga:");
lcd.setCursor(0, 1);
lcd.print(weight, 1);
lcd.print(" g");
Serial.print("Waga: ");
Serial.print(weight, 1);
Serial.println(" g");
}
void checkButtons() {
if (digitalRead(TARE_BUTTON_PIN) == LOW) {
delay(50);
if (digitalRead(TARE_BUTTON_PIN) == LOW) {
tareScale();
while(digitalRead(TARE_BUTTON_PIN) == LOW);
}
}
if (digitalRead(CALIBRATE_BUTTON_PIN) == LOW) {
delay(50);
if (digitalRead(CALIBRATE_BUTTON_PIN) == LOW) {
calibrateScale();
while(digitalRead(CALIBRATE_BUTTON_PIN) == LOW);
}
}
}
void tareScale() {
Serial.println("Tarowanie wagi...");
lcd.clear();
lcd.print("Tarowanie...");
scale.tare();
delay(500);
lcd.clear();
lcd.print("Waga wytarowana.");
delay(2000);
}
void calibrateScale() {
Serial.println("Rozpoczeto kalibracje...");
lcd.clear();
lcd.print("Kalibracja...");
delay(2000);
lcd.clear();
lcd.print("Zdejmij wszystko");
lcd.setCursor(0, 1);
lcd.print("z wagi.");
delay(4000);
scale.tare();
lcd.clear();
lcd.print("Wytarowano.");
delay(2000);
lcd.clear();
lcd.print("Poloz wzorzec");
lcd.setCursor(0, 1);
lcd.print(KNOWN_WEIGHT);
lcd.print(" g");
delay(5000);
long reading = scale.get_value(10);
calibration_factor = reading / KNOWN_WEIGHT;
Serial.print("Nowy wspolczynnik: ");
Serial.println(calibration_factor);
scale.set_scale(calibration_factor);
lcd.clear();
lcd.print("Kalibracja");
lcd.setCursor(0, 1);
lcd.print("Zakonczona!");
delay(3000);
}