#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);
}