Skip to content

Instantly share code, notes, and snippets.

@ypelletier
Last active September 29, 2019 10:35
Show Gist options
  • Save ypelletier/68570f1548c9e281d34734487d884e0d to your computer and use it in GitHub Desktop.
Save ypelletier/68570f1548c9e281d34734487d884e0d to your computer and use it in GitHub Desktop.
Affichage d'une mesure analogique sous forme de graphique cartésien sur un écran OLED I2C SH1106 (Arduino)
/*****************************************************
Affichage d'une mesure analogique sous forme de graphique
cartésien sur un écran OLED I2C SH1106 (Arduino)
en utilisant une bibliothèque d'Adafruit:
https://github.com/adafruit/Adafruit-GFX-Library
...et une bibliothèque compatible par Wohho-maker:
https://github.com/wonho-maker/Adafruit_SH1106
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/01/ecran-oled-sh1106-i2c-et-arduino.html
*****************************************************/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
Adafruit_SH1106 display(23);
const int intervalle = 500; // nombre de millisecondes entre deux mesures consécutives
int mesures[32]; // les 32 dernieres mesures
int compteur = 0; // nombre de mesures prises jusqu'à présent
void setup() {
display.begin();
display.clearDisplay();
}
void loop() {
int nouvelleValeur;
// mesure de la tension à l'entrée A0 et conversion en pixels
nouvelleValeur = 60 - map(analogRead(A0), 0, 1023, 0, 60); // car l'écran a 64 pixels de haut
if (compteur > 31) {
// l'écran est déjà rempli: on fait glisser le graphique vers la gauche
for (int i = 0; i < 31; i++) {
mesures[i] = mesures[i + 1];
}
mesures[31] = nouvelleValeur;
display.clearDisplay(); // on repart à neuf
// tracé de la courbe
for (int i = 1; i <= 31; i++) {
display.drawLine(4 * (i - 1), mesures[i - 1], 4 * i, mesures[i], WHITE);
}
for (int i = 0; i <= 5; i++) {
display.drawFastHLine(0, i * 12, 128, WHITE);
}
}
if ((compteur > 0) && (compteur <= 31)) {
// pas assez de mesures pour remplir tout l'écran: on ajoute notre nouvelle valeur
// au graphique déjà visible à l'écran
mesures[compteur] = nouvelleValeur;
// on trace une droite reliant la mesure précédente à notre nouvelle mesure
display.drawLine(4 * (compteur - 1), mesures[compteur - 1], 4 * compteur, mesures[compteur], WHITE);
compteur = compteur + 1;
}
else if (compteur == 0) {
// c'est la première mesure: on la met en variable,
// mais on ne trace rien à l'écran, sauf le quadrillage
mesures[0] = nouvelleValeur;
compteur = compteur + 1;
// 6 lignes horizontales: 0 V, 1 V, 2 V...
for (int i = 0; i <= 5; i++) {
display.drawFastHLine(0, i * 12, 128, WHITE);
}
}
display.display(); // affichage de notre travail à l'écran
delay(intervalle); // on attend un peu avant la prochaine mesure
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment