i2c_oled.c

ESP32-H2 · Fichier : i2c_oled.c · Langage : C · Usage : Piloter un OLED SSD1306 par le pilote I2C maître

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);
}

← Retour à la fiche