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 :

Programmation de fonctions


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 935
    Par défaut
    Pas de souci - le poulet était au four

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 070
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 070
    Par défaut
    Re... Jay M

    je suis désolé mais je vais devoir renoncer à créer des sous-programmes
    je n'arrive pas à compiler suite à des problèmes récurrents de déclaration de variables comme par ex ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    In file included from C:\Users\Utilisateur\Documents\Arduino\test_char\ephemeride.cpp:3:
    C:\Users\Utilisateur\Documents\Arduino\test_char\affichage.h:16:31: error: 'String' has not been declared
       16 | void drawString(int x, int y, String text, alignmentType alignment);
    des erreurs qui n'apparaissaient pas dans le croquis initial mais maintenant du fait de la création des sous-programmes et ce que je ne m'explique pas
    j'ai pourtant cherché à respecter les déclarations mais là ....

    je remets en copie ce que j'ai modifié du croquis précédent en respectant les recommandations mais
    Fichiers attachés Fichiers attachés

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 935
    Par défaut
    Ne renoncez pas, vous allez y arriver

    Le compilateur vous dit qu'il ne connait pas le type String. C'est normal, ce n'est pas du C++ standard.

    ==> il faut faire comme pour les autres bibliothèques dont vous utilisez les fonctions, dans les .h de vos .cpp, pensez à ajouter

    qui doit apparaître AVANT que vous n'utilisiez un des éléments spécifiques au monde Arduino comme la classe String (ou Serial, etc).




    Dans votre cas précis, vous avez dans votre affichage.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void drawString(int x, int y, String text, alignmentType alignment);
    il faut donc qu'au moment où le compilateur lit cela il connaisse la classe String mais dans affichage.cpp vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "affichage.h"
    #include <Arduino.h>
    vous avez l'inclusion de Arduino.h après affichage.h et donc au moment de lire affichage.h, il ne sait pas ce qu'est une String.


    Sinon dans affichage.h vous avez aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Draw_Heading_Section(enTete);
    ==> il manque le type (j'avais proposé de passer le paramètre qui est de type String par référence (d'ou le &) car ça évite de dupliquer ce paramètre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Draw_Heading_Section(String& enTete);
    pour ce prototype de fonction il faut aussi que le compilateur sache ce qu'est une String

    ==> le plus simple, mettez #include <Arduino.h> dans votre .h

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 070
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 070
    Par défaut
    Bonjour Jay M

    j'espère que je ne vous ai pas obligé à manger votre poulet froid , encore désolé !

    Bon, çà fonctionne mieux maintenant grâce à vous
    pour éviter à l'avenir mes questions redondantes
    j'ai voulu faire un petit mémo des différentes configurations de sous-programmes et de leurs fonctions que vous m'avez décrites

    j'aurai voulu avoir votre avis ( et d'autres aussi ) pour savoir si j'ai bien tout compris ou si j'ai omis quelques exemples

    merci encore
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 935
    Par défaut
    Salut

    pas de souci pour le poulet

    concernant votre petit mémo

    le .ino n'a pas besoin d'inclure Arduino.h, l'IDE se charge de le rajouter pour vous

    vous avez deux fois fonction_2() - je ne sais pas si vous avez fait exprès. en soi ce n'est pas un souci car il y en a une qui est privée au module Toto et celle qui est exportée provient du module Tata

    Pourquoi importez vous Toto.h dans Tata.cpp ? c'est Tata.h qu'il faut importer

    vous avez une déclaration extern int variable_2 mais personne ne définit variable_2

    Sinon, si un .h contient des trucs spécifiques au monde arduino (byte, String, ...) alors il faut inclure Arduino.h dans le .h aussi par cohérence plutôt que de dépendre du fait que le développeur aura pensé à le mettre dans son cpp.

    ---

    voici un exemple wokwi avec le .ino et Toto et Tata

    le .ino appelle une fonction de Toto qui appelle une fonction de Tata

    https://wokwi.com/projects/445327592228040705

  6. #6
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 070
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 070
    Par défaut
    merci pour les corrections

    là, où je n'imprime pas c'est le terme "extern"
    par définition ( externe) , j'avais bêtement compris qu'il s'agissait que de variables que l'on importait dans le .cpp
    pas celles que l'on traitait dans ce même .cpp

    comme par ex :
    int toto = 0; => cette variable ne provient pas d'un autre programme puisqu'elle est créée au sein même de Toto.cpp puis ensuite "exportée" vers Tata.h
    où là j'aurai compris l'utilisation du terme "extern toto"

    alors que je vois qu'elle est déclarée "extern int toto" dans Toto.h et pas dans Tata.h ?

    Pourquoi importez vous Toto.h dans Tata.cpp ? c'est Tata.h qu'il faut importer
    erare humanum est ....

    ---------------------------------------------
    Même si le programme se compile désormais il me reste cependant un petit bémol lié au fait de la création de ces sous -programmes
    à savoir ce pourquoi j'ai fait ce croquis : la date du crépuscule qui ne se met plus à jour
    voici ce que je lis sur la console

    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
     
    load:0x40080400,len:3480
    entry 0x400805b4
    RTC = OK                          <==================
    Alarme réglée!                   
    Lever : 06:03:32    
    Meridien : 11:23:38
    Coucher : 16:43:02             <==================
    _PowerOn : 94999
    _Update_Full : 2131000
    _Update_Full : 2130000
    _PowerOff : 140000
    20/10/2025
    -----------
    13:37:50
    -----------
    _PowerOn : 95000
    _Update_Full : 2131000
    _PowerOff : 140000
    [ Alarme 1: 20 12:00:00, Mode: Date ]  <==============
    _PowerOn : 95000
    _Update_Full : 2131000
    _PowerOff : 140000
    dans la fonction : programmerAlarme(int annee, int mois, int jour, double heureJulienne)

    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
    //#########################################################################################
    void programmerAlarme(int annee, int mois, int jour, double heureJulienne) {
     
      // on calcule l'heure, minute et seconde comme dans le code de bricoleau
      // dans sa fonction afficherHeure() en modifiant éventuellement le jour
      int h, m, s;
      double d = heureJulienne + 0.5;
       
      if (d < 0.0) {
        jour -= 1;
        d += 1.0;
      } else if (d >= 1.0) {
        jour += 1;
        d -= 1.0;
      }
     
      h = d * 24.0;
      d -= (double) h / 24.0;
      m = d * 1440.0;
      d -= (double) m / 1440.0;
      s = d * 86400.0 + 0.5;
       
      DateTime alarme(annee, mois, jour, h, m, s); // puis on fabrique un DateTime avec ces infos          <================
      rtc.setAlarm1(alarme, DS3231_A1_Date); // qu'on utilise pour armer l'alarme1 du DS3231 en mode date+heure exacte
      //rtc.enableAlarm(DS3231_ALARM_1);
    }
    je mets normalement à jour rtc_setAlarm1

    puis dans la fonction : void checkDate()
    je viens mettre à jour la variable : alarm1Time mais çà ne semble pas fonctionner correctement puisque l'on peut voir que la date du "coucher" ne se remet pas à jour alors que celle-ci apparait plus haut

    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
     
        DateTime alarm1Time = rtc.getAlarm1();       <=============================
        Ds3231Alarm1Mode alarm1mode = rtc.getAlarm1Mode();
        char alarm1Date[12] = "DD hh:mm:ss";
        alarm1Time.toString(alarm1Date);
        Serial.print("[ Alarme 1: ");
        Serial.print(alarm1Date);
        Serial.print(", Mode: ");
        switch (alarm1mode) {
          case DS3231_A1_PerSecond:
            Serial.println("PerSecond ]");
            affichmode = "Par Seconde";
            break;
          case DS3231_A1_Second:
            Serial.println("Second ]");
            affichmode = "Seconde";
            break;
          case DS3231_A1_Minute:
            Serial.println("Minute ]");
            affichmode = "Minute";
            break;
          case DS3231_A1_Hour:
            Serial.println("Hour ]");
             affichmode = "Heure";
            break;
          case DS3231_A1_Date:
            Serial.println("Date ]");
             affichmode = "Date";
            break;
          case DS3231_A1_Day:
            Serial.println("Day ]");
             affichmode = "Jour";
            break;
        }
        affichalarme = "Crepuscule le: ";
        affichalarme += alarm1Date;
        affichalarme += " - En Mode: ";
        affichalarme += affichmode;
        affichalarme +=  " ";
    Fichiers attachés Fichiers attachés

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 595
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 595
    Par défaut
    le alarm1Time utilisé dans programmerAlarme n'est initié qu'au début de DS3231.cpp (c'est ici une variable globale)
    Dans ta fonction checkDate, tu créés une variable locale aklarm1Time, qui est donc différente de la variable locale, ce qui explique que ton alarme n'est pas mise à jour. Il suffirait de supprimer le "typage" de la variable dans checkDate, pour que ce soit ta variable globale qui soit utilisée.

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 935
    Par défaut
    Si ça vous aide, Voyez "extern" comme juste un mot clé pour dire au compilateur de ne pas allouer la mémoire et juste l'informer sur le type et le nom d'une variable qui existe quelque part (même dans le même fichier).

Discussions similaires

  1. Mettre a jour un programme en fonction de l'utilisateur
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/05/2007, 11h33
  2. Réponses: 1
    Dernier message: 28/03/2007, 16h33
  3. Réponses: 10
    Dernier message: 11/01/2007, 22h45
  4. Programmer une fonction joindre_fichier
    Par leCcsympas dans le forum Réseau
    Réponses: 5
    Dernier message: 03/12/2006, 20h51
  5. Réponses: 2
    Dernier message: 31/05/2005, 10h50

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