i2c_oled.c
Le nouvel API i2c_master d'ESP-IDF v5 fonctionne par handles bus/périphérique : on crée le bus, on ajoute le device à 0x3C, puis on transmet des trames précédées de l'octet de contrôle SSD1306 (0x00 commande, 0x40 données).
Matériel requis
Une carte ESP32-H2 (RISC-V 96 MHz, radio IEEE 802.15.4 uniquement — pas de Wi-Fi) type DevKitM-1, alimentée par USB. 1 module OLED SSD1306 I2C 128×64.
Branchement
SDA sur GPIO6, SCL sur GPIO7 (broches libres du DevKit), VCC 3,3 V, GND. Adressage 0x3C par défaut des modules.
Fonctionnement
i2c_new_master_bus configure les broches et l'horloge ; i2c_master_bus_add_device réserve le périphérique à 400 kHz. Chaque transmission commence par l'octet de contrôle du contrôleur SSD1306. Programmez avec ESP-IDF (idf.py set-target esp32h2) ; le port USB-Serial/JTAG (GPIO26/27) sert de console et de port de flash. Maintenez Boot + Reset pour le mode download si besoin.
Pour aller plus loin
Complétez avec la table 5×7 pour afficher tension de batterie et RSSI 802.15.4 en direct.
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);
}