Problème mise à jour caractère écran OLED (RESOLU)

Bonjour tous le monde,

Je suis nouveau sur ARDUINO et je réalise actuellement un compteur GEIGER avec écran OLED 0.96 pouces et une connexion Bluetooth afin de le piloter depuis un smartphone. Je découvre ARDUINO et en glanant quelques bout de code à droite et à gauche j’arrive plus ou moins à obtenir ce que je veux et à comprendre plus ou moins le code que j’écrit.

Voici mon code sans la partie bluetooth.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

#define LOG_PERIOD 15000     //Période d'enregistrement en millisecondes, valeur recommandée 15000-60000.

#define MAX_PERIOD 60000    //Période d'enregistrement maximale

unsigned long counts;             //Variable pour les événements GM Tube

unsigned long cpm;                 //Variable pour CPM

unsigned int multiplier;             //Variable pour le calcul du CPM dans cette esquisse

unsigned long previousMillis;      //Variable pour la mesure du temps


// 'RadioActivite', 25x25px
const unsigned char myBitmap [] PROGMEM = {
  0xff, 0xff, 0xff, 0x80, 0xff, 0xc0, 0xff, 0x80, 0xfe, 0x00, 0x1f, 0x80, 0xf8, 0xff, 0x8f, 0x80, 
  0xf3, 0xff, 0xe3, 0x80, 0xe0, 0xff, 0x83, 0x80, 0xc0, 0x7f, 0x81, 0x80, 0xd0, 0x7f, 0x00, 0x80, 
  0x80, 0x3e, 0x02, 0x80, 0xa0, 0x1e, 0x00, 0x00, 0x80, 0x1e, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 
  0x00, 0x01, 0x01, 0x00, 0x3f, 0xc1, 0xff, 0x00, 0x3f, 0xc1, 0xff, 0x00, 0x3f, 0xe3, 0xff, 0x00, 
  0xbf, 0xc1, 0xfe, 0x00, 0x9f, 0x80, 0xfe, 0x80, 0x9f, 0x80, 0x7c, 0x80, 0xcf, 0x00, 0x7c, 0x80, 
  0xe6, 0x00, 0x39, 0x80, 0xf2, 0x00, 0x13, 0x80, 0xf9, 0x00, 0x07, 0x80, 0xfc, 0x2e, 0x1f, 0x80, 
  0xff, 0x00, 0x7f, 0x80
}; 

void tube_impulse(){               //Procédure pour capturer des événements de Geiger Kit

  counts++;

}

#define OLED_RESET 20
Adafruit_SSD1306 display( OLED_RESET );

#if( SSD1306_LCDHEIGHT != 64 )
#error( "Hauteur incorrecte, veuillez corriger Adafruit_SSD1306.h!" );
#endif

void setup(){                    //Procédure de configuration



 // Initialise la communication I²C à l'adresse 0x3C.
  display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
  display.clearDisplay();
  
  display.setTextSize( 1 );
  display.setTextColor( WHITE );
  display.clearDisplay();
  
  // Positionnez le curseur au début de la 6ème ligne (la dernière)
  display.setCursor( 20, 0 );
  display.println( "Compteur GEIGER" );
  display.display();

  display.setCursor( 23, 10 );
  display.println( "Firmware 1.2.0" );
  display.display();

  display.drawBitmap(50, 24,  myBitmap, 25, 25, WHITE);
 
  delay(5000);
  display.clearDisplay();

  display.setCursor(0, 0);
  display.print("Compteur GEIGER :");
  display.display();
  
  display.setCursor(0, 20);
  display.print("CPM:");  
  display.display();
  
  display.setCursor(0, 40 );
  display.print("uSv/hr:"); 
  display.display(); 

  display.drawBitmap(100, 30,  myBitmap, 25, 25, WHITE);
  display.display();

  counts = 0;

  cpm = 0;

  multiplier = MAX_PERIOD / LOG_PERIOD;      //Multiplicateur de calcul, dépend de votre période de journal

  Serial.begin(9600);                                    // Démarrer le moniteur série

  pinMode(2, INPUT);                                   // Définir l'entrée pin INT0 pour capturer les événements GM Tube

  digitalWrite(2, HIGH);                                 // Activer les résistances internes de pullup, souder C-INT sur le PCB

  attachInterrupt(0, tube_impulse, FALLING);  //Définir des interruptions externes

}

 

void loop(){                                               //Cycle principal
    
//Calcul CPM
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > LOG_PERIOD){

    previousMillis = currentMillis;

    cpm = counts * multiplier;

        Serial.println(cpm);                              // Envoyer des données cpm à Radiation Logger

        Serial.write(' ');                                // Envoyer un caractère nul pour séparer les données suivantes

    counts = 0;

  }


  display.setCursor(30, 20); //Affichage du nombre de coup par minutes
  display.print(cpm); 
  display.display();
  delay(1);

}

La gestion du compteur GEIGER et faite et pour l’afficheur je rencontre un problème sur l’affichage des Coups par minutes (CPM).

Ca fonctionne sauf qu’à la mise à jour des valeurs pour le nombre de CPM détectés le chiffre et réécrit par dessus l’autre et on ne voie plus rien, et je ne sais vraiment pas comment faire pour effacer l’ancien chiffre avant d’écrire le nouveau.

Pour les µSv/hr la fonction n’est pas encore programmée.

Soyez cool les puristes car je pense que mon code ne doit pas être propre :wink:

Merci d’avance pour votre aide.

Voici une photo du problème après CPM:

Problème courant : efface la zone auparavant.

  display.setCursor(30, 20); //Affichage du nombre de coup par minutes
  display.print("  ");
  display.setCursor(30, 20); //Affichage du nombre de coup par minutes
  display.print(cpm);
  display.display();

J'ai bien essayé cette méthode mais ca ne change rien le problème persiste.

Étonnant ...

Sinon, il faut remplir un rectangle avec la couleur de fond en calculant la taille du texte maximal avec getTextBounds().
Je fais ça avec des écrans TFT.

Mais en général vu le peu de choses que l'on affiche sur ces écrans OLED on peut se permettre d'effacer l'écran à chaque fois et tout réafficher.

display.clearDisplay() n'efface que la mémoire tampon, pas l'écran, donc l'effet n'est pas visible.

Bonjour,

Il faut préciser la couleur du fond de texte, sinon le fond est transparent

display.setTextColor(WHITE, BLACK);

Bonne idée :wink:

La commande avec la couleur du font à résolu mon problème.

display.setTextColor(WHITE, BLACK);

Merci beaucoup les gars pour votre aide.