IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Fonction équivalente printf Arduino


Sujet :

Arduino

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 57
    Points : 25
    Points
    25
    Par défaut Fonction équivalente printf Arduino
    Bonjour,

    Je cherche à afficher un int avec 2 chiffres avant la virgule sur un écran OLED sur Arduino. Pour l'écran, j'utilise la bibliothèque u8glib ( https://github.com/olikraus/u8glib/w...eference#print ) et l'écran est interfacé en I2C.
    Le but est d'afficher simplement l'heure sur l'écran OLED.
    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     #include <stdio.h>
     #include "U8glib.h"
     U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // Fast I2C / TWI
     
    int heures;
    int minutes;
    int secondes;
    long int millisecondes;
     
    void gestion_heure( int *heures, int *minutes, int *secondes,  long int *millisecondes)
    {
      *millisecondes=millis();
      *secondes = *millisecondes / 1000;
      if (*secondes>59){
        *secondes=0;
        *minutes++=1;
      }
      if (*minutes>59){
        *minutes=0;
        *heures++=1;
      }
      if (*heures>24){
        *heures=0;
      }
     
      Serial.print(*heures);
      Serial.print(" : ");
      Serial.print(*minutes);
      Serial.print(" : ");
      Serial.print(*secondes);
      Serial.print(" : ");
      Serial.println(*millisecondes);
    }
     
    void draw(void) {
      // graphic commands to redraw the complete screen should be placed here  
      //u8g.setFont(u8g_font_unifont);
      //u8g.setFont(u8g_font_fur35n); //choix de la police cf github
      //u8g_DrawStr(u8g, 40, 50, "A");
      //u8g.drawStr( 1, 36, "E"); //numéro de ligne du pixel supérieur, numero de ligne du pixel inférieur, variable
     
     
      u8g.setFont(u8g_font_unifont);
      //u8g.setFont(u8g_font_fur35n);
      u8g.setPrintPos(0, 36); 
      // call procedure from base class, http://arduino.cc/en/Serial/Print
      u8g.print(heures);
      u8g.print(":");
      u8g.print(secondes);
    }
     
    void setup(void) {
    Serial.begin(9600);
     
      // flip screen, if required
      // u8g.setRot180();
     
      // set SPI backup if required
      //u8g.setHardwareBackup(u8g_backup_avr_spi);
     
      // assign default color value
      if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
        u8g.setColorIndex(255);     // white
      }
      else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
        u8g.setColorIndex(3);         // max intensity
      }
      else if ( u8g.getMode() == U8G_MODE_BW ) {
        u8g.setColorIndex(1);         // Ecriture en blanc sur fond noir (1) ou noir sur fond blanc (0)
      }
      else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
        u8g.setHiColorByRGB(255,255,255);
      }
     
      pinMode(8, OUTPUT);
    }
     
    void loop(void) {
      // picture loop
      u8g.firstPage();  
      do {
        draw();
        gestion_heure( &heures, &minutes, &secondes, &millisecondes);
     
      } while( u8g.nextPage() );
      // rebuild the picture after some delay
      delay(200);
    }
    Merci de vos réponses

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    bonjour,

    tu ne nous a pas indiqué le problème.
    Mais :
    -1- Pourquoi une syntaxe C ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void gestion_heure( int *heures, int *minutes, int *secondes,  long int *millisecondes)
    -2- Ta fonction de conversion de millisecondes en heures, minutes, secondes est bien étrange.

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 619
    Points : 56 854
    Points
    56 854
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Citation Envoyé par Métriix Voir le message
    Je cherche à afficher un int avec 2 chiffres avant la virgule sur un écran OLED sur Arduino.
    Un int avec 2 chiffres avant la virgule ?

    Si c'est un problème de formatage de texte comme afficher '09' au lieu de '9', soit tu fais des tests pour ajouter un '0' avant (par exemple, si <10, ajouter le caractère '0' devant), soit tu vas voir du côté du langage C avec la fonction sprintf (bibliothèque <stdio.h>).

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 57
    Points : 25
    Points
    25
    Par défaut
    Merci de vos réponses

    La syntaxe C parce qu'Arduino est basé sur C non?

    Après, comme je ne gère pas encore bien les timers, j'utilise la fonction millis() et j'ai du coup besoin d'une variable qui stocke le temps depuis que l'Arduino a démarré en millisecondes (c'est pourquoi j'ai le pointeur *millisecondes). Là j'ai aussi un problème, je devrai plutôt faire un modulo à la place du diviser par 1000 parce que ça marche les 59 premières secondes mais plus ensuite.
    Qu'est-ce que tu trouves de bizarre Auteur?

    Et l'affichage avec 2 chiffres avant la virgule est bien un problème de formatage, j'aimerais que l'heure soit bien affichée dans le port série et aussi sur l'écran i2c. Je préférerai la solution sprintf plus générique et offrant surement plus de fonctionnalité, je me penche dessus

    Qu'en pensez vous sinon?

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Citation Envoyé par Métriix Voir le message
    La syntaxe C parce qu'Arduino est basé sur C non?
    C++...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void fonction(int &valeur)
    {
        valeur ++;
    }
     
    int main(void)
    {
       int a;
       a = 2;
       fonction(a);
       return 0;
    }
    Citation Envoyé par Métriix Voir le message
    Qu'est-ce que tu trouves de bizarre Auteur?
    il y a combien de secondes dans 1 minute ? combien de minutes dans 1 heure ? Ta fonction peut marcher sur la première minute mais pas au-delà.

  6. #6
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Voilà comment je fais
    À noter que sprintf ne prend pas en charge les float

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char cDate[20]
     
    void MetDate() {
      DateTime now = rtc.now(); // date et heure du RTC
      sprintf (cDate, "%02d/%02d/%04d %02d:%02d:%02d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second());
     }

Discussions similaires

  1. Fonction équivalente à htmlentities sous MySQL
    Par navis84 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/05/2006, 13h41
  2. [Débutant] fonction équivalente de WHERE
    Par sarah67 dans le forum Access
    Réponses: 16
    Dernier message: 07/02/2006, 14h47
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h34
  4. recherche de fonctions équivalentes sous Visual C++ 6.0
    Par magicbisous-nours dans le forum MFC
    Réponses: 3
    Dernier message: 26/10/2005, 09h01
  5. fonction équivalente à la fonction MOD (oracle) dans ms-sql
    Par rodrigue50 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/07/2005, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo