#include "HX711.h" // Biblioteca HX711
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// DEFINIÇÕES
#define pesoMaximo 13.40
#define pesoMinimo 9.40
#define enderecoDisplay 0x27 // Endereços comuns: 0x27, 0x3F
#define colunasDisplay 16
#define LinhasDisplay 2
#define DOUT A0 // HX711 DATA OUT = pino A0 do Arduino
#define CLK A1 // HX711 SCK IN = pino A1 do Arduino
#define pinoBotao 9
#define LED_PIN 13
// INSTANCIANDO OBJETOS
HX711 balanca; // define instancia balança HX711
LiquidCrystal_I2C display(enderecoDisplay, colunasDisplay, LinhasDisplay);
float fator_Calibracao = 420; // fator de calibração para teste inicial
float pesoAtualBalanca = 0;
int Peso;
unsigned long tempoInicio = 0;
unsigned long tempoBotao = 0;
bool estadoBotao;
bool estadoBotaoAnt;
bool estadoDisplay;
void zeraBalanca ()
{
display.clear();
display.setCursor(0, 0);
display.print("Zerando ...");
balanca.tare(); // zera a Balança
display.clear();
display.print("Balanca zerada");
delay(1000);
display.clear();
}
void updateProgressBar(float pesoAtual) {
if (pesoAtual <= pesoMinimo) {
display.setCursor(0, 1);
for (int nL = 0; nL < 16; nL++) display.print(" ");
} else {
display.setCursor(0, 1);
int grafico = map(pesoAtual, pesoMinimo, pesoMaximo, 0, 16);
if (grafico >= 16) {
grafico = 16;
}
//Serial.println(grafico);
for (int nL = 0; nL < grafico; nL++) display.print(char(255));
for (int nL = grafico; nL < 16; nL++) display.print(" ");
}
}
void funcaoCliqueBotao() {
estadoBotao = !digitalRead(pinoBotao);
//Ao apertar o botão
if (estadoBotao && !estadoBotaoAnt) {
if (tempoInicio == 0) {
tempoInicio = millis();
}
}
//Ao soltar o botão
if (tempoInicio > 200) { //Filtro Debounce
if (!estadoBotao && estadoBotaoAnt) {
tempoBotao = millis() - tempoInicio;
tempoInicio = 0;
}
}
//Comando 1 - Tara
if ((tempoBotao > 0) && (tempoBotao <= 999)) {
Serial.println("Comando Tara");
zeraBalanca();
}
//Comando 2 - Modo Sleep
if (tempoBotao > 1000) {
Serial.println("Comando Sleep");
if (estadoDisplay) {
display.noDisplay();
display.noBacklight();
estadoDisplay = false;
} else {
display.display();
display.backlight();
estadoDisplay = true;
}
}
estadoBotaoAnt = estadoBotao;
tempoBotao = 0;
delay(20);
}
void setup()
{
pinMode(pinoBotao, INPUT_PULLUP);
display.init(); // INICIA A COMUNICAÇÃO COM O DISPLAY
display.backlight(); // LIGA A ILUMINAÇÃO DO DISPLAY
estadoDisplay = true;
display.clear(); // LIMPA O DISPLAY
balanca.begin(DOUT, CLK); // inicializa a balança
balanca.set_scale(); // configura a escala da Balança
Serial.begin(9600); // monitor serial 9600 Bps
}
void loop()
{
funcaoCliqueBotao();
balanca.set_scale(fator_Calibracao); // ajusta fator de calibração
// Serial.print("Peso: "); // imprime no monitor serial
// Serial.print(balanca.get_units(5), 3); // imprime peso da balança com 3 casas decimais
// Serial.print(" kg");
// Serial.print(" Fator de Calibração: "); // imprime no monitor serial
// Serial.println(fator_Calibracao); // imprime fator de calibração
//display.clear();
display.setCursor(0, 0);
display.print("Peso:");
display.setCursor(6, 0);
display.print(balanca.get_units(5), 3);
display.setCursor(13, 0);
display.print("Kg");
updateProgressBar(balanca.get_units(5));
delay(20);
}