/*
* Claude EMERY 27/03/2025
* Affichage de différents dessins
* ESP32 + Oled 0.96
* Oled 0.96 SSD1306 SDA en D21 / SCL en D22
* https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/
*/
// Librairies
#include <Wire.h> // Gestion I2C pour Oled SDA / SCL
#include <Adafruit_GFX.h> // Affichage graphique
#include <Adafruit_SSD1306.h> // Driver Oled 0.96" - SSD1306
#include <Adafruit_Sensor.h> // Sensor Adafruit
// Configuration OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // SDA=A4 SCL=A5
//**************************************************
#define NUMFLAKES 10 // Nombre de flocon de neige dans l'exemple
/*
// Definition du logo
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
*/
void setup() {
Serial.begin(115200);
// Initialisation de l'écran OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Échec de l'initialisation de l'écran OLED !");
for (;;);
display.display();
display.clearDisplay();
}
delay(1000);
//******************************************************************
/*
* Afficher le contenu initial du tampon d'affichage sur l'écran --
* la bibliothèque initialise cela avec un écran de démarrage Adafruit.
*/
display.display();
delay(2000); // Pause de 2 secondes
// Effacer le tampon
display.clearDisplay();
// Dessinez un seul pixel en blanc
display.drawPixel(10, 10, WHITE);
/*
* Affiche le tampon d'affichage à l'écran. Vous DEVEZ appeler display() après
* commandes de dessin pour les rendre visibles à l'écran !
*/
display.display();
delay(2000);
/*
* display.display() n'est PAS nécessaire après chaque commande de dessin,
* à moins que ce soit ce que vous voulez... vous pouvez plutôt préparer un tas de
* opérations de dessin, puis mettre à jour l'écran en une seule fois en appelant
* display.display(). Ces exemples illustrent les deux approches…
*/
testdrawline(); // Tracer plusieurs lignes
//testdrawrect(); // Dessiner des rectangles (contours)
//testfillrect(); // Dessiner des rectangles (remplis)
//testdrawcircle(); // Dessiner des cercles (contours)
//testfillcircle(); // Dessiner des cercles (remplis)
//testdrawroundrect(); // Dessiner des rectangles arrondis (contours)
//testfillroundrect(); // Dessiner des rectangles arrondis (remplis)
//testdrawtriangle(); // Dessiner des triangles (contours)
//testfilltriangle(); // Dessiner des triangles (remplis)
//testdrawchar(); // Dessiner les caractères de la police par défaut
//testdrawstyles(); // Dessiner des personnages « stylisés »
//testscrolltext(); // Dessiner du texte défilant
//testdrawbitmap(); // Dessiner une petite image bitmap
// Inverser et restaurer l'affichage, en faisant une pause entre les deux
display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);
//testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animer des bitmaps
}
//********************************************************************
void loop() {
}
void testdrawline() { // Dessiner des lignes
int16_t i;
display.clearDisplay(); // Effacer le tampon d'affichage
// Dessiner une ligne
for(i=0; i<display.width(); i+=4) {
display.drawLine(0, 0, i, display.height()-1, WHITE);
display.display(); // Mettre à jour l'écran à chaque nouvelle ligne tracée
delay(1);
}
for(i=0; i<display.height(); i+=4) {
display.drawLine(0, 0, display.width()-1, i, WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for(i=0; i<display.width(); i+=4) {
display.drawLine(0, display.height()-1, i, 0, WHITE);
display.display();
delay(1);
}
for(i=display.height()-1; i>=0; i-=4) {
display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for(i=display.width()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
display.display();
delay(1);
}
for(i=display.height()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
display.display();
delay(1);
}
delay(250);
display.clearDisplay();
for(i=0; i<display.height(); i+=4) {
display.drawLine(display.width()-1, 0, 0, i, WHITE);
display.display();
delay(1);
}
for(i=0; i<display.width(); i+=4) {
display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE);
display.display();
delay(1);
}
delay(2000); // Pause de 2 secondes
}
/*
void testdrawrect(void) { // Dessiner un rectangle
display.clearDisplay();
for(int16_t i=0; i<display.height()/2; i+=2) {
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);
display.display(); // Update screen with each newly-drawn rectangle
delay(1);
}
delay(2000);
}*/
/*
void testfillrect(void) { // Dessiner un rectangle rempli
display.clearDisplay();
for(int16_t i=0; i<display.height()/2; i+=3) {
// The INVERSE color is used so rectangles alternate white/black
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, INVERSE);
display.display(); // Update screen with each newly-drawn rectangle
delay(1);
}
delay(2000);
}*/
/*
void testdrawcircle(void) { // Dessiner un cercle
display.clearDisplay();
for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
display.display();
delay(1);
}
delay(2000);
}*/
/*
void testfillcircle(void) { // Dessiner un cercle rempli
display.clearDisplay();
for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {
// The INVERSE color is used so circles alternate white/black
display.fillCircle(display.width() / 2, display.height() / 2, i, INVERSE);
display.display(); // Update screen with each newly-drawn circle
delay(1);
}
delay(2000);
}*/
/*
void testdrawroundrect(void) { // Dessiner un rectangle rond
display.clearDisplay();
for(int16_t i=0; i<display.height()/2-2; i+=2) {
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,
display.height()/4, WHITE);
display.display();
delay(1);
}
delay(2000);
}*/
/*
void testfillroundrect(void) { // Dessiner un rectangle rond rempli
display.clearDisplay();
for(int16_t i=0; i<display.height()/2-2; i+=2) {
// The INVERSE color is used so round-rects alternate white/black
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,
display.height()/4, INVERSE);
display.display();
delay(1);
}
delay(2000);
}*/
/*
void testdrawtriangle(void) { // Dessiner un triangle
display.clearDisplay();
for(int16_t i=0; i<max(display.width(),display.height())/2; i+=5) {
display.drawTriangle(
display.width()/2 , display.height()/2-i,
display.width()/2-i, display.height()/2+i,
display.width()/2+i, display.height()/2+i, WHITE);
display.display();
delay(1);
}
delay(2000);
}*/
/*
void testfilltriangle(void) { // Dessiner un triangle rempli
display.clearDisplay();
for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {
// The INVERSE color is used so triangles alternate white/black
display.fillTriangle(
display.width()/2 , display.height()/2-i,
display.width()/2-i, display.height()/2+i,
display.width()/2+i, display.height()/2+i, INVERSE);
display.display();
delay(1);
}
delay(2000);
}*/
/*
void testdrawchar(void) { // Dessiner à main levée
display.clearDisplay();
display.setTextSize(1); // Échelle de pixels normale 1:1
display.setTextColor(WHITE); // Dessiner du texte blanc
display.setCursor(0, 0); // Commencez dans le coin supérieur gauche
display.cp437(true); // Utiliser la police complète de 256 caractères « Code Page 437 »
// Tous les caractères ne tiendront pas à l'écran. C'est normal.
// La bibliothèque dessinera ce qu'elle peut et le reste sera découpé.
for(int16_t i=0; i<256; i++) {
if(i == '\n') display.write(' ');
else display.write(i);
}
display.display();
delay(2000);
}*/
/*
void testdrawstyles(void) { // Dessiner des caractères stylés
display.clearDisplay();
display.setTextSize(1); // Échelle de pixels normale 1:1
display.setTextColor(WHITE); // Dessiner du texte blanc
display.setCursor(0,0); // Commencez dans le coin supérieur gauche
display.println(F("Hello, world!"));
display.setTextColor(BLACK, WHITE); // Dessiner du texte « inverse »
display.println(3.141592);
display.setTextSize(2); // Dessiner du texte à l'échelle 2X
display.setTextColor(WHITE);
display.print(F("0x")); display.println(0xDEADBEEF, HEX);
display.display();
delay(2000);
}*/
/*
void testscrolltext(void) { // dessiner un texte déroulant
display.clearDisplay();
display.setTextSize(2); // Dessiner du texte à l'échelle 2X
display.setTextColor(WHITE);
display.setCursor(10, 0);
display.println(F("scroll"));
display.display(); // Afficher le texte initial
delay(100);
// Faites défiler dans différentes directions, en faisant une pause entre les deux :
display.startscrollright(0x00, 0x0F); // Défilement vers la droite
delay(2000);
display.stopscroll(); // Arrêt du défilement
delay(1000);
display.startscrollleft(0x00, 0x0F); // Défilement vers la gauche
delay(2000);
display.stopscroll(); // Arrêt du défilement
delay(1000);
display.startscrolldiagright(0x00, 0x07); // Défilement en diagonale droite
delay(2000);
display.startscrolldiagleft(0x00, 0x07); // Défilement en diagonale dgauche
delay(2000);
display.stopscroll(); // Arrêt du défilement
delay(1000);
}*/
/*
void testdrawbitmap(void) { // Dessiner un bitmap
display.clearDisplay();
display.drawBitmap(
(display.width() - LOGO_WIDTH ) / 2,
(display.height() - LOGO_HEIGHT) / 2,
logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
display.display();
delay(1000);
}
*/
#define XPOS 0 // Index dans le tableau « icônes » dans la fonction ci-dessous
#define YPOS 1
#define DELTAY 2
/*
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, icons[NUMFLAKES][3];
// Initialiser les positions « flocon de neige »
for(f=0; f< NUMFLAKES; f++) {
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
Serial.print(F("x: "));
Serial.print(icons[f][XPOS], DEC);
Serial.print(F(" y: "));
Serial.print(icons[f][YPOS], DEC);
Serial.print(F(" dy: "));
Serial.println(icons[f][DELTAY], DEC);
}
for(;;) { // Boucle sans fin ...
display.clearDisplay(); // Effacer la mémoire tampon d'affichage
// Dessiner chaque flocon de neige :
for(f=0; f< NUMFLAKES; f++) {
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, WHITE);
}
display.display(); // Afficher le tampon d'affichage sur l'écran
delay(200); // Pause de 1/10 seconde
// Ensuite, mettez à jour les coordonnées de chaque flocon...
for(f=0; f< NUMFLAKES; f++) {
icons[f][YPOS] += icons[f][DELTAY];
// Si le flocon de neige est en bas de l'écran...
if (icons[f][YPOS] >= display.height()) {
// Réinitialiser à une position aléatoire, juste en haut
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
}
}
}
}
*/