« Afficheur E-paper » : différence entre les versions

De Wiki de Mémoire Vive
Aller à la navigation Aller à la recherche
Page créée avec « Toujours à la recherche d'un afficheur basse consommation. L'afficheur E-paper remplit son rôle, l'affichage subsiste même sans alimentation, avec une excellente lisibilité, même en plein soleil. Voici un exemple de code pour le tester avec l'ESP32. <pre> #include <GxEPD2_BW.h> #include <Adafruit_GFX.h> #include <Fonts/FreeSans12pt7b.h> // nouvelle police TrueType avec accents // Définition de l'écran 2.13" GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGH... »
 
(Aucune différence)

Dernière version du 29 août 2025 à 10:19

Toujours à la recherche d'un afficheur basse consommation.

L'afficheur E-paper remplit son rôle, l'affichage subsiste même sans alimentation, avec une excellente lisibilité, même en plein soleil.

Voici un exemple de code pour le tester avec l'ESP32.

#include <GxEPD2_BW.h>
#include <Adafruit_GFX.h>
#include <Fonts/FreeSans12pt7b.h> // nouvelle police TrueType avec accents

// Définition de l'écran 2.13"
GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(5, 17, 16, 4));

const char* textes[] = {
  "Le monde change, et il faut changer avec lui. – Jean-Luc Godard",
  "La vie est un art, pas une science exacte. – Philippe Starck",
  "Oser, c'est se donner la chance de reussir. – Jacques Attali",
  "Le bonheur, c'est trouver sa place sans la conquerir. – Andre Comte-Sponville",
  "On apprend plus de ses erreurs que de ses succes. – Bernard Werber",
  "Vivre, c'est apprendre sans cesse. – Boris Cyrulnik",
  "Il faut cultiver l'empathie pour comprendre le monde. – Edgar Morin",
  "Chaque jour est une occasion de se reinventer. – Marc Levy",
  "Le temps est une ressource qu'on ne peut ni recuperer ni stocker. – Fabrice Midal",
  "Savoir s'arreter est parfois la plus grande des forces. – Michel Serres",
  "La curiosite est le moteur de l'esprit. – Alain Damasio",
  "Le rire est une arme contre la rigidite de la vie. – Florence Foresti",
};

const int nbTextes = sizeof(textes) / sizeof(textes[0]);

// -----------------
// Fonction word wrap précise
// -----------------
void printWrappedAccurate(GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT>& display,
                          const char* text, int x, int y, int maxWidth, int lineHeight) {
  int cursorX = x;
  int cursorY = y;
  String word = "";

  for (int i = 0; ; i++) {
    char c = text[i];
    bool end = (c == '\0');
    if (c == ' ' || c == '\n' || end) {
      if (word.length() > 0) {
        int16_t x1, y1;
        uint16_t w, h;
        display.getTextBounds(word, 0, 0, &x1, &y1, &w, &h);

        if (cursorX + w > x + maxWidth) {
          cursorX = x;
          cursorY += lineHeight;
        }

        display.setCursor(cursorX, cursorY);
        display.print(word);
        cursorX += w + 2; // petit espace après mot
        word = "";
      }

      if (c == '\n') {
        cursorX = x;
        cursorY += lineHeight;
      }

      if (end) break;

      word += ' '; // ajoute espace
    } else {
      word += c;
    }
  }
}

// -----------------
// Setup
// -----------------
void setup() {
  display.init();
  display.setRotation(1);
  display.setFullWindow();
}

// -----------------
// Loop
// -----------------
void loop() {
  for (int i = 0; i < nbTextes; i++) {

    // --- PARTIAL REFRESH : limiter l'effacement complet ---
    display.setPartialWindow(0, 0, display.width(), display.height());

    display.firstPage();
    do {
      display.fillScreen(GxEPD_WHITE);
      display.setFont(&FreeSans12pt7b);  // police
      display.setTextColor(GxEPD_BLACK);

      int x = 10, y = 30;
      int maxWidth = 230;   // largeur max pour l'enroulement du texte
      int lineHeight = 26;  // interligne un peu plus large

      printWrappedAccurate(display, textes[i], x, y, maxWidth, lineHeight);

    } while (display.nextPage());

    delay(5000); // 5 secondes avant le texte suivant
  }
}