#include <LiquidCrystal_I2C.h>                // Biblioteca do LCD

//====================================================================================================
//---Variveis
                         
uint16_t freq     = 9990;                     // Varivel da frequencia inicial
uint8_t rssi      = 17;                        // Varivel de controle do sinal de antena

// Matriz para criao da barra de sinal
byte dialInitial[] = { 0x00, 0x19, 0x19, 0x01, 0x01, 0x19, 0x19, 0x00 }; // Incio da barra
byte dialUpDown[]  = { 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00 }; // Parte superior e inferior
byte dialFinal[]   = { 0x00, 0x1F, 0x03, 0x03, 0x03, 0x03, 0x1F, 0x00 }; // Final da barra
byte bar[]         = { 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00 }; // Preenchimento da barra

//====================================================================================================
//---Objetos

LiquidCrystal_I2C lcd(0x27, 16, 2);             // Define (endero(decimal), nmeros coluna, nmeros linha)

//====================================================================================================
//---Configuraes

void setup()
{
  lcd.init();                                 // Inicia o display LCD
  lcd.backlight();                            // Liga luz de fundo do LCD

  // Criao das partes da barra grfica
  lcd.createChar(0, dialUpDown);              // (Nome, matriz)
  lcd.createChar(1, dialFinal);
  lcd.createChar(2, bar);
  lcd.createChar(3, dialInitial);

  // Mostra as informaes no LCD ao ligar
  lcd.setCursor(2, 0);                        // Posiciona o cursor na coluna 2 e linha 0
  lcd.print("Radio DSP FM");                  // Escreve no LCD
  delay(2000);                                // Aguarda 2 segundos
  lcd.setCursor(3, 1);
  lcd.print("SI473X_V1");
  delay(2000);
  lcd.clear();                                // Limpa o LCD

  showFrequency();                            // Exibe a informao de frequencia no LCD
}

//====================================================================================================
//---Loop infinito

void loop()
{
  showRSSI();                               // Atualiza o sinal de antena
}

// Formata o valor da frequencia para exibio no LCD
void showFrequency()
{
  String freqDisplay;

  freqDisplay = String(freq / 100.0, 1);      // Formata e converte o valor em string (frequencia, quantidade de casas decimais)

  if (freq >= 10000)                          // Posicionamento do primeiro digito no LCD
  {
    lcd.setCursor(5, 0);                      // Posiciona o cursor na coluna 5 e linha 0
    lcd.print(freqDisplay);                   // Escreve o valor da frequencia formatado no LCD
  }
  else
  {
    lcd.setCursor(5, 0);
    lcd.print(" ");                           // Apaga o valor na coluna 5
    lcd.setCursor(6, 0);
    lcd.print(freqDisplay);
  }
  showStatus();                               // Atualiza o status
}

// Exibe informaes fixa
void showStatus()
{
  lcd.setCursor(2, 0);                        // Posiciona o cursor na coluna 2 e linha 0
  lcd.print("FM");                            // Escreve a banda no LCD
  lcd.setCursor(11, 0);
  lcd.print("MHz");                           // Escreve a faixa da banda no LCD
  lcd.setCursor(2, 1);
  lcd.print("S");                             // Escreve a sigla "S" de sinal

  lcd.setCursor(13, 1);
  lcd.write(1);                               // Desenha o final da barra de sinal
  lcd.setCursor(3, 1);
  lcd.write(3);                               // Desenha o incio da barra de sinal
}

// Funo que controla a barra de sinal
void showRSSI()
{
  int blk = rssi / 4;                         // Divide o valor do sinal por 4

  lcd.setCursor(4, 1);

  for (int i = 0; i < 9; i++)                 // Define o tamanho da barra de acordo com o sinal
  {
    if (i < blk)
      lcd.write(2);                           // Desenha a barra
    else
      lcd.write(0);                           // Desenha o a linha superior e inferior
  }
}
//===================================================================================================