#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>
#include <EEPROM.h>
// Piny
#define LOADCELL_DOUT_PIN 4
#define LOADCELL_SCK_PIN 5
#define TARA_BUTTON 16
#define KALIBRACJA_BUTTON 17
// Adres LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
HX711 scale;
// Zmienne kalibracji
float scale_factor = 1000.0;
const float known_weight = 750.0; // ODWAŻNIK 750 g
// Flagi przycisków
bool last_tara = HIGH;
bool last_kalib = HIGH;
void setup() {
Serial.begin(115200);
// Inicjalizacja przycisków
pinMode(TARA_BUTTON, INPUT_PULLUP);
pinMode(KALIBRACJA_BUTTON, INPUT_PULLUP);
// Inicjalizacja LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Inicjalizacja...");
// Inicjalizacja HX711
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale();
scale.tare(); // Reset scale to zero
// Wczytaj zapisaną kalibrację
EEPROM.begin(512);
loadCalibration();
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Waga gotowa");
lcd.setCursor(0, 1);
lcd.print("Tara/Kalibracja");
delay(2000);
lcd.clear();
}
void loop() {
static unsigned long last_display = 0;
// Odczyt i wyświetlanie wagi
if(millis() - last_display > 300) {
float weight = scale.get_units(3);
displayWeight(weight);
last_display = millis();
}
// Obsługa przycisku TARA
bool current_tara = digitalRead(TARA_BUTTON);
if(last_tara == HIGH && current_tara == LOW) {
delay(50);
if(digitalRead(TARA_BUTTON) == LOW) {
scale.tare();
lcd.setCursor(0, 0);
lcd.print("TARA wykonana! ");
delay(1000);
}
}
last_tara = current_tara;
// Obsługa przycisku KALIBRACJA
bool current_kalib = digitalRead(KALIBRACJA_BUTTON);
if(last_kalib == HIGH && current_kalib == LOW) {
delay(50);
if(digitalRead(KALIBRACJA_BUTTON) == LOW) {
calibrateScale();
}
}
last_kalib = current_kalib;
}
void displayWeight(float weight) {
// Ogranicz do wartości dodatnich
if(weight < 0) weight = 0;
float grams = weight;
float dkg = weight / 10.0;
// Pierwsza linia - dkg
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
if(dkg < 10) {
lcd.print(dkg, 2);
} else if(dkg < 100) {
lcd.print(dkg, 1);
} else {
lcd.print(dkg, 0);
}
lcd.print(" dkg");
// Druga linia - gramy
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
if(grams < 10) {
lcd.print(grams, 2);
} else if(grams < 100) {
lcd.print(grams, 1);
} else {
lcd.print(grams, 0);
}
lcd.print(" g");
}
void calibrateScale() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("KALIBRACJA");
lcd.setCursor(0, 1);
lcd.print("Odloz wszystko");
delay(3000);
// KROK 1: Odczyt bez obciążenia (tara)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Zerowanie...");
scale.tare(); // Tara bez obciążenia
delay(2000);
// KROK 2: Połóż odważnik
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Poloz odwaznik");
lcd.setCursor(0, 1);
lcd.print(known_weight);
lcd.print("g i czekaj");
// Czekaj 5 sekund na położenie odważnika
delay(5000);
// KROK 3: Odczyt z obciążeniem
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Odczytuje...");
long reading = scale.get_units(10); // 10 odczytów
Serial.print("Odczytany sygnal: ");
Serial.println(reading);
// Oblicz współczynnik kalibracji
scale_factor = reading / known_weight;
Serial.print("Wspolczynnik: ");
Serial.println(scale_factor);
// Zapisz do EEPROM
EEPROM.put(0, scale_factor);
EEPROM.commit();
// Ustaw nowy współczynnik
scale.set_scale(scale_factor);
// Potwierdzenie
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Kalibracja OK!");
lcd.setCursor(0, 1);
lcd.print("F: ");
lcd.print(scale_factor);
delay(3000);
lcd.clear();
}
void loadCalibration() {
float saved_factor;
EEPROM.get(0, saved_factor);
if(saved_factor > 0 && saved_factor < 100000) {
scale_factor = saved_factor;
scale.set_scale(scale_factor);
Serial.print("Wczytano kalibracje: ");
Serial.println(scale_factor);
} else {
Serial.println("Brak kalibracji, ustawiam domyslna");
scale.set_scale(scale_factor);
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4