i2c_oled.c

ESP32-H2 · Archivo : i2c_oled.c · Lenguaje : C · Uso : Piloter un OLED SSD1306 par le pilote I2C maître

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

← Volver a la ficha