Page 1 sur 1

"Résolu" Affichage sur Oled arduino problème

Publié : dim. sept. 20, 2020 10:32 am
par Hombre
Bonjour,

J'ai réalisé pas mal d'électronique via arduino pour le M2000

Je veux changer l'affichage de 7 segments et passer sur écran oled concernant l'affichage des gauges DETOT du fuel.
Ce qui me pose problème c'est l'affichage des centaines. D'après les codes sur le 2000, pour afficher le nombres, il faut écrire chaque chiffres par son propre codes. Millier, centaine, dizaine et l'unité qui toujours à 0.
Bref pour la dizaine il s'incrémente très bien. En revanche la centaine dès la mise en route du programme in n'apparait pas. Il ne s'affiche que sur une très courte durée environ 5/10 de seconde lorsque qu'il change de centaine et disparait.
Si je ne mets pas le clearDisplay, il s'affiche mais le reste des chiffres s'incrémente sur lui même, donc pas lisible.
Je ne comprends pas pourquoi la dizaine fonctionne bien mais le reste non?

Un sachant qui pourrait m'éclairer :ouin:

Cordialement
#define DCSBIOS_DEFAULT_SERIAL

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


// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(OLED_RESET);



/**** essai afficheur Oled 0.91 Conso fuel *10 DETOT display M2000 ****/

void onFuelDetotTensChange(unsigned int FuelDetotTensValue) {
unsigned int FuelDetotTens;

if (FuelDetotTensValue == 0){FuelDetotTens=0;}
else if (FuelDetotTensValue == 6553){FuelDetotTens=1;}
else if (FuelDetotTensValue == 13107){FuelDetotTens=2;}
else if (FuelDetotTensValue == 19660){FuelDetotTens=3;}
else if (FuelDetotTensValue == 26214){FuelDetotTens=4;}
else if (FuelDetotTensValue == 32767){FuelDetotTens=5;}
else if (FuelDetotTensValue == 39321){FuelDetotTens=6;}
else if (FuelDetotTensValue == 45874){FuelDetotTens=7;}
else if (FuelDetotTensValue == 52428){FuelDetotTens=8;}
else if (FuelDetotTensValue == 58981){FuelDetotTens=9;}
else if (FuelDetotTensValue == 65535){FuelDetotTens=0;}

display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(65,10);
display.println(FuelDetotTens);
display.setCursor(85,10);
display.println("0");
display.display();

}

DcsBios::IntegerBuffer fuelDetotTensBuffer(0x726c, 0xffff, 0, onFuelDetotTensChange);

/**** essai afficheur Oled 0.91 Conso fuel *100 DETOT display M2000 ****/

void onFuelDetotCentsChange(unsigned int FuelDetotCentsValue) {
unsigned int FuelDetotCents;

if (FuelDetotCentsValue == 0){FuelDetotCents=0;}
else if (FuelDetotCentsValue == 6553){FuelDetotCents=1;}
else if (FuelDetotCentsValue == 13107){FuelDetotCents=2;}
else if (FuelDetotCentsValue == 19660){FuelDetotCents=3;}
else if (FuelDetotCentsValue == 26214){FuelDetotCents=4;}
else if (FuelDetotCentsValue == 32767){FuelDetotCents=5;}
else if (FuelDetotCentsValue == 39321){FuelDetotCents=6;}
else if (FuelDetotCentsValue == 45874){FuelDetotCents=7;}
else if (FuelDetotCentsValue == 52428){FuelDetotCents=8;}
else if (FuelDetotCentsValue == 58981){FuelDetotCents=9;}
else if (FuelDetotCentsValue == 65535){FuelDetotCents=0;}
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(35,10);
display.println(FuelDetotCents);
display.display();

}

DcsBios::IntegerBuffer fuelDetotCentsBuffer(0x726a, 0xffff, 0, onFuelDetotCentsChange);

void setup() {
DcsBios::setup();

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer
display.clearDisplay();


// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();

}

void loop() {
DcsBios::loop();

}

Re: Affichage sur Oled arduino problème

Publié : dim. sept. 20, 2020 1:01 pm
par Sleepy_Fly
Salut,

