#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "driver/gpio.h"
#include "freertos/task.h"
//Define os pinos do LCD
#define LCD_RS 18
#define LCD_E 5
#define LCD_D7 25
#define LCD_D6 26
#define LCD_D5 27
#define LCD_D4 14
char *teste = "Temperatura: ";
// Função para enviar meio byte (nibble)
void lcd_send_nibble(uint8_t nibble) {
gpio_set_level(LCD_D4, (nibble >> 0) & 0x01);
gpio_set_level(LCD_D5, (nibble >> 1) & 0x01);
gpio_set_level(LCD_D6, (nibble >> 2) & 0x01);
gpio_set_level(LCD_D7, (nibble >> 3) & 0x01);
}
// Função para enviar comandos ao LCD
void lcd_send_command(uint8_t cmd) {
gpio_set_level(LCD_RS, 0); // Comando (RS=0)
// Enviar o nibble superior (4 bits mais altos)
lcd_send_nibble(cmd >> 4);
gpio_set_level(LCD_E, 1); // Pulso de Enable
vTaskDelay(1 / portTICK_PERIOD_MS);
gpio_set_level(LCD_E, 0);
// Enviar o nibble inferior (4 bits mais baixos)
lcd_send_nibble(cmd);
gpio_set_level(LCD_E, 1); // Pulso de Enable
vTaskDelay(1 / portTICK_PERIOD_MS);
gpio_set_level(LCD_E, 0);
}
// Função para enviar dados (caracteres) ao LCD
void lcd_send_data(uint8_t data) {
gpio_set_level(LCD_RS, 1); // Dado (RS=1)
// Enviar o nibble superior (4 bits mais altos)
lcd_send_nibble(data >> 4);
gpio_set_level(LCD_E, 1); // Pulso de Enable
vTaskDelay(1 / portTICK_PERIOD_MS);
gpio_set_level(LCD_E, 0);
// Enviar o nibble inferior (4 bits mais baixos)
lcd_send_nibble(data);
gpio_set_level(LCD_E, 1); // Pulso de Enable
vTaskDelay(1 / portTICK_PERIOD_MS);
gpio_set_level(LCD_E, 0);
}
// Função de inicialização do LCD
void lcd_init() {
// Configurar os pinos GPIO como saída
gpio_set_direction(LCD_RS, GPIO_MODE_OUTPUT);
gpio_set_direction(LCD_E, GPIO_MODE_OUTPUT);
gpio_set_direction(LCD_D4, GPIO_MODE_OUTPUT);
gpio_set_direction(LCD_D5, GPIO_MODE_OUTPUT);
gpio_set_direction(LCD_D6, GPIO_MODE_OUTPUT);
gpio_set_direction(LCD_D7, GPIO_MODE_OUTPUT);
// Inicialização do LCD em modo 4-bit
lcd_send_command(0x33); // Sequência inicial
lcd_send_command(0x32); // Configurar para 4 bits
lcd_send_command(0x28); // Função: 4 bits, 2 linhas, 5x8 pontos
lcd_send_command(0x0C); // Display ligado, cursor desligado
lcd_send_command(0x06); // Modo de incremento do cursor
lcd_send_command(0x01); // Limpar display
vTaskDelay(5 / portTICK_PERIOD_MS); // Aguardar
}
int returnString(char *teste) {
int i = 0;
while (teste[i] != '\0') { // Continue enquanto não encontrar o caractere nulo
i++; // Incrementa o contador
}
return i; // Retorna o número de letras
}
void sendValorTemperatura(char *valor_string_sensor){
char *valor_funcao = valor_string_sensor; //guarda o endereço no ponteiro
int cont = 0;
/* obs: quando o ponteiro tem *nome = o conteudo !!
quando o ponteiro não tem nome = endereço !!!*/
while( *valor_funcao != '\0'){
lcd_send_data(*valor_funcao); //envia o byte
valor_funcao++; //incrementa o endereço do ponteiro para ir pro próximo endereço
}
for(int i =0; i<=1;i++){
lcd_send_command(0x10); // Comando para mover o cursor para a esquerda duas vezes
}
}
void nameTemperatura(){
int cont = returnString(teste); // Conta os caracteres
// Envia a palavra "Temperatura" para o LCD de trás para frente
for (int i = 0; i < cont; i++) {
lcd_send_data(teste[i]); // Enviar o código ASCII da letra
}
}
void app_main() {
int valor_temp_sensor = 0; //declaração da variavel que recebe o valor de leitura
char valor_string_sensor [3]; //variavel que armazena em cada byte o endereço da conversão do inteiro
lcd_init(); // Inicializar o LCD
lcd_send_command(0x80); // Posicionar o cursor no início
nameTemperatura(); // coloca temperatura na tela
// Loop infinito
while (1) {
valor_temp_sensor = 23; //simula um valor que será obtido pelo sensor
//scanf("%d", &valor_temp_sensor); // Lê a temperatura do usuário
sprintf(valor_string_sensor, "%d", valor_temp_sensor); //converte o valor inteiro para string
sendValorTemperatura(valor_string_sensor);
vTaskDelay(1000 / portTICK_PERIOD_MS); // Apenas para manter o programa rodando
}
}