Il est Lib Plot

.... sur un air de libre Max :slight_smile:

Bonsoir
je continue mon aprentisage, la c'est decorticage de courbes graphique sur Oled
( pour la suite des mesures linky

@jp28 à donner le La la https://forum.arduino.cc/t/graphique-puissance-photovoltaique-disponible/892597

apres une simplification du croquis, pour ne garder le tracé et affichage d'une valeur numérique
Oled SH1106

La Librairie c'est du Adafruit_GFX , maintenant il me reste a convertir pour la Lib U8G2
https://www.seeedstudio.com/blog/2019/07/05/u8g2-for-seeeduino-boards/
.... j'aurais surement bessoin d'aide :slight_smile:

la version : Graph_Plot_Adafruit.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
  */

// ------------------------------------------------------------------------------
//---- 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 -------------------

..... je revient avec la version U8g2

Graph_Plot_U8g2.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
  
  */

// ------------------------------------------------------------------------------
//---- 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 ----------------------------------------------
// ----- doc https://github.com/olikraus/u8g2/wiki/u8g2reference#carduino-example

  #include <Arduino.h>
 
 #include <U8g2lib.h>  
 #include <Wire.h> //i2c

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);  //Oled i2c SH1106 sur A4=sda / A5=scl

  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() {
    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 -----------------------------
  
  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
       u8g2.drawLine( 2*(compteur - 1), mesures[compteur - 1], 2*compteur, mesures[compteur]);
      compteur = compteur + 1;
       
   //   u8g2.setDrawColor(1);   // couleur : 1 noir / 0 blanc
    // u8g2.drawBox ( 50, 0, 65, 15); // 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;

               
        u8g2.firstPage(); // 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]); 
      }
          displayText ();   // apl fonction affiche texte/valeur      
      }
         u8g2.sendBuffer();   // affichage la courbe
      }
   
    }

//------------------ affiche texte/valeur --------------------- 
  void displayText () {
 
    // u8g2.setDrawColor(0);
    //  u8g2.setCursor(0, 0);       // coordonnées du point
    //    u8g2.setTextSize(2);                 // taille du texte
    // u8g2.setFont(u8g2_font_ncenB14_tr);
    
    u8g2.drawStr(0, 20, String(nouvelleValeur).c_str());
    u8g2.drawStr(20, 20, " w");
        
}

//---------------------------- fin Pgm -------------------

...voili voila , plus ou moins fonctionnelle, une vidéo demain , la suis naze.

les liens qui mon aider:

le u8g2reference https://github.com/olikraus/u8g2/wiki/u8g2reference

je suis preneur pour des ajouts/modifs des idées?

Ah oui ,
avec la Lib U8g2
croquis utilise 12410 octets (38%)
1689 octets (82%) de mémoire dynamique
.... avec la Lib Adafruit c du 34% / 72%
:frowning:

..du retour d'info et vidéo.

la Librairie U8g2 donne la possibilité de la gestion du buffer
info sur Buffer Size

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 ) :slight_smile:

Video version Graph-Plot-U8g2-Ram

Video version Graph-Plot-U8g2-page

Tu te reponds tout seul? :grin:
Je comprends pas ton probleme,ton graphique marche bien non?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.