#include <driver/i2c.h>
#define I2C_SDA_PIN 8 // Pinagem do pino SDA
#define I2C_SCL_PIN 9 // Pinagem do pino SCL
#define PCF8574_ADDR 0x27
#define I2C_MASTER_NUM I2C_NUM_0
#define I2C_MASTER_FREQ_HZ 100000
void i2c_master_init() {
i2c_config_t config;
config.mode = I2C_MODE_MASTER;
config.sda_io_num = I2C_SDA_PIN;
config.sda_pullup_en = GPIO_PULLUP_ENABLE;
config.scl_io_num = I2C_SCL_PIN;
config.scl_pullup_en = GPIO_PULLUP_ENABLE;
config.master.clk_speed = I2C_MASTER_FREQ_HZ;
i2c_param_config(I2C_MASTER_NUM, &config);
i2c_driver_install(I2C_MASTER_NUM, config.mode, 0, 0, 0);
}
void i2c_write_byte(uint8_t data) {
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (PCF8574_ADDR << 1) | I2C_MASTER_WRITE, true);
i2c_master_write_byte(cmd, data, true);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
}
void lcd_command(uint8_t command) {
uint8_t high_nibble = (command & 0xF0) | 0x08; // RS = 0, EN = 1
uint8_t low_nibble = ((command << 4) & 0xF0) | 0x08; // RS = 0, EN = 1
i2c_write_byte(high_nibble);
i2c_write_byte(low_nibble);
vTaskDelay(1 / portTICK_RATE_MS); // Delay para garantir tempo suficiente para o comando ser executado
}
void lcd_init() {
// Inicialização do display
lcd_command(0x33); // Configuração de 8 bits
lcd_command(0x32); // Configuração de 8 bits
lcd_command(0x28); // 2 linhas, 5x7 matriz de pontos
lcd_command(0x0C); // Display ligado, cursor desligado, piscando desligado
lcd_command(0x06); // Incremento automático do cursor
lcd_command(0x01); // Limpar display
vTaskDelay(2 / portTICK_RATE_MS); // Delay após a inicialização
}
void lcd_print(const char* text) {
while (*text) {
lcd_command(*text);
text++;
}
}
void app_main() {
i2c_master_init(); // Inicialização da comunicação I2C
lcd_init(); // Inicialização do display
lcd_print("Hello, World!"); // Exibe texto no display
while (1) {
// Seu código principal aqui
vTaskDelay(1000 / portTICK_RATE_MS); // Delay para evitar bloqueio da tarefa
}
}