ESP32 et afficheur oled 256x64

Bonjour à tous.
Je veux ici faire profiter de ma petite expérimentation réalisée à l'aide d'un afficheur oled chinois:

http://www.wide.hk/index.php?route=product/product&path=18_46&product_id=63

Pour une trentaine d'euros, on dispose d'un afficheur graphique monochrome compatible avec le driver ESSD1322 et la librairie u8g2.
.
Je me suis battu avec ce produit un bon moment avant d'arriver à le faire fonctionner. Alors, je vous donne la combine qui permet de piloter cet afficheur avec un ESP32:

Ouvrez le fichier: /Arduino/libraries/U8g2/src/clib/u8g2.h et décommentez s'il y a lieu la ligne #define U8G2_16BIT
Dans mon cas, elle était en commentaire et pas moyen de faire fonctionner cet afficheur avec le ESP32.
A toutes fins utiles, voici mon ficier projet d'essai:

#include <U8x8lib.h>
#include <U8g2lib.h>
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>

/*   -----------------------------------------------------------------------
 *   Wiring ESP32 / WIDE NHK SPI 3.12" ( 3.2" ) 256x64 Graphic OLED Display 
 *   -----------------------------------------------------------------------
 *   OLED                   ESP-07  Pin
 *   -----------------------------------------------------------------------
 *   RES                    GPIO-25 
 *   DC/RS                 GPIO-26
 *   DATA (MOSI)       GPIO-23
 *   SCL (CLK)            GPIO-18
 *   CS                       GPIO-27
 *   GND                    GND
 *   VCC                    VCC     
 */

//ESP32
#define _clk 14
#define _mosi 13
#define _cs   27  
#define _dc   26  
#define _rst  25   

U8G2_SSD1322_NHD_256X64_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ _cs, /* dc=*/ _dc,_rst);  // 4 wire hardware sur VSPI clk & mosi natifs
int i(0);

void setup(void) {
   Serial.begin(115200);   
    u8g2.begin();
}

void loop(void) { 
  u8g2.firstPage();
  do {
    if(++i>120)  i=20;
    u8g2.setFont(u8g2_font_ncenB14_tr);
    u8g2.drawStr(i,24,"Hello World!");
  } while ( u8g2.nextPage() );
}

Une petite vérification à l'oscilloscope montre des impulsions SPI de 50 nanosecondes. ça déménage pas mal..

Voilà.

bisra:
Je veux ici faire profiter de ma petite expérimentation réalisée à l'aide d'un afficheur oled chinois:

256 Pixels, c'est pas mal, mais le module coute dix fois le prix des modules OLED 128x64!
On trouve des LCD couleur QVGA a trois fois moins cher.

Bonsoir,
A ma connaissance, c'est lez module OLED le plus grand disponible à moins de 30 Euros 9,8cm x 3cm.

En matière de consommation, elle est bien plus basse qu'un TFT. Tout dépend du besoin et du projet.

Si on veut par exemple afficher du texte sur une largeur de 32 caractères et 8 lignes, ce produit est pertinent.

Par contre, l'utilisation de la librairie U8g2 est délicate avecESP32 sous Arduino. Les objets graphiques ne supportent pas l'utilisation de Ticker.h.

Pour mon projet actuel, j'avais besoin d'utiliser un clavier matriciel conjointement avec l'afiicheur OLED. Ma fonction de debouncing bien que très économe en temps machine réclame une exécution répétitive à environ 300 Hz. Avec un ESP8266, ça ne pose aucun problème de faire appel à Ticker pour faire cela.

Par contre avec un ESP32, cela ne fonctionne pas. Il y a un conflit de temps réel entre la librairie U8g2 et les timers en activité.

J'ai résolu le problème en plaçant ma fonction de debouncing dans une tache RTOS.

bisra:
Pour mon projet actuel, j'avais besoin d'utiliser un clavier matriciel conjointement avec l'afficheur OLED.

Combien de touches ton clavier matriciel?
J'ai fini aujourd'hui un clavier analogique 5x4 il n'a besoin que d'une seule entrée analogique et n'a besoin d'aucune bibliothèque.

Analog Keyboard

Si tu as des probèmes de compatibilité, tu pourrais le connecter an mode SPI.

J'utilise un MCP23S17 qui dispose de 16 E/S. On peut donc gérer jusqu'à 64 touches.

Pour l'instant, j'ai utilisé 4x4 et 4x5. J'ai aussi essayé le décodage analogique. Ca fonctionne mais il faut plein de résistances de valeurs assez précises. Et j'avais des erreurs dans le temps probablement à mettre au compte des dérives en température.

Finalement, gérer un clavier par logiciel, ça marche bien une fois que l'on a résolu le problème du debouncing et au point de vue matériel c'est plus simple. Les ressources mobilisées sont 1xGPIO pour le chip select et 2 ou 3 GPIO pour le SPI du micro qui sont partagés avec l'afficheur SPI et éventuellement d'autres boîtiers SPI.

bisra:
J'utilise un MCP23S17 qui dispose de 16 E/S. On peut donc gérer jusqu'à 64 touches.

Pour l'instant, j'ai utilisé 4x4 et 4x5. J'ai aussi essayé le décodage analogique. Ca fonctionne mais il faut plein de résistances de valeurs assez précises. Et j'avais des erreurs dans le temps probablement à mettre au compte des dérives en température.

Finalement, gérer un clavier par logiciel, ça marche bien une fois que l'on a résolu le problème du debouncing et au point de vue matériel c'est plus simple. Les ressources mobilisées sont 1xGPIO pour le chip select et 2 ou 3 GPIO pour le SPI du micro qui sont partagés avec l'afficheur SPI et éventuellement d'autres boîtiers SPI.

Si tu n'entres dans la routine clavier que toutes les 100ms par ex, tu n'as pas besoin de debouncing.

RIN67630:
Si tu n'entres dans la routine clavier que toutes les 100ms par ex, tu n'as pas besoin de debouncing.

Bonjour,

+1
Je ne vois pas très bien le problème de debouncing avec un clavier matriciel. Il suffit de scanner avec une période supérieure à 20 ms.

bisra:
Ca fonctionne mais il faut plein de résistances de valeurs assez précises.

En fait pas vraiment. Toutes les resistances sont a 1% actuellement.
Mon schema prevoit deux valeurs seulement. Si on les achète ensemble par dix, elles sont du même lot et ont peu de variance.