Files
ESP32-C3-dualboost/legacy/er_oled.cpp
nicoboy 3c03e3fbf1 Migre l'IHM OLED vers u8g2 (dashboard graphique, splash anime, economiseur d'ecran) et active la liaison TMS320 reelle
- TMS_DUMMY_MODE=false : reception/emission UART reelle avec le TMS320
  (au lieu de la simulation), echo debug optionnel sur Serial.
- Remplace le driver OLED maison (legacy/er_oled.*) par u8g2 : dashboard
  graphique avec bargraphs, icones d'alerte/danger, splash logo anime,
  economiseur d'ecran (balle rebondissante) qui se reactive sur activite
  HT ou consultation du dashboard web.
- Renomme le SSID WiFi en "HIVY", documente le protocole UART et les
  problemes d'affichage SSD1322/u8g2 rencontres (doc/OLED-u8g2.md).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 23:11:35 +02:00

226 lines
12 KiB
C++

// Adapte du tutoriel EastRising Technology (buydisplay.com) pour
// ER-OLEDM032-1 / SSD1322, repointe sur les broches SPI de l'ESP32-C3
// (config.h) et limite a l'affichage texte.
#include "er_oled.h"
#include "config.h"
#include <SPI.h>
static const uint8_t AsciiLib[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* */
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x18,0x18,0x00,0x00, /* ! */
0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00, /* " */
0x00,0x00,0x00,0x14,0x14,0x7E,0x14,0x14,0x28,0x7E,0x28,0x28,0x28,0x00,0x00,0x00, /* # */
0x00,0x00,0x10,0x38,0x54,0x54,0x50,0x30,0x18,0x14,0x54,0x54,0x38,0x10,0x10,0x00, /* $ */
0x00,0x00,0x00,0x44,0xA4,0xA8,0xA8,0x50,0x14,0x2A,0x2A,0x4A,0x44,0x00,0x00,0x00, /* % */
0x00,0x00,0x00,0x20,0x50,0x50,0x50,0x7C,0xA8,0xA8,0x98,0x88,0x76,0x00,0x00,0x00, /* & */
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00, /* ' */
0x00,0x00,0x04,0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x04,0x00, /* ( */
0x00,0x00,0x20,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x20,0x00, /* ) */
0x00,0x00,0x00,0x00,0x10,0x10,0xD6,0x38,0x38,0xD6,0x10,0x10,0x00,0x00,0x00,0x00, /* * */
0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x00,0x00,0x00,0x00, /* + */
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x08,0x30,0x00,0x00,0x00,0x00,0x00,0x00, /* , */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* . */
0x00,0x00,0x02,0x04,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x00, /* / */
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,0x00, /* 0 */
0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x00, /* 1 */
0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,0x00, /* 2 */
0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x42,0x42,0x3C,0x00,0x00,0x00, /* 3 */
0x00,0x00,0x00,0x08,0x08,0x18,0x28,0x48,0x48,0x7E,0x08,0x08,0x1E,0x00,0x00,0x00, /* 4 */
0x00,0x00,0x00,0x7E,0x40,0x40,0x5C,0x62,0x02,0x02,0x42,0x42,0x3C,0x00,0x00,0x00, /* 5 */
0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, /* 6 */
0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, /* 7 */
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, /* 8 */
0x00,0x00,0x00,0x38,0x44,0x42,0x42,0x46,0x3A,0x02,0x02,0x24,0x38,0x00,0x00,0x00, /* 9 */
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, /* : */
0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,0x00,0x00,0x00, /* ; */
0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00, /* < */
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, /* = */
0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00, /* > */
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x02,0x04,0x08,0x08,0x00,0x18,0x18,0x00,0x00, /* ? */
0x00,0x00,0x00,0x38,0x44,0x9A,0xAA,0xAA,0xAA,0xAA,0xB4,0x42,0x3C,0x00,0x00,0x00, /* @ */
0x00,0x00,0x00,0x10,0x10,0x28,0x28,0x28,0x28,0x7C,0x44,0x44,0xEE,0x00,0x00,0x00, /* A */
0x00,0x00,0x00,0xFC,0x42,0x42,0x44,0x78,0x44,0x42,0x42,0x42,0xFC,0x00,0x00,0x00, /* B */
0x00,0x00,0x00,0x3E,0x42,0x82,0x80,0x80,0x80,0x80,0x82,0x44,0x38,0x00,0x00,0x00, /* C */
0x00,0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00,0x00, /* D */
0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x42,0xFC,0x00,0x00,0x00, /* E */
0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x40,0xE0,0x00,0x00,0x00, /* F */
0x00,0x00,0x00,0x3C,0x44,0x84,0x80,0x80,0x80,0x8E,0x84,0x44,0x38,0x00,0x00,0x00, /* G */
0x00,0x00,0x00,0xEE,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0xEE,0x00,0x00,0x00, /* H */
0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x00, /* I */
0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0xF0,0x00,0x00, /* J */
0x00,0x00,0x00,0xEE,0x44,0x48,0x50,0x70,0x50,0x48,0x48,0x44,0xEE,0x00,0x00,0x00, /* K */
0x00,0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0xFE,0x00,0x00,0x00, /* L */
0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00,0x00, /* M */
0x00,0x00,0x00,0xEE,0x64,0x64,0x54,0x54,0x54,0x4C,0x4C,0x4C,0xE4,0x00,0x00,0x00, /* N */
0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00,0x00, /* O */
0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x40,0xE0,0x00,0x00,0x00, /* P */
0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0xB2,0x4C,0x38,0x06,0x00,0x00, /* Q */
0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x78,0x50,0x48,0x48,0x44,0xE6,0x00,0x00,0x00, /* R */
0x00,0x00,0x00,0x3E,0x42,0x42,0x40,0x30,0x0C,0x02,0x42,0x42,0x7C,0x00,0x00,0x00, /* S */
0x00,0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, /* T */
0x00,0x00,0x00,0xEE,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, /* U */
0x00,0x00,0x00,0xEE,0x44,0x44,0x44,0x28,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, /* V */
0x00,0x00,0x00,0xD6,0x54,0x54,0x54,0x54,0x6C,0x28,0x28,0x28,0x28,0x00,0x00,0x00, /* W */
0x00,0x00,0x00,0xEE,0x44,0x28,0x28,0x10,0x10,0x28,0x28,0x44,0xEE,0x00,0x00,0x00, /* X */
0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, /* Y */
0x00,0x00,0x00,0x3E,0x44,0x04,0x08,0x08,0x10,0x10,0x20,0x22,0x7E,0x00,0x00,0x00, /* Z */
0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x00, /* [ */
0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x00, /* \ */
0x00,0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x3C,0x00, /* ] */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* _ */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ` */
0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x1C,0x24,0x44,0x44,0x3E,0x00,0x00,0x00,0x00, /* a */
0x00,0x00,0x00,0xC0,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, /* b */
0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00,0x00,0x00, /* c */
0x00,0x00,0x00,0x0C,0x04,0x04,0x7C,0x84,0x84,0x84,0x84,0x8C,0x76,0x00,0x00,0x00, /* d */
0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x40,0x42,0x3C,0x00,0x00,0x00,0x00, /* e */
0x00,0x00,0x00,0x0E,0x12,0x10,0x7C,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x00, /* f */
0x00,0x00,0x00,0x00,0x3E,0x44,0x44,0x38,0x40,0x3C,0x42,0x42,0x3C,0x00,0x00,0x00, /* g */
0x00,0x00,0x00,0xC0,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,0x00, /* h */
0x00,0x00,0x00,0x30,0x30,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x00, /* i */
0x00,0x00,0x0C,0x0C,0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x78,0x00,0x00, /* j */
0x00,0x00,0x00,0xC0,0x40,0x40,0x4E,0x48,0x50,0x68,0x48,0x44,0xEE,0x00,0x00,0x00, /* k */
0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x00, /* l */
0x00,0x00,0x00,0x00,0x00,0xF8,0x54,0x54,0x54,0x54,0x54,0xD6,0x00,0x00,0x00,0x00, /* m */
0x00,0x00,0x00,0x00,0x00,0xDC,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,0x00,0x00, /* n */
0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x24,0x18,0x00,0x00,0x00,0x00, /* o */
0x00,0x00,0x00,0x00,0xDC,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0xE0,0x00,0x00,0x00, /* p */
0x00,0x00,0x00,0x00,0x7C,0x84,0x84,0x84,0x84,0x8C,0x74,0x04,0x0E,0x00,0x00,0x00, /* q */
0x00,0x00,0x00,0x00,0x00,0xEE,0x32,0x20,0x20,0x20,0x20,0xF8,0x00,0x00,0x00,0x00, /* r */
0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x40,0x38,0x04,0x44,0x78,0x00,0x00,0x00,0x00, /* s */
0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x10,0x10,0x10,0x0C,0x00,0x00,0x00, /* t */
0x00,0x00,0x00,0x00,0x00,0xC6,0x42,0x42,0x42,0x42,0x46,0x3B,0x00,0x00,0x00,0x00, /* u */
0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x10,0x10,0x00,0x00,0x00,0x00, /* v */
0x00,0x00,0x00,0x00,0x00,0xD6,0x54,0x54,0x54,0x28,0x28,0x28,0x00,0x00,0x00,0x00, /* w */
0x00,0x00,0x00,0x00,0x00,0x6E,0x24,0x18,0x18,0x18,0x24,0x76,0x00,0x00,0x00,0x00, /* x */
0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x18,0x10,0x10,0xE0,0x00,0x00,0x00, /* y */
0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x08,0x10,0x10,0x22,0x7E,0x00,0x00,0x00,0x00, /* z */
};
static void oled_command(uint8_t cmd) {
digitalWrite(PIN_OLED_DC, LOW);
digitalWrite(PIN_OLED_CS, LOW);
SPI.transfer(cmd);
digitalWrite(PIN_OLED_CS, HIGH);
}
static void oled_data(uint8_t dat) {
digitalWrite(PIN_OLED_DC, HIGH);
digitalWrite(PIN_OLED_CS, LOW);
SPI.transfer(dat);
digitalWrite(PIN_OLED_CS, HIGH);
}
// Convertit 1 octet noir/blanc (8 pixels) en 4 octets de niveaux de gris
// (2 pixels par octet, format SSD1322 4 bits/pixel).
static void data_processing(uint8_t temp) {
uint8_t hi, lo;
hi = (temp & 0x80) ? 0xF0 : 0x00;
lo = (temp & 0x40) ? 0x0F : 0x00;
oled_data(hi | lo);
hi = (temp & 0x20) ? 0xF0 : 0x00;
lo = (temp & 0x10) ? 0x0F : 0x00;
oled_data(hi | lo);
hi = (temp & 0x08) ? 0xF0 : 0x00;
lo = (temp & 0x04) ? 0x0F : 0x00;
oled_data(hi | lo);
hi = (temp & 0x02) ? 0xF0 : 0x00;
lo = (temp & 0x01) ? 0x0F : 0x00;
oled_data(hi | lo);
}
void er_oled_SetWindow(uint8_t Xstart, uint8_t Ystart, uint8_t Xend, uint8_t Yend) {
oled_command(0x15);
oled_data(Xstart + 0x1C);
oled_data(Xend + 0x1C);
oled_command(0x75);
oled_data(Ystart);
oled_data(Yend);
oled_command(0x5C); // write RAM
}
void er_oled_clear() {
er_oled_SetWindow(0x00, 0x00, 0x77, 0x7F);
for (int row = 0; row < 128; row++) {
for (int i = 0; i < 240; i++) {
oled_data(0x00);
}
}
}
void er_oled_char(uint8_t x, uint8_t y, const char *ascii, uint8_t mode) {
x = x / 4;
uint16_t offset = (*ascii - 32) * 16;
er_oled_SetWindow(x, y, x + 1, y + 15);
for (uint8_t i = 0; i < 16; i++) {
uint8_t b = pgm_read_byte(&AsciiLib[offset + i]);
if (mode) b = ~b;
data_processing(b);
}
}
void er_oled_string(uint8_t x, uint8_t y, const char *pString, uint8_t mode) {
while (*pString != 0) {
er_oled_char(x, y, pString, mode);
x += 8;
pString += 1;
}
}
void er_oled_begin() {
pinMode(PIN_OLED_RST, OUTPUT);
pinMode(PIN_OLED_DC, OUTPUT);
pinMode(PIN_OLED_CS, OUTPUT);
// Broches SPI personnalisees : sck, miso (non cable), mosi, ss
SPI.begin(PIN_OLED_CLK, -1, PIN_OLED_MOSI, PIN_OLED_CS);
SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
digitalWrite(PIN_OLED_CS, LOW);
digitalWrite(PIN_OLED_RST, HIGH);
delay(10);
digitalWrite(PIN_OLED_RST, LOW);
delay(10);
digitalWrite(PIN_OLED_RST, HIGH);
oled_command(0xFD); // set command lock
oled_data(0x12); // unlock
oled_command(0xAE); // display off
oled_command(0xB3); // clock divider / osc frequency
oled_data(0x91);
oled_command(0xCA); // multiplex ratio
oled_data(0x3F); // duty = 1/64
oled_command(0xA2); // display offset
oled_data(0x00);
oled_command(0xA1); // start line
oled_data(0x00);
oled_command(0xA0); // set remap
oled_data(0x14);
oled_data(0x11);
oled_command(0xAB); // function selection
oled_data(0x01); // external VDD
oled_command(0xB4);
oled_data(0xA0);
oled_data(0xFD);
oled_command(0xC1); // contrast current
oled_data(0x80);
oled_command(0xC7); // master contrast current control
oled_data(0x0F);
oled_command(0xB1); // phase length
oled_data(0xE2);
oled_command(0xD1);
oled_data(0x82);
oled_data(0x20);
oled_command(0xBB); // pre-charge voltage
oled_data(0x1F);
oled_command(0xB6); // second pre-charge period
oled_data(0x08);
oled_command(0xBE); // VCOMH
oled_data(0x07);
oled_command(0xA6); // normal display
oled_command(0xAF); // display on
}