/*
* Fil d'Ariane , dans le désordre :)
* - https://forum.arduino.cc/t/graphique-puissance-photovoltaique-disponible/892597
* - https://www.apper-solaire.org/Pages/Electronique/Electro/Fabriquer%20un%20Power%20router/index.pdf
* - https://apresdemain28.wixsite.com/website/conna%C3%AEtre-notre-surplus-de-puissance
* - https://github.com/openenergymonitor/EmonLib
* - https://electroniqueamateur.blogspot.com/2019/01/ecran-oled-sh1106-i2c-et-arduino.html
* - ...... merci jp28
*
* Utilisation :
* Affichage courbe Graphique(Plot) d'une valeur numérique
*/
// ------------------------------------------------------------------------------
//---- code de Base ---- Lib Adafruit et Oled SH1106 i2c sur Arduino Uno -------
//--------- une simplification du code d'origine pour un changement de Lib?? ---
//--------------------------- en TEST ----------------------------------------------
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
Adafruit_SH1106 display(23); // 23 = nombre quelconque supérieur aux E/S arduino
const int intervalle = 200; // nombre de millisecondes entre 2 mesures consécutives
unsigned long time_now = 0;
int mesures[64]; // les 64 dernieres mesures
int compteur = 0; // nombre de mesures prises jusqu'à présent
int nouvelleValeur;
//------------------ SETUP --------------------
void setup() {
display.begin();
display.clearDisplay();
}
//-------------------- LOOP -----------------------
void loop() {
if (millis() >= time_now + intervalle) {
time_now += intervalle; // rafraichissement des valeurs - vitesse de défilement
nouvelleValeur = random(10,60); //test avec valeur aléatoire
//---------- tracé de la courbe -----------------------------
if ((compteur > 0) && (compteur <= 63)) //-------- 1er cycle du pgm
{
mesures[compteur] = nouvelleValeur;
// on trace une droite reliant la mesure précédente à notre nouvelle mesure
display.drawLine( 2*(compteur - 1), mesures[compteur - 1], 2*compteur, mesures[compteur], WHITE);
compteur = compteur + 1;
display.fillRect( 50, 0, 65, 15, BLACK); // rectangle plein noir (=effacer valeur précédente)
displayText (); // apl fonction affiche texte/valeur
}
else if (compteur == 0) //----- si première mesure! on la met en variable,
{
mesures[0] = nouvelleValeur;
compteur = compteur + 1;
}
if (compteur > 63) //----- si l'écran est déjà rempli,glissement du graph vers la gauche
{
for (int i = 0; i < 63; i++) // tracé de la courbe
{
mesures[i] = mesures[i + 1];
}
mesures[63] = nouvelleValeur;
display.clearDisplay(); // un nouveau cycle
for (int i = 1; i <= 63; i++) // tracé de la courbe
{
display.drawLine( 2*(i - 1), mesures[i - 1], 2*i, mesures[i], WHITE);
}
displayText (); // apl fonction affiche texte/valeur
}
display.display(); // affichage de notre travail à l'écran
}
}
//------------------ affiche texte/valeur ---------------------
void displayText () {
display.setTextColor(WHITE);
display.setTextSize(2); // taille du texte
display.setCursor(30, 0); // coordonnées du point (horiz/ligne)
display.print(nouvelleValeur, 6); //affichage de la valeur
display.setCursor(75, 0); // coordonnées du point
display.print("W");
}
//---------------------------- fin Pgm -------------------
des options que l'on modifie dans la définition du type d'afficheur
"U8G2_SH1106_128X64_NONAME_2_HW_I2C" ...... 1 , 2 ou F
cella me donne d'autres valeurs de mémoire dispo
avec la gestion de "Page" je passe à util 39% / dynamique 44%
gestion "Ram" util 38% / dynamique 82%
et bien sur le croquis demande une modification.
Graph_Plot_U8g2_page.ino
/*
* Fil d'Ariane , dans le désordre :)
* - https://forum.arduino.cc/t/graphique-puissance-photovoltaique-disponible/892597
* - https://www.apper-solaire.org/Pages/Electronique/Electro/Fabriquer%20un%20Power%20router/index.pdf
* - https://apresdemain28.wixsite.com/website/conna%C3%AEtre-notre-surplus-de-puissance
* - https://github.com/openenergymonitor/EmonLib
* - https://electroniqueamateur.blogspot.com/2019/01/ecran-oled-sh1106-i2c-et-arduino.html
* - ...... merci jp28
*
* Utilisation :
* Affichage courbe Graphique(Plot) d'une valeur numérique
*
* Info sur valeur de l'afficheur:
* 1 ou 2 - Utilisez une boucle firstPage()/nextPage() pour dessiner sur l'écran.
* F - Keep a copy of the full display frame buffer in the microcontroller RAM.
*
*/
// ------------------------------------------------------------------------------
//---- code de Base ---- Lib U8g2 et Oled SH1106 i2c sur Arduino Uno -------
//--------- une simplification du code d'origine pour un changement de Lib?? ---
//--------------------------- en TEST vesion "Page" ----------------------------------------------
// ----- doc https://github.com/olikraus/u8g2/wiki/u8g2reference#carduino-example
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h> //i2c
U8G2_SH1106_128X64_NONAME_2_HW_I2C u8g2(U8G2_R0); //Oled i2c SH1106 sur A4=sda / A5=scl
const int intervalle = 300; // nombre de millisecondes entre 2 mesures consécutives
unsigned long time_now = 0;
int mesures[64]; // les 64 dernieres mesures
int compteur = 0; // nombre de mesures prises jusqu'à présent
int nouvelleValeur;
//------------------ SETUP --------------------
void setup() {
u8g2.begin();
// u8g2.clear();
u8g2.setFont(u8g2_font_ncenB14_tr); // font general
}
//-------------------- LOOP -----------------------
void loop() {
if (millis() >= time_now + intervalle) {
time_now += intervalle; // rafraichissement des valeurs - vitesse de défilement
nouvelleValeur = random(10,60); //test avec valeur aléatoire
//---------- tracé de la courbe -----------------------------
u8g2.firstPage();
do {
if ((compteur > 0) && (compteur <= 63)) //-------- 1er cycle du pgm
{
mesures[compteur] = nouvelleValeur;
u8g2.drawLine( 2*(compteur - 1), mesures[compteur - 1], 2*compteur, mesures[compteur]);
compteur = compteur + 1;
u8g2.drawStr(0, 20, String(nouvelleValeur).c_str()); // affiche texte/valeur
u8g2.drawStr(20, 20, " w");
}
else if (compteur == 0) //----- si première mesure! on la met en variable,
{
mesures[0] = nouvelleValeur;
compteur = compteur + 1;
}
if (compteur > 63) //----- si l'écran est déjà rempli,glissement du graph vers la gauche
{
for (int i = 0; i < 63; i++) // tracé de la courbe
{
mesures[i] = mesures[i + 1];
}
mesures[63] = nouvelleValeur;
//---------- un nouveau cycle
for (int i = 1; i <= 63; i++) // tracé de la courbe
{
u8g2.drawLine( 2*(i - 1), mesures[i - 1], 2*i, mesures[i]);
}
u8g2.drawStr(0, 20, String(nouvelleValeur).c_str()); // affiche texte/valeur
u8g2.drawStr(20, 20, " w");
}
} while ( u8g2.nextPage()) ;
}
}
//---------------------------- fin Pgm -------------------
avec comme résultat un truc pas Top pour la gestion par page (moins fluide/fine )