#include "HX711.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Defina os pinos para HX711, LED, botão, buzzer e relé
#define LOADCELL_DOUT_PIN 2
#define LOADCELL_SCK_PIN 3
#define BUTTON_PIN 7
#define RELE_PIN 5 // Pino para o módulo de relé
// Inicialize o objeto HX711
HX711 scale;
// Inicialize o objeto LCD (endereço I2C pode variar, ajuste se necessário)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pesos de referência em gramas
const float peso1 = 5000.0; // exemplo de peso de referência 1
const float peso2 = 6000.0; // exemplo de peso de referência 2
const float peso3 = 7000.0; // exemplo de peso de referência 3
const float peso4 = 8000.0; // exemplo de peso de referência 4
const float peso5 = 9000.0; // exemplo de peso de referência 5
const float precisao = 100.0;
// Variável para armazenar o peso de referência atual
float pesoReferencia;
bool lastButtonState = LOW; // Estado anterior do botão
void setup() {
Serial.begin(9600);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
pinMode(BUTTON_PIN, INPUT);
pinMode(RELE_PIN, OUTPUT); // Configura o pino do relé como saída
// Inicialize o LCD
lcd.init();
lcd.backlight();
// Calibração (ajuste conforme necessário)
scale.set_scale(); // ajuste a escala se você já souber o fator de escala
scale.tare(); // zera a balança
// Calibração manual: coloque um peso conhecido e ajuste o fator de escala
// float calibration_factor = 2280.f; // fator de escala de exemplo
// scale.set_scale(calibration_factor);
// Defina o peso de referência inicial
pesoReferencia = peso1;
lcd.setCursor(0, 0);
lcd.print("Ref: ");
lcd.print(pesoReferencia);
}
void loop() {
// Verifique o estado do botão
bool buttonState = digitalRead(BUTTON_PIN);
if (buttonState == HIGH && lastButtonState == LOW) {
// Alterna entre os pesos de referência
if (pesoReferencia == peso1) {
pesoReferencia = peso2;
} else if (pesoReferencia == peso2) {
pesoReferencia = peso3;
} else if (pesoReferencia == peso3) {
pesoReferencia = peso4;
} else if (pesoReferencia == peso4) {
pesoReferencia = peso5;
} else {
pesoReferencia = peso1;
}
Serial.print("Peso de referência alterado para: ");
Serial.println(pesoReferencia);
// Atualize o LCD com o peso de referência atual
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ref: ");
lcd.print(pesoReferencia);
}
// Atualize o estado anterior do botão
lastButtonState = buttonState;
// Verifique o peso atual
if (scale.is_ready()) {
float pesoAtual = scale.get_units(10);
Serial.print("Peso: ");
Serial.println(pesoAtual);
// Atualize o LCD com o peso atual
lcd.setCursor(0, 1);
lcd.print("Peso: ");
lcd.print(pesoAtual);
// Verifique se o peso está dentro da precisão para o peso de referência atual
bool pesoCorreto = abs(pesoAtual - pesoReferencia) <= precisao;
// Verifique se o peso é zero
if (pesoAtual == 0) {
digitalWrite(RELE_PIN, LOW); // Relé desligado se o peso for zero
lcd.setCursor(8, 1);
} else {
if (pesoCorreto) {
digitalWrite(RELE_PIN, LOW); // Relé desligado se o peso estiver correto
lcd.setCursor(8, 1);
} else {
digitalWrite(RELE_PIN, HIGH); // Relé ligado se o peso estiver incorreto
lcd.setCursor(8, 1);
}
}
} else {
Serial.println("HX711 não está pronto.");
lcd.setCursor(0, 1);
lcd.print("Erro: HX711");
}
delay(1000); // Aguarde um segundo antes de medir novamente
}