#include <LiquidCrystal.h>
#include <HX711.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
HX711 scale;
uint8_t DOUT = 6;
uint8_t CLK = 7;
int buttons[] = {9, 10, 13, 8};
enum {UP, DOWN, ENTER, BACK};
char* menu[] = {"1-TARGET WEIGHT", "2-CALIBRATION", "3-REST", "4-hen"};
int targetWeightTens = 0;
int targetWeightOnes = 0;
int targetWeightDecimals = 0;
int calibrationTens = 0;
int calibrationOnes = 0;
int calibrationDecimals = 0;
int currentAdjusting = 0; // 0 = tens, 1 = ones, 2 = decimals
bool inTargetWeightMenu = false;
bool inCalibrationMenu = false;
int menuIndex = 0;
void setup() {
lcd.begin(16, 2);
scale.begin(DOUT, CLK);
scale.set_scale();
scale.tare(); // reset the scale to zero
for (int i = 0; i < 4; i++)
pinMode(buttons[i], INPUT_PULLUP);
lcd.setCursor(0, 0);
lcd.print("Main Menu: ");
lcd.setCursor(0, 1);
lcd.print(menu[menuIndex]);
}
void loop() {
if (!digitalRead(buttons[UP])) {
if (inTargetWeightMenu || inCalibrationMenu) {
int* value = inTargetWeightMenu ? (currentAdjusting == 0 ? &targetWeightTens : currentAdjusting == 1 ? &targetWeightOnes : &targetWeightDecimals) : (currentAdjusting == 0 ? &calibrationTens : currentAdjusting == 1 ? &calibrationOnes : &calibrationDecimals);
(*value)++;
if (*value > 9) *value = 0;
} else {
menuIndex = (menuIndex - 1 + 4) % 4;
}
updateDisplay();
delay(200);
} else if (!digitalRead(buttons[DOWN])) {
if (inTargetWeightMenu || inCalibrationMenu) {
int* value = inTargetWeightMenu ? (currentAdjusting == 0 ? &targetWeightTens : currentAdjusting == 1 ? &targetWeightOnes : &targetWeightDecimals) : (currentAdjusting == 0 ? &calibrationTens : currentAdjusting == 1 ? &calibrationOnes : &calibrationDecimals);
(*value)--;
if (*value < 0) *value = 9;
} else {
menuIndex = (menuIndex + 1) % 4;
}
updateDisplay();
delay(200);
} else if (!digitalRead(buttons[ENTER])) {
if (inTargetWeightMenu || inCalibrationMenu) {
currentAdjusting = (currentAdjusting + 1) % 3;
} else if (menuIndex == 0) {
inTargetWeightMenu = true;
currentAdjusting = 0;
} else if (menuIndex == 1) {
inCalibrationMenu = true;
currentAdjusting = 0;
}
updateDisplay();
delay(200);
} else if (!digitalRead(buttons[BACK])) {
if (inTargetWeightMenu || inCalibrationMenu) {
inTargetWeightMenu = false;
inCalibrationMenu = false;
}
updateDisplay();
delay(200);
}
}
void updateDisplay() {
lcd.clear();
lcd.noBlink(); // Reset blinking cursor
if (inTargetWeightMenu) {
lcd.setCursor(0, 0);
lcd.print("Target Weight: ");
lcd.setCursor(0, 1);
lcd.print(targetWeightTens);
lcd.print(targetWeightOnes);
lcd.print(".");
lcd.print(targetWeightDecimals);
lcd.setCursor(currentAdjusting + (currentAdjusting == 2 ? 1 : 0), 1); // Corrected cursor position
lcd.blink(); // Start blinking cursor
} else if (inCalibrationMenu) {
lcd.setCursor(0, 0);
lcd.print("Calibration: ");
lcd.setCursor(0, 1);
lcd.print(calibrationTens);
lcd.print(calibrationOnes);
lcd.print(".");
lcd.print(calibrationDecimals);
lcd.setCursor(currentAdjusting + (currentAdjusting == 2 ? 1 : 0), 1); // Corrected cursor position
lcd.blink(); // Start blinking cursor
} else {
lcd.setCursor(0, 0);
lcd.print("Main Menu: ");
lcd.setCursor(0, 1);
lcd.print(menu[menuIndex]);
}
}