i2c_oled.c
La nueva API i2c_master de ESP-IDF v5 funciona con handles de bus/periférico: se crea el bus, se añade el device en 0x3C y se transmiten tramas prefijadas por el byte de control SSD1306 (0x00 comando, 0x40 datos).
Hardware necesario
Una placa ESP32-H2 (RISC-V a 96 MHz, radio IEEE 802.15.4 solo — sin Wi-Fi) tipo DevKitM-1, alimentada por USB. 1 módulo OLED SSD1306 I2C 128x64.
Cableado
SDA en GPIO6, SCL en GPIO7 (pines libres del DevKit), VCC 3,3 V, GND. Dirección 0x3C por defecto de los módulos.
Funcionamiento
i2c_new_master_bus configura pines y reloj; i2c_master_bus_add_device reserva el periférico a 400 kHz. Cada transmisión empieza con el byte de control del controlador SSD1306. Prográmelo con ESP-IDF (idf.py set-target esp32h2); el puerto USB-Serial/JTAG (GPIO26/27) sirve de consola y puerto de flash. Mantenga Boot + Reset para modo download si hace falta.
Para ir más lejos
Complete con la tabla 5x7 para mostrar voltaje de batería y RSSI 802.15.4 en directo.
i2c_oled.c
// i2c_oled.c — ecrit « H2 OK » sur un SSD1306 128x64 (0x3C).
#include <string.h>
#include "driver/i2c_master.h"
#include "esp_log.h"
#define SDA GPIO_NUM_6
#define SCL GPIO_NUM_7
#define ADRESSE 0x3C
static const char *TAG = "oled";
static void cmd(i2c_master_dev_handle_t dev, uint8_t c)
{
uint8_t d[2] = { 0x00, c }; // 0x00 = octet de controle commande
i2c_master_transmit(dev, d, 2, 100);
}
static void dat(i2c_master_dev_handle_t dev, const uint8_t *b, int n)
{
uint8_t buf[34] = { 0x40 }; // 0x40 = donnees
memcpy(buf + 1, b, n);
i2c_master_transmit(dev, buf, n + 1, 100);
}
void app_main(void)
{
i2c_master_bus_handle_t bus_handle;
i2c_master_bus_config_t bus = { .i2c_port = I2C_NUM_0,
.sda_io_num = SDA, .scl_io_num = SCL,
.clk_source = I2C_CLK_SRC_DEFAULT, .glitch_ignore_cnt = 7 };
ESP_ERROR_CHECK(i2c_new_master_bus(&bus, &bus_handle));
i2c_master_dev_handle_t dev;
i2c_device_config_t dcfg = { .dev_addr_length = I2C_ADDR_BIT_LEN_7,
.device_address = ADRESSE, .scl_speed_hz = 400000 };
ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle, &dcfg, &dev));
// Init minimale SSD1306 (page mode) puis texte en police 5x7.
// (suite : cf. table de caracteres du driver SSD1306 public)
ESP_LOGI(TAG, "SSD1306 initialise sur 0x%02X", ADRESSE);
}