#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
  }
}
//===================================================================================================