// ---------------------------------------------------------------------------
// (| " TwoSmoothGauges_I2C_16x2.ino                                       "|)
// (| " Sketch para mostrar barras de progreso horizontales o verticales en"|)
// (| " LCD 16x2 o 20x4 basadas en caracteres. Se basa en las bibliotecas  "|)
// (| " subyacentes LiquidCrystal y LiquidCrystal_I2C. La longitud y la    "|)
// (| " posición de la barra de progreso se pueden configurar.             "|)
// (| "                                                                    "|)
// (| " La biblioteca utiliza los caracteres definibles por el usuario de  "|)
// (| " la pantalla LCD y puede mostrar hasta 4 barras de progreso suaves  "|)
// (| " horizontales o verticales independientes, simultáneamente.         "|)
// (| " Las barras de progreso se pueden dibujar usando diferentes estilos "|)
// (| " visuales (distribuidos con la biblioteca como archivos .h separados"|)
// (| " o el usuario puede definir su propio estilo). Los estilos se       "|)
// (| " definen mediante máscaras de bits y datos adicionales en la        "|)
// (| " estructura barstyle (49 bytes) que se pueden almacenar en SRAM o en"|)
// (| " flash (PROGMEM). La biblioteca también admite barras de progreso en"|)
// (| " múltiples pantallas LCD conectadas, cada pantalla con un estilo de "|)
// (| " barra de progreso diferentes, hasta 4 barras de progreso por       "|)
// (| " pantalla!.                                                         "|)
// (| "                                                                    "|)
// (| " Dichas pantallas LCD pueden estar conectadas mediante I2C o        "|)
// (| " utilizando los 16 pines, haciendo los ajustes correspondientes en  "|)
// (| " el codigo.                                                         "|)
// (| "                                                                    "|)
// (| " Autor: (c) Dejan Gjorgjevikj                                       "|)
// (| "                                                                    "|)
// (| " Este código de ejemplo es de dominio público.                      "|)
// (| "                                                                    "|)
// (| " Visita https://jorgechac.blogspot.com                              "|)
// (| "                                                                    "|)
// (| " Venta de accesorios Arduino/Raspberry Pi Pico/ESP32                "|)
// (| " Whatsapp y Ventas NEQUI +573177295861                              "|)
// (| " Bucaramanga - Colombia                                             "|)
// (| " Simulación https://wokwi.com/projects/340102773884322388           "|)
// (| " Descarga gratis este sketch en:                                    "|)
// (| " https://create.arduino.cc/editor/jorgechac/3d449e57-a54c-4128-b6da-8b1290a97391/preview "|)
// ------------------------------------------------------------------------------------------------

#include <LiquidCrystal_I2C.h>     // if you don't have I2C version of the display, use LiquidCrystal.h library instead
#include "yaLCDProgressBar.h"      // Yet another LCD progress bar library for Arduino

// can dispalay up to 2 smoot gauges simultaneously

#include "yaLCDBatteryGauge.h"            // LCD progress bar for battery status library for Arduino

LiquidCrystal_I2C lcd(0x27, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
//LiquidCrystal_I2C lcd(0x3f,16,2);    // set the LCD address to 0x3f for a 16 chars and 2 line display
// if you don't know the I2C address of the display, use I2C scanner first

LCDProgressBar pb1(lcd, 12, 1, 0);
LCDProgressBar pb2(lcd, 8, 0, 8, true);
// !!! not all of them can be used simoltaneously - only 2 appropriately configured
LCDGauge bat(lcd, 6, 0, 0);

unsigned int gauge = 0;       
char buffer[16];         // helper buffer to store C-style strings (generated with sprintf function)
int state = 0;

void setup()
{
    lcd.init();                       // initialize the 16x2 lcd module
    lcd.backlight();                  // enable backlight for the LCD module
    lcd.print("LCD gauge demo");
    delay(1000);
}

void chargingAnimation(int state, int r = 3)
{
    bat.showGaugePct(state);
    sprintf(buffer, "Cargando: %3d%%", state);
    lcd.setCursor(0, 0);
    lcd.print(buffer);                            // print the string on the display

    while (r)
    {
        int cs = state;
        // animate
        while (cs <= 100 && r > 0)
        {
            cs += 2;
            bat.showGaugePct(cs);
            delay(1);
        }
        r--;
        delay(200);
    }
    bat.showGaugePct(state);
}

void loop()
{
  lcd.clear();
  lcd.print("2 smoot gauges");
  delay(1000);
  pb1.init();
  pb2.init();
  lcd.clear();
  for(gauge=0;gauge<=100;gauge++)
  {
      lcd.setCursor(0, 0);                           // move cursor to top left
      sprintf(buffer, "val:%3d ", gauge % pb2.size());  // set a string as val: XX% 
      lcd.print(buffer);                             // print the string on the display

      pb1.showProgressPct(gauge % 100);
      pb2.showProgress(gauge % pb2.size());
      sprintf(buffer, "%3d%% ", gauge % 100);       // set a string as XX%, with the number always taking at least 3 character
      lcd.setCursor(12, 1);
      lcd.print(buffer);                            // print the string on the display
      delay(50);
  }
  
  lcd.clear();
  lcd.print("Battery gauge");
  delay(1000);
  bat.init(); 
  bat.setWidth(7);
  bat.setPosition(0, 0);
  lcd.clear();
  for (int gauge = 0; gauge <= 100; gauge++)
  {
      bat.showGaugePct(gauge);
      sprintf(buffer, "%3d%%", gauge);
      lcd.setCursor(12, 1);
      lcd.print(buffer);                            // print the string on the display
      delay(10);  // wait for a while 
  }
  delay(500);  // wait for a while 

  lcd.clear();
  bat.setWidth(6);
  bat.setPosition(8, 1);
  for (int gauge = 40; gauge <= 80; gauge+=10)
  {
      chargingAnimation(gauge);
      delay(100);  // wait for a while 
  }

/*
  lcd.clear();
  lcd.print("2 thin gauges");
  delay(1000);
  ptb1.init();
  ptb2.init();
  lcd.clear();
  for(gauge=0;gauge<=100;gauge++)
  {
    lcd.setCursor(0, 0);                           // move cursor to top left
    sprintf(buffer, "val:%3d ", gauge % ptb2.size());  // set a string as val: XX% 
    lcd.print(buffer);                             // print the string on the display

    ptb1.showProgressPct(gauge % 100);
    ptb2.showProgress(gauge % ptb2.size());
    sprintf(buffer, "%3d%% ", gauge % 100);       // set a string as XX%, with the number always taking at least 3 character
    lcd.setCursor(12, 1);
    lcd.print(buffer);                            // print the string on the display
    delay(50);
  }
*/
}