#include <LiquidCrystal.h>
#include "HX711.h"
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Pin numbers for LCD
HX711 scale;
const int buzzer = 9;
const int buttonUp = 10;
const int buttonDown = 11;
const int buttonMenu = 12;
const int buttonOk = 13;
float calibration_factor = -780;
int currentSelection = 0;
int weights[] = {850, 1000, 2000};
int currentMenuPage = 0;
bool isMenuOpen = false;
bool isBuzzerEnabled = true;
void setup() {
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
pinMode(buttonUp, INPUT_PULLUP);
pinMode(buttonDown, INPUT_PULLUP);
pinMode(buttonMenu, INPUT_PULLUP);
pinMode(buttonOk, INPUT_PULLUP);
lcd.begin(16, 2); // Set the number of columns and rows on the LCD
lcd.clear();
lcd.print("Initializing...");
delay(1000);
scale.begin(A2, A3);
scale.set_scale(calibration_factor);
scale.tare();
lcd.clear();
}
void displayMenu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("> ");
lcd.print(weights[currentSelection]);
lcd.print(" g ");
if (currentSelection == 0) {
lcd.print("Tare");
} else if (currentSelection == 1) {
if (isBuzzerEnabled) {
lcd.print("Disable alarm");
} else {
lcd.print("Enable alarm");
}
} else {
lcd.print("Done");
}
lcd.setCursor(0, 1);
if (currentSelection == 2) {
lcd.print(" ");
} else {
lcd.print("<- ->");
}
}
void loop() {
float weight = scale.get_units();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Weight: ");
lcd.print(weight, 0);
lcd.print(" g");
if (digitalRead(buttonMenu) == LOW) {
currentSelection = 0;
displayMenu();
while (digitalRead(buttonMenu) == LOW) {
delay(50);
}
delay(200);
while (1) {
if (digitalRead(buttonUp) == LOW) {
if (currentSelection > 0) {
currentSelection--;
}
displayMenu();
while (digitalRead(buttonUp) == LOW) {
delay(50);
}
delay(200);
}
if (digitalRead(buttonDown) == LOW) {
if (currentSelection < 2) {
currentSelection++;
}
displayMenu();
while (digitalRead(buttonDown) == LOW) {
delay(50);
}
delay(200);
}
if (digitalRead(buttonOk) == LOW) {
if (currentSelection == 0) {
scale.tare();
lcd.clear();
lcd.print("Tared");
delay(2000);
break;
} else if (currentSelection == 1) {
isBuzzerEnabled = !isBuzzerEnabled;
lcd.clear();
if (isBuzzerEnabled) {
lcd.print("Alarm enabled");
} else {
lcd.print("Alarm disabled");
}
delay(2000);
break;
} else {
break;
}
}
}
delay(200);
} else {
if (weight >= 0 && weight >= weights[currentSelection]) {
if (isBuzzerEnabled) {
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
delay(1000);
}
}
}
}