pourcentage batterie avec écran oled et utilisation bitmap

Bonjour,
Je souhaite réaliser un voltmètre pour batteries au plomb 24v avec affichage sur écran oled 0.96".

Pour cela, j'utilise un écran oled 0.96" 128*64 en I2C SSD1306 (voir photo en lien )
un pont diviseur de tension 30v vers 5v avec R1 = 10k et R2 = 2k

Je voudrais afficher les pourcentages en fonction de la tension ( très approximatif mais ça me suffit )
juste en échelle de 100% à 10% (100%, 90%, 80%, 70%, 60%, 50%, 40%,...)

J'ai réalisé un code mais je ne comprends pas pourquoi ça ne fonctionne pas, pouvez-vous me coriger et m'expliquer mes potentielles erreurs.

Je mets le tableau de la capacité selon tension en lien .

/*                                                    programme pour afficher et mesurer une tension max de 30VDC pour batteries
 *schema de montage pont diviseur de tension         VIN 30vdc        R1 = 10kOhm     R2 = 2KOhm    Vout = 5V quand Vin 30v
 * 
 * pour plus de précision mesurer avec précision les résistances r1 et r2 et calculer   Vout    sur digikey___calcul_pont_diviseur_de_tension faire 204,6 / ( VIN / Vout )
 * 
 * 
 * les valeurs de capacité selon tensions sont trouvées sur internet et à peu près vrai ( la capacité ne dépent pas que de la tension )  
 */

 
 
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>

#define OLED_RESET 4
Adafruit_SSD1306 display( OLED_RESET );



void setup () {
  display.begin( SSD1306_SWITCHCAPVCC, 0x3C );
  display.clearDisplay();
  
}

void loop(){
  
  float tension = analogRead(A5);  //définie la broche mesurant la tension
  tension = ( tension / 34.1 );   //calcule la tension réelle

  

  if( tension >= 25.46 ) {
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("100 %");
    

  }
  
  else if( tension >= 25.24 ) {
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("90 %");

  }
  
  else if( tension >= 25 ){
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("80 %");
 
    }
  
  else if( tension >= 24.74 ) {
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("70 %");

  }
  
  else if( tension >= 24.48 ){
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("60 %");

  }
  
  else if( tension >= 24.20 ){
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("50 %");

  }
  
  else if( tension >= 23.92 ){ 
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("40 %");

  }
  
  else if( tension >= 23.63 ){
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("30 %");

  }
  
  else if( tension >= 23.32 ){
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("20 %");

  }
  
  else if( tension >= 23.02 ){ 
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);
    display.println("10 %");

  }
}

volts-capacite.jpg

Ces lignes sont dans tous tes tests, et ne changent jamais. Tu peux les déplacer juste après le calcul de la tension et les ôter des blocs des tests.

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4,0);

Je ne vois pas d'erreur flagrante dans ton code. Tu va ne marche pas, ça peut venir de la connexion de l'écran ou du choix de la bibliothèque.

Quel est ton écran ? As-tu une référence ou une photo ? Comment est-il branché et alimenté ?

Bonjour

J'ai réalisé un code mais je ne comprends pas pourquoi ça ne fonctionne pas,