Je ne connais pas bien la librairie DcsBios mais d'après ce que je peux comprendre, il se peut que la fonction fuelDetotTensBuffer est appelée plus souvent que fuelDetotCentsBuffer.
Le problème c'est que tu effaces le display chaque fois que fuelDetotTensBuffer est appelée et bien sûr, les centaines sont effacées.
Je propose d'utiliser 2 variables globales pour mémoriser les valeurs des dizaines et centaines et de sortir le code de mise à jour du display et créer une fonction appelée dans fuelDetotTensBuffer et fuelDetotCentsBuffer.

Je propose ces modifications dans ton code (en gras et lumineux)

Ça marchera peut-être pas du 1er coup vu que je ne peux pas tester .

ET INDENTEZ VOTRE CODE, NANDEDJÛÛÛ!
:hum:

********

#define DCSBIOS_DEFAULT_SERIAL

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


// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(OLED_RESET);

// Déclare variables globales
unsigned int gFuelDetotTens;
unsigned int gFuelDetotCents;


// fonction refresh display
void refreshDisplay() {
// réafficher les dizaines ET les centaines (variables globales)
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(35,10);
display.println(gFuelDetotCents); // on affiche la valeur de la variable globale (centaine)
display.setCursor(65,10);
display.println(gFuelDetotTens); // on affiche la valeur de la variable globale (dizaine)
display.setCursor(85,10);
display.println("0");
display.display();
}




/**** essai afficheur Oled 0.91 Conso fuel *10 DETOT display M2000 ****/

void onFuelDetotTensChange(unsigned int FuelDetotTensValue) {
//unsigned int FuelDetotTens;

// mise à jour de la variable globale
if (FuelDetotTensValue == 0){gFuelDetotTens=0;}
else if (FuelDetotTensValue == 6553){gFuelDetotTens=1;}
else if (FuelDetotTensValue == 13107){gFuelDetotTens=2;}
else if (FuelDetotTensValue == 19660){gFuelDetotTens=3;}
else if (FuelDetotTensValue == 26214){gFuelDetotTens=4;}
else if (FuelDetotTensValue == 32767){gFuelDetotTens=5;}
else if (FuelDetotTensValue == 39321){gFuelDetotTens=6;}
else if (FuelDetotTensValue == 45874){gFuelDetotTens=7;}
else if (FuelDetotTensValue == 52428){gFuelDetotTens=8;}
else if (FuelDetotTensValue == 58981){gFuelDetotTens=9;}
else if (FuelDetotTensValue == 65535){gFuelDetotTens=0;}

//display.clearDisplay();
//display.setTextSize(3);
//display.setTextColor(WHITE);
//display.setCursor(65,10);
//display.println(FuelDetotTens);
//display.setCursor(85,10);
//display.println("0");
//display.display();



// appel refreshDisplay() plutôt que le code dans cette fonction.
refreshDisplay();


}

DcsBios::IntegerBuffer fuelDetotTensBuffer(0x726c, 0xffff, 0, onFuelDetotTensChange);

/**** essai afficheur Oled 0.91 Conso fuel *100 DETOT display M2000 ****/

void onFuelDetotCentsChange(unsigned int FuelDetotCentsValue) {
//unsigned int FuelDetotCents;

// mise à jour de la variable globale

if (FuelDetotCentsValue == 0){gFuelDetotCents=0;}
else if (FuelDetotCentsValue == 6553){gFuelDetotCents=1;}
else if (FuelDetotCentsValue == 13107){gFuelDetotCents=2;}
else if (FuelDetotCentsValue == 19660){gFuelDetotCents=3;}
else if (FuelDetotCentsValue == 26214){gFuelDetotCents=4;}
else if (FuelDetotCentsValue == 32767){gFuelDetotCents=5;}
else if (FuelDetotCentsValue == 39321){gFuelDetotCents=6;}
else if (FuelDetotCentsValue == 45874){gFuelDetotCents=7;}
else if (FuelDetotCentsValue == 52428){gFuelDetotCents=8;}
else if (FuelDetotCentsValue == 58981){gFuelDetotCents=9;}
else if (FuelDetotCentsValue == 65535){gFuelDetotCents=0;}

//display.clearDisplay();
//display.setTextSize(3);
//display.setTextColor(WHITE);
//display.setCursor(35,10);
//display.println(FuelDetotCents);
//display.display();

// appel refreshDisplay() plutôt que le code dans cette fonction.
refreshDisplay();


}




DcsBios::IntegerBuffer fuelDetotCentsBuffer(0x726a, 0xffff, 0, onFuelDetotCentsChange);

