/**
* @file lcd_custom_char_example.ino
* @brief Exemplo de uso de um display LCD 16x2 com interface I2C e caracteres personalizados.
*
* Este código configura um display LCD 16x2 com interface I2C usando a biblioteca LiquidCrystal_I2C.
* O display é configurado com o endereço I2C 0x27, e o código cria e exibe um caractere especial na tela.
* O caractere especial é definido por uma matriz de 8 bytes e é exibido várias vezes na segunda linha do LCD.
*
* @author Giovanni Rozza (adaptado blog Eletrogate)
* @date 16 de setembro de 2024
*
* @dependencies
* - Biblioteca Wire.h para comunicação I2C.
* - Biblioteca LiquidCrystal_I2C.h para controle do display LCD via I2C.
*
* @hardware
* - ESP32 (ou outro microcontrolador compatível com a biblioteca).
* - Display LCD 16x2 com interface I2C (endereço 0x27).
*
* @note
* - Certifique-se de que a biblioteca LiquidCrystal_I2C esteja instalada e que o endereço I2C do display esteja correto.
* - Para criar e testar caracteres especiais, você pode utilizar ferramentas online como https://omerk.github.io/lcdchargen/.
*
* @usage
* - O código inicializa a comunicação I2C e o display LCD.
* - O caractere especial é criado e exibido várias vezes na segunda linha do display.
*
* @example
* - Para definir diferentes caracteres especiais, ajuste a matriz 'customChar' conforme necessário.
*/
#include <LiquidCrystal_I2C.h>
// Uso de cristal liquido 16x2 com a interface I2C
// 0x27 endereço I2C do display
// 16 colunas, 02 linhas
LiquidCrystal_I2C lcd(0x27, 16, 2); // definindo o LCD - 16 colunas e 2 linhas
byte customChar[8] = // Matriz do caracter especial
{
0b00000,
0b11011,
0b11011,
0b00100,
0b00100,
0b10001,
0b01110,
0b00000
};
void setup()
{
Wire.begin(22, 23); // SDA 22 e SCL 23
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.clear(); // limpa a tela
// https://www.arduino.cc/reference/en/libraries/liquidcrystal/createchar/
lcd.createChar(1, customChar); // criando o caracter especial 1 (até 8 são possíveis)
lcd.setCursor(0, 1);
lcd.write((byte)1); // imprimindo o carcter especial 1
lcd.write((byte)1); // imprimindo o carcter especial 1
lcd.write((byte)1); // imprimindo o carcter especial 1
// DIFERENÇA ENTRE WRITE() E PRINT()
// para criar caracteres especiais
// https://omerk.github.io/lcdchargen/
lcd.write('H'); // Imprime o caractere 'H'
lcd.write(65); // Imprime o caractere correspondente ao código ASCII 65, que é 'A'
// imprime o valor 65
lcd.print(65); // Imprime o valor int 65
lcd.print(65.5); // Imprime o valor float 65.5
}
void loop()
{
//if (Serial.available()) {
// lcd.write(Serial.read());
// }
}