Sans description précise :
-du montage réellement effectué (alimentation et câblage de l'afficheur) d
-du dysfonctionnement observé
.....il est diffcile d'apporter une aide ! le code seul ne fait pas tout, sa cohérence avec le hardware est essentielle.

L'afficheur a t-il été testé (indépendement de la mesure de tension) avec les exemples de base fournis avec la librairie utilisée ? (Il semble que le montage utilise içi un afficheur OLED en SPI et non en I2C)
Voir ici : Overview | Monochrome OLED Breakouts | Adafruit Learning System

les lignes suivantes correspondent elles à la gestion d'un afficheur OLED en SPI .... ou d'un autre type d'afficheur ?

#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>

#define OLED_RESET 4
Adafruit_SSD1306 display( OLED_RESET );

Oui, j'ai bien testé l'écran avec des codes d'exemples sur internet et de la librairie, il marche parfaitement normalement.

Mon écran est un Velleman vma438 driver ssd1306 en une couleur ( bleu ).

Je l'ai branché sda sur sda de l'arduino et scl sur scl de l'arduino (les deux broches ers gnd et d13), VCC sur 5v et gnd sur gnd.

Quand je téléverse le code, l'écran n'affiche rien malgré une tension de batteries de 27v selon mon multimètre

Le pont diviseur de tension est bien réalisé car avant, je connaissais la tension et l'affichait sur un écran 16*2 et c'était réellement ça ( vérifié au multimètre, à 0.1v près : précision de l'arduino )

C'est pourquoi je pense toujours que c'est un problème de code.
Merci pour vos réponses

ecran_oled_0_96_avec_i2c_pour_002.jpg

Dans les exemples qui affichaient qq chose l'initialisation de l'écran était elle identique à celle du code proposée au message #1 ?

J'ai l'impression qu'il y a une incohérence entre la volonté d'utiliser un afficheur OLED I2C et la gestion effective de cet afficheur dans le code testé.
Où est, par exemple , l'appel de la librairie Wire ? (I2C)

Mieux vaudrait rependre l'initialisation OLED I2C dans les exemples qui fonctionnent....

Bonjour,

Il manque le 'display.display()' pour que l'affichage soit effectif
exemple:

 if ( tension >= 25.46 ) {
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(4, 0);
    display.println("100 %");
    display.display();
  }

Merci kamill, effectivement il manquait display.display(); et maintenant ça marche !!!

al1fch les librairies adafuit sont faites pour ça je crois et puis vu que maintenat ça marche ba c'est bon, sans doute pas besoin de wire.h

Mais j'aimerais faire un programme plus évolué mettant le pourcentage dans un bitmap en forme de batterie ( un peu comme sur les téléphones ).

En tout cas merci à tous pour vos raisonnement!!!

Tu pourrais largement réduire ton programme en utilisant une variable pour le pourcentage restant.

void loop() {
  float tension = analogRead(A5);  //définie la broche mesurant la tension
  tension = ( tension / 34.1 );   //calcule la tension réelle

  int restant;
  if ( tension >= 25.46 ) {
    restant = 100;
  }

  else if ( tension >= 25.24 ) {
    restant = 90;
  }

  else if ( tension >= 25 ) {
    restant = 80;
  }

  else if ( tension >= 24.74 ) {
    restant = 70;
  }

  else if ( tension >= 24.48 ) {
    restant = 60;
  }

  else if ( tension >= 24.20 ) {
    restant = 50;
  }

  else if ( tension >= 23.92 ) {
    restant = 40;
  }

  else if ( tension >= 23.63 ) {
    restant = 30;
  }

  else if ( tension >= 23.32 ) {
    restant = 20;
  }

  else if ( tension >= 23.02 ) {
    restant = 10;
  }
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(4, 0);
  display.print(restant);
  display.print(" % ");
  display.display();
}

Profites en pour supprimer les includes qui ne servent à rien pour un afficheur I2C et qui créent la confusion

#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>

Oui c'est vrai que je n'y ai pas pensé, surtout que c'est pour un gros projet donc économiser quelques octets ne feraient pas de mal !

J'aimerai mettre le pourcentage dans un bitmap batterie type logo batterie téléphone mais je ne sais pas encore comment créer un bitmap. J'ai mis 2 images de genre de bitmap comme je voudrais réaliser en lien en bas.

Et surtout je pense que mettre le pourcentage dans le bitmap c'est compliqué, si vous pouviez me rediriger vers un bon cours de bitmap, je suis preneur.

Merci d'avance.

Tu n'as pas intérêt à faire une bitmap, mais plutôt à construire toi même ton icône en fonction du pourcentage. Tu fais un rectangle vide et tu mets un rectangle plein à l'intérieur de la bonne taille (taille que tu calcules avec la fonction map)

J'ai fait un truc comme ça :

Je suis en admiration de ce genre de déclaration
Adafruit_SSD1306 display( OLED_RESET );

Surtout quand l'objet déclaré sous le nom de display possède une méthode "display"
et qu'on lit des choses comme :
display.display();

Choisir le nom d'une méthode pour nommer un objet est ce qu'on fait de mieux pour se foutre dedans en ajoutant de la complication inutilement.
C'est aussi la marque d'un copier coller pas vraiment bien assimilé.
N’ eu t-il pas été plus sage de nommer l'objet qui sert à afficher "afficheur" ou "ecran" ?

Adafruit_SSD1306 afficheur( OLED_RESET );
afficheur.display();
C'est un peu plus cartésien non !

Oui c'est vrai, j'avais juste copié collé bêtement sur des cours et des programmes tests !!!

Pour le bitmap batterie, je vais en créer 10 différents avec la même base mais plus ou moins de barres ( total 10 barres ) ?

Ou sinon, mettre la batterie puis un rectangle dedans et selon les pourcentages on l'agrandit ou on le rétrécit.
Ou sinon je mets les pourcentages dans la batterie, ce qui me plaît le plus.

Mais le problème c'est que je ne sais pas créer de bitmap et mettre du texte à l'intérieur, je sais afficher du texte, afficher un bitmap mais donc pas créer ce dernier et afficher du texte à l'intérieur.

Donc si vous pouviez m'expliquer pour ceux qui connaisses ou me rediriger vers un bon cours ou tuto!! :smiley_cat: