Bonsoir,
@J-M-L :
Alors, j'ai essayer d'utiliser l'une des méthodes de votre tutoriel, plus précisément, celle utilisée pour l'exercice n°1.
J'ai effectivement mes différents écrans qui "fonctionnent".
Cependant, j'ai deux problèmes:
problème 1 : mes mesures (tension batterie 36v par exemple) ne s'actualisent plus, sauf lors du passage d'un écran à l'autre.
problème 2 : le changement d'écran ne s'effectue pas lors d'un simple clic sur le poussoir, mais aléatoirement (1, 2, ..., voire 4 clics)
Je vous met mon code en pièce jointe si ça peut aider :
// Le numéro de broche analogique pour la mesure de la tension en VIN
const byte BROCHE_CAPTEUR_VIN = A0;
// Coefficient diviseur du pont de résistance
const float COEFF_PONT_DIVISEUR_VIN = 9.1910847267667;
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneButton.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#include "RunningAverage.h"
RunningAverage MoyGliss(60); // objet "Moyenne Glissante" avec nombre d'échantillons pour le calcul
int compteur = 0; // un compteur d'échantillons
float moyenne = 0; // la moyenne glissante des échantillons
int inputPin = A0;
const byte buttonPin = 3; // on définit un nom pour la pin associée au bouton
OneButton button(buttonPin, true); // true pour dire qu'on est en INPUT_PULLUP, donc actif LOW, connecté à GND
// la liste des états possible de notre système
// ainsi qu'une variable etatCourant prenant une de ces valeurs
enum {HOME, ECRAN1, ECRAN2} etatCourant;
// verification que nous sommes bien configure en 128X64
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void mettreAuRepos()
{
display.clearDisplay();
etatCourant = HOME;
}
// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void simpleclick()
{
switch (etatCourant) {
case HOME: // on était au HOME et on a un appui, on allume la verte
{
// Mesure la tension en VIN et la référence interne à 1.1 volts
unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN);
unsigned int raw_ref = analogReadReference();
// Calcul de la tension réel avec un produit en croix
float real_vin = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN;
// float real_vin = 42 ;
// Lecture du capteur
// Ajout de l'échantillon à l'objet "Moyenne Glissante"
MoyGliss.addValue(real_vin);
// Récupération de la moyenne glissante
moyenne = MoyGliss.getAverage();
// Incrémentation du compteur
compteur++;
// Effacement de l'historique pour éviter les débordements
if (compteur == 300)
{
compteur = 0;
MoyGliss.clear();
}
/* Calcul pourcentage batterie */
float pourcentage = 100 * ((moyenne - 33) / (42-33));
// float pourcentage = 100 ;
//Affichage
display.setTextSize(1);
display.setTextColor(WHITE);
// Tableau
display.setCursor(0,28);
display.println("---------");
display.setCursor(68,28);
display.println("----------");
display.setCursor(58,0);
display.println("|");
display.setCursor(58,16);
display.println("|");
display.setCursor(58,32);
display.println("|");
display.setCursor(58,48);
display.println("|");
// Tension de la batterie
display.setCursor(0,16);
display.println(moyenne);
display.setCursor(35,16);
display.println("V");
// Pourcentage batterie restante
display.setCursor(80,16);
display.println(pourcentage);
display.setCursor(120,16);
display.println("%");
// Température
display.setCursor(0,40);
display.println("30.00");
display.setCursor(35,40);
display.println((char)247);
display.setCursor(40,40);
display.println("C");
display.display();
//delay(750);
display.clearDisplay();
}
etatCourant = ECRAN1; // on note le nouvel état de notre système
break;
case ECRAN1: // on était led verte allumée et on a un appui, on allume la jaune
{
// Mesure la tension en VIN et la référence interne à 1.1 volts
unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN);
unsigned int raw_ref = analogReadReference();
// Calcul de la tension réel avec un produit en croix
float real_vin = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN;
// float real_vin = 42 ;
// Lecture du capteur
// Ajout de l'échantillon à l'objet "Moyenne Glissante"
MoyGliss.addValue(real_vin);
// Récupération de la moyenne glissante
moyenne = MoyGliss.getAverage();
// Incrémentation du compteur
compteur++;
// Effacement de l'historique pour éviter les débordements
if (compteur == 300)
{
compteur = 0;
MoyGliss.clear();
}
// Calcul pourcentage batterie
float pourcentage = 100 * ((moyenne - 33) / (42-33));
// float pourcentage = 100 ;
//Affichage
display.setTextSize(1);
display.setTextColor(WHITE);
// Tableau
display.setCursor(0,28);
display.println("---------");
display.setCursor(68,28);
display.println("----------");
display.setCursor(58,0);
display.println("|");
display.setCursor(58,16);
display.println("|");
display.setCursor(58,32);
display.println("|");
display.setCursor(58,48);
display.println("|");
// Titre
display.setCursor(0,0);
display.println("Tension");
display.setCursor(80,0);
display.println("Batterie");
// Tension de la batterie
display.setCursor(0,16);
display.println(moyenne);
display.setCursor(35,16);
display.println("V");
// Pourcentage batterie restante
display.setCursor(80,16);
display.println(pourcentage);
display.setCursor(120,16);
display.println("%");
// Température
display.setCursor(0,40);
display.println("30.00");
display.setCursor(35,40);
display.println((char)247);
display.setCursor(40,40);
display.println("C");
display.display();
//delay(750);
display.clearDisplay();
}
etatCourant = ECRAN2;// on note le nouvel état de notre système
break;
case ECRAN2: // tout était allumé, on a un appui, on retourne au HOME
mettreAuRepos(); // on retourne à l'état initial
break;
}
}
// Fonction setup()
void setup(void) {
// initialisation de la vitesse de la liaison serie
Serial.begin(9600);
// par defaut nous allons generer une tension de 3.3v
// initialisation de la liaison ID2C avec l'adresse 0x3D
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// fin de l'initialisation
display.display();
delay(6000);
display.clearDisplay();
// Initialisation de l'objet "Moyenne Glissante"
MoyGliss.clear();
//conditions Initiales
mettreAuRepos();
// On attache la fonction simpleClick() comme callBack
button.attachClick(simpleclick);
}
// Mesure la référence interne à 1.1 volts
unsigned int analogReadReference(void) {
// Elimine toutes charges résiduelles
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#endif
delayMicroseconds(5);
// Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#endif
delayMicroseconds(200);
// Active le convertisseur analogique -> numérique
ADCSRA |= (1 << ADEN);
// Lance une conversion analogique -> numérique
ADCSRA |= (1 << ADSC);
// Attend la fin de la conversion
while(ADCSRA & (1 << ADSC));
// Récupère le résultat de la conversion
return ADCL | (ADCH << 8);
}
// Fonction loop()
void loop(void) {
// On vérifie l'état des boutons, ce qui déclenche l'appel de la fonction callBack si nécessaire
button.tick();
}
PS : soyez indulgent, car mon code doit être sacrément mal conçu pour des connaisseurs !