#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c.h"
#include "esp_err.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_ops.h"
// Definição dos pinos e configurações do I2C
#define I2C_MASTER_SDA 21 // Pino SDA do ESP32
#define I2C_MASTER_SCL 22 // Pino SCL do ESP32
#define I2C_MASTER_FREQ_HZ 100000 // Frequência I2C (100kHz)
#define I2C_PORT I2C_NUM_0 // Usando o controlador I2C 0
#define LCD_ADDR 0x3c // Endereço I2C do display SSD1306 (para escrita)
#define I2C_TIMEOUT (200 / portTICK_PERIOD_MS) // Tempo de timeout I2C
#define I2C_BIT_CMD 8 //bits que são necessários parea enviar um comando no no ssd1306
#define I2C_BIT_PARAM 8 //Bits para os parametros
#define LCD_RESET_PIN 16 // O pino de reset é o 16 conforme o datasheet
// Função para inicializar o I2C
esp_err_t vInitI2c() {
esp_err_t ret;
i2c_config_t config = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA,
.scl_io_num = I2C_MASTER_SCL,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
ret = i2c_param_config(I2C_PORT, &config);
if (ret != ESP_OK) {
printf("Erro ao configurar I2C: %s\n", esp_err_to_name(ret));
return ret;
}
ret = i2c_driver_install(I2C_PORT, config.mode, 0, 0, 0);
if (ret != ESP_OK) {
printf("Erro ao instalar o driver I2C: %s\n", esp_err_to_name(ret));
return ret;
}
//Criando os IO para o display
esp_lcd_panel_io_handle_t io_handle = NULL; //Ponteiro que creia uma referencia para bus IO
esp_lcd_panel_io_i2c_config_t io_config = {
.dev_addr = LCD_ADDR,
.control_phase_bytes = 1, // refer to LCD spec
.dc_bit_offset = 6, // refer to LCD spec
.lcd_cmd_bits = I2C_BIT_CMD,
.lcd_param_bits = I2C_BIT_PARAM,
};
ret = esp_lcd_new_panel_io_i2c(I2C_PORT, &io_config, &io_handle);
if (ret != ESP_OK){
printf("Erro na inicilização do IO do lcd: %s\n", esp_err_to_name(ret));
return ret;
}
esp_lcd_panel_handle_t panel_handle = NULL;
esp_lcd_panel_dev_config_t panel_config = {
.bits_per_pixel = 1,
.reset_gpio_num = LCD_RESET_PIN,
};
ret = esp_lcd_new_panel_ssd1306(io_handle, &panel_config, &panel_handle);
if (ret != ESP_OK){
printf("Erro na inicilização do painel config: %s\n", esp_err_to_name(ret));
return ret;
}
return ESP_OK;
}
// Função principal
void app_main() {
// Inicializa o I2C
vInitI2c();
}