void setup() {

// Initialise variables globales;
gFuelDetotTens = 0;
gFuelDetotCents = 0;


DcsBios::setup();

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer
display.clearDisplay();


// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();

}

void loop() {
DcsBios::loop();

}

Re: Affichage sur Oled arduino problème

Publié : dim. sept. 20, 2020 2:30 pm
par Hombre
Superbe, je te remercie beaucoup.
J'ai compris la manip
i'happy

très cordialement

Re: "Résolu" Affichage sur Oled arduino problème

Publié : dim. sept. 20, 2020 2:41 pm
par Sleepy_Fly
Super.
Sortir la fonction de rafraichissement de l'écran est une bonne solution.
Imagine qu'avec l'évolution de ton système tu aies une dizaine de données à rafraichir tu ne devras modifier que cette fonction.
Evidement, il faudra créer autant de variables globales que de données.
Néanmoins, si la fonction refreshDisplay est appelée trop souvent (plusieurs fois par seconde), il risque d'y avoir du flicking (clignotement dû au clearDisplay).
On peut imaginer de découper la fonction pour ne mettre à jour que certaines portions de l'écran.

Re: "Résolu" Affichage sur Oled arduino problème

Publié : dim. sept. 20, 2020 2:50 pm
par Sleepy_Fly
je me demande si ce ne serait pas plus efficace. Il y a moins de commandes envoyées à l'écran OLED -> plus rapide

// fonction refresh display
void refreshDisplay() {
// calculer total carburant
unsigned int totalCarburant;
totalCarburant = gFuelDetotCents * 100 + gFuelDetotTens * 10; // (unité toujours à 0)
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(35,10);
display.println(totalCarburant);
display.display();
}

Re: "Résolu" Affichage sur Oled arduino problème

Publié : dim. sept. 20, 2020 3:11 pm
par Hombre
Je testerais, merci

Re: "Résolu" Affichage sur Oled arduino problème

Publié : dim. sept. 20, 2020 3:37 pm
par Sleepy_Fly
Et pour calculer les dizaines et les centaines (dans les fonctions correspondantes) et gagner un peu de mémoire programme.
Vu qu'on traite des int (entier), le reste de la division est ignoré.

if (FuelDetotTensValue == 0 || FuelDetotTensValue == 65535 ) {
gFuelDetotCents=0;
} else {
gFuelDetotTens = FuelDetotTensValue / 6553 ;
}

if (FuelDetotCentsValue == 0 || FuelDetotCentsValue == 65535 ) {
gFuelDetotCents=0;
} else {
gFuelDetotCents = FuelDetotCentsValue / 6553 ;
}

Re: "Résolu" Affichage sur Oled arduino problème

Publié : mar. sept. 22, 2020 11:15 am
par GunMan
Voire même :

gFuelDetotTens = (FuelDetotTensValue / 6553) % 10;

Par ailleurs; je ne sais pas comment fonctionne ta boucle Dcsbios::loop ni ton afficheur Oled mais typiquement devoir set la couleur et la taille des caractères à chaque refresh c'est pas très optimisé - éventuellement ça serait mieux de les passer dans une fonction d'initialisation ?

Re: "Résolu" Affichage sur Oled arduino problème

Publié : mar. sept. 22, 2020 7:17 pm
par Sleepy_Fly
GunMan a écrit :
mar. sept. 22, 2020 11:15 am
Voire même :
gFuelDetotTens = (FuelDetotTensValue / 6553) % 10;
Pas la peine, on traite déjà des entiers et le compilateur le sait aussi. ;-)
Par ailleurs; je ne sais pas comment fonctionne ta boucle Dcsbios::loop ni ton afficheur Oled mais typiquement devoir set la couleur et la taille des caractères à chaque refresh c'est pas très optimisé - éventuellement ça serait mieux de les passer dans une fonction d'initialisation ?
:yes:
Faudrait voir si clearDisplay() n'efface pas ces paramètres.

Re: "Résolu" Affichage sur Oled arduino problème

Publié : mer. sept. 23, 2020 10:35 am
par Sleepy_Fly
GunMan a écrit :
mar. sept. 22, 2020 11:15 am


gFuelDetotTens = (FuelDetotTensValue / 6553) % 10;

Bon sang, chuis con...
je m'incline ! :notworthy