Erreur de compilation RTCLib sur Nano Every

Bonjour à tous,

Je travaille depuis quelques mois sur un projet avec une carte Nano, et j'ai voulu tester la version améliorée Nano Every.

Cependant impossible de compiler mon projet : le compilateur semble ne pas digérer l'utilisation de la librairie RTCLib. J'ai utilisé les réglages suivants :

  • Type de carte : Arduino Nano Every
  • Registers emulation : None

Voici les messages d'erreur à la compilation :

In file included from /Users/thomas/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino5/avr/include/avr/io.h:677:0,
                 from /Users/thomas/Library/Arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino5/avr/include/avr/pgmspace.h:90,
                 from /Users/thomas/Library/Arduino15/packages/arduino/hardware/megaavr/1.8.7/cores/arduino/api/String.h:31,
                 from /Users/thomas/Library/Arduino15/packages/arduino/hardware/megaavr/1.8.7/cores/arduino/api/IPAddress.h:24,
                 from /Users/thomas/Library/Arduino15/packages/arduino/hardware/megaavr/1.8.7/cores/arduino/api/ArduinoAPI.h:30,
                 from /Users/thomas/Library/Arduino15/packages/arduino/hardware/megaavr/1.8.7/cores/arduino/Arduino.h:23,
                 from sketch/Code_horloge_Thomas_0.5.ino.cpp:1:
Code_horloge_Thomas_0.5:49:12: error: expected ')' before '*' token
 RTC_DS3231 RTC;

Quand je bascule sur mon ancien réglage (Arduino Nano/ATmega328P), la compilation se déroule sans problème.

Est-ce que j'ai raté quelque chose ?

Je suis un programmeur très occasionnel, et pas particulièrement informaticien... Toute aide sera la bienvenue ! :slight_smile:

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Oups, désolé, je viens de m'inscrire... Merci pour le lien !

Bonjou toma33

Il faudrait mettre tout ton programme en ligne.

A+
Cordialement
jpbbricole

1 Like

Le microcontrôleur de la nano every n'est pas un avr "classique" mais de nouvelle génération.
Les bibliothèques doivent être adaptées à ce micro.
Les bibliothèques gérées par Aduino le sont "en principe", celles des tierces parties c'est au bon vouloir de leurs auteurs.

Quand tu ouvres les fichiers h et cpp de la bibliothèque trouves tu des référence à la nano every ou au micro atmega 4809 ?

Mon code est très long, voici déjà la section des déclarations ; c'est l'appel à la librairie RTCLib qui pose un problème...

Pour le contexte : je code une horloge à leds, d'où l'utilisation d'un module RTC, DCF77 et des librairies RTCLib et FastLed. Si nécessaire je peux mettre tout le code à disposition !

#include <Wire.h>     // Pour communication via le port série (débug)

// Potentiomètre
#define POT_PIN 2

// Boutons
#define BUT_CLK_SET_PIN 7     // Bouton de mise à l'heure de l'horloge
#define BUT_DCF77_PIN 9       // Bouton de recherche du signal DCF
unsigned long tempoDepart;    // note le top départ de l'appui sur le poussoir, via la fonction milli().
                              

// Module RTC 3231
#include <RTClib.h>
RTC_DS3231 RTC;

// Module DCF77
#include "decodeurDCF1.h"
const byte PIN_DCF1 = 2;                      // Broche de lecture du DCF77
long timer_DCF;                               // Tempo pour la recherche automatique du signal DCF77
long ref_millis;                              // Temps de référence pour la recherche automatique
const int DELAI_ACTUALISATION_ECRAN = 5000;   // Délai pour réactualisation de l'affichage pendant la recherche de signal (en millisecondes)
byte qualite_reception ;                      // Qualité du signal décodé, de 0 à 11

// Ruban Neopixel
#include <FastLED.h>
#define LED_COUNT 152       // Nombre de LEDs du tableau
#define LED_DATA_PIN 6      // Broche de commande des LEDs
#define MAX_BRIGHTNESS 255  // Luminosité max = 255
#define MIN_BRIGHTNESS 0    // Luminosité min = 0
CRGB leds[LED_COUNT];       // Tableau FastLED de gestion des LEDs

Merci pour ces infos ! Je suis allé voir dans les sources de la bibliothèque, mais je t'avoue que je n'y ai pas compris grand chose... :pensive:
Les références dont tu parles se présentent sous quelle forme ?

Pour info, j'utilise la bibliothèque RTCLib dans sa dernière version (2.0.1). Je suis allé voir la documentation en ligne (GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC library) et je n'ai pas trouvé de mention de la Nano Every, ni de l'ATmega 4809...

-> ça laisserait penser que cette bibliothèque n'a pas été adaptée pour la Nano Every. Je vais continuer de creuser pour en être sur !

Bonjour,

La première chose à faire est d'essayer un exemple de la librairie RTCLib et de voir s'il fonctionne correctement avec la Nano Every.

Bonjour

Une recherche sur le forum peut aussi renseigner :
exemple de résultat : https://forum.arduino.cc/t/rtclib-compiler-warnings-for-nano-every/879836

Le message indique un problème de syntaxe en ligne 49.
C'est peut-être juste une touche frappée par inadvertance.
Ou alors c'est un define qui est différent entre les plateformes.
En tout cas il faudrait avoir le code complet ce serait certainement plus simple

postez déjà Code_horloge_Thomas_0.5.ino mais le mieux serait tout le code (un zip si ça ne rentre pas)

Bonjour, je viens de tester avec un programme exemple, et la compilation fonctionne.
Je voudrais joindre mon code, mais je suis bloqué en temps que nouvel utilisateur :confused:

Voici déjà toute la première partie, les déclarations et les deux fonctions setup et loop, si cela peut aider :


/* Déclarations ******************************************************/
#include <Wire.h>     // Pour communication via le port série (débug)

// Potentiomètre
#define POT_PIN 2

// Boutons
#define BUT_CLK_SET_PIN 7     // Bouton de mise à l'heure de l'horloge
#define BUT_DCF77_PIN 9       // Bouton de recherche du signal DCF
unsigned long tempoDepart;    // note le top départ de l'appui sur le poussoir, via la fonction milli().
                              // format unsigned long imposé selon la doc.

// Module RTC 3231
#include <RTClib.h>
RTC_DS3231 RTC;

// Module DCF77
#include "decodeurDCF1.h"
const byte PIN_DCF1 = 2;                      // Broche de lecture du DCF77
//int signal = 0;                               // Signal de sortie du DCF77
//int qualite = 0;                              // niveau de qualité 
long timer_DCF;                               // Tempo pour la recherche automatique du signal DCF77
long ref_millis;                              // Temps de référence pour la recherche automatique
const int DELAI_ACTUALISATION_ECRAN = 5000;   // Délai pour réactualisation de l'affichage pendant la recherche de signal (en millisecondes)
byte qualite_reception ;                      // Qualité du signal décodé, de 0 à 11

// Ruban Neopixel
#include <FastLED.h>
#define LED_COUNT 152       // Nombre de LEDs du tableau
#define LED_DATA_PIN 6      // Broche de commande des LEDs
#define MAX_BRIGHTNESS 255  // Luminosité max = 255
#define MIN_BRIGHTNESS 0    // Luminosité min = 0
CRGB leds[LED_COUNT];       // Tableau FastLED de gestion des LEDs

// Paramètres esthétiques
#define SinMIN -1000        // Borne inférieure des fluctuations lumineuses
#define SinMAX 1000         // Borne supérieure 
#define BPM 2               // Fréquence des pulsations lumineuses (par minute)
#define fondu 15            // Durée du fondu enchaîné (secondes)

// Définition du cadran
// Tableau stockant les numéros des LEDs constituant chaque mot (les LEDs non utilisées sont mises forfaitairement à 200)
// En dernière colonne, on ajoute l'index utilisé pour les gradients de couleur du mode "arc en ciel", permettant de regrouper les mots devant s'afficher d'une même couleur
const byte cadran[29][11] = {
  {61,   71,  85,  86, 109, 115, 118, 132, 141, 151,  0},   // Zones noires
  {72,   73,  74,  75,  76,  77, 200, 200, 200, 200,  2},   // Minuit
  {49,   48,  47, 200, 200, 200, 200, 200, 200, 200,  4},   // 1 H
  {36,   37,  38,  39, 200, 200, 200, 200, 200, 200, 44},   // 2 H
  {19,   18,  17,  16,  15, 200, 200, 200, 200, 200,  8},   // 3 H
  {25,   24,  23,  22,  21,  20, 200, 200, 200, 200, 34},   // 4 H
  {57,   58,  59,  60, 200, 200, 200, 200, 200, 200,  12},   // 5 H
  {29,   30,  31, 200, 200, 200, 200, 200, 200, 200,  14},   // 6 H
  {8,     9,  10,  11, 200, 200, 200, 200, 200, 200,  16},   // 7 H
  {32,   33,  34,  35, 200, 200, 200, 200, 200, 200,  18},   // 8 H
  {53,   52,  51,  50, 200, 200, 200, 200, 200, 200, 18},   // 9 H
  {1,     2,   3, 200, 200, 200, 200, 200, 200, 200, 22},   // 10 H
  {46,   45,  44,  43, 200, 200, 200, 200, 200, 200, 24},   // 11 H
  {4,     5,   6,   7, 200, 200, 200, 200, 200, 200, 26},   // Midi
  {62,   63,  64,  65,  66, 200, 200, 200, 200, 200, 28},   // Heure
  {67,  200, 200, 200, 200, 200, 200, 200, 200, 200, 28},   // s
  {128, 127, 200, 200, 200, 200, 200, 200, 200, 200, 30},   // du
  {142, 143, 144, 145, 146, 200, 200, 200, 200, 200, 32},   // matin
  {147, 148, 149, 150, 200, 200, 200, 200, 200, 200,  10},   // soir
  {102, 101, 100,  99, 200, 200, 200, 200, 200, 200, 36},   // 5
  {131, 130, 129, 200, 200, 200, 200, 200, 200, 200, 37},   // 10
  {113, 114, 200, 200, 200, 200, 200, 200, 200, 200, 39},   // et
  {119, 120, 121, 122, 123, 200, 200, 200, 200, 200, 43},   // quart
  {108, 107, 106, 105, 104, 200, 200, 200, 200, 200,  6},   // 20
  {103, 200, 200, 200, 200, 200, 200, 200, 200, 200, 36},   // -
  {137, 136, 135, 134, 200, 200, 200, 200, 200, 200, 20},   // demi
  {133, 200, 200, 200, 200, 200, 200, 200, 200, 200, 20},   // e
  {87,   88,  89,  90,  91, 200, 200, 200, 200, 200, 50},   // moins
  {116, 117, 200, 200, 200, 200, 200, 200, 200, 200, 52}    // le
};

/* Fonctions Arduino *************************************************/
void setup() {
  
  delay(3000);          // Temporisation initiale pour mise en place
  Serial.begin(9600);   // Pour débuggage

  // Déclaration des entrées/sorties
  pinMode(POT_PIN, INPUT);
  pinMode(LED_DATA_PIN, OUTPUT);
  pinMode(BUT_CLK_SET_PIN, INPUT_PULLUP); // Le poussoir relaché est lu comme un état haut, et un appui donne lieu à lecture d'un état bas.
  pinMode(BUT_DCF77_PIN, INPUT_PULLUP);   // Le poussoir relaché est lu comme un état haut, et un appui donne lieu à lecture d'un état bas.
  pinMode(13, OUTPUT);                    // Recopie des impulsions DCF77 sur led interne de l'arduino
  pinMode(PIN_DCF1, INPUT);

   // Initialisation du module RTC
  RTC.begin(); 
  //RTC.adjust(DateTime(2021,05,20,3,2,0));
  //RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // On ajuste l'heure du module RTC à celle de compilation
  
  // Initialisation du Neopixel
  FastLED.addLeds<NEOPIXEL, LED_DATA_PIN>(leds, LED_COUNT).setCorrection(TypicalLEDStrip);
  FastLED.setMaxPowerInVoltsAndMilliamps(5, 1500);

  // Mise en place du ruban Neopixel
  FastLED.clear();
  allumeTout();
  FastLED.show();
  delay(1000);  
}

void loop() {

  //Serial.println("début Loop");

  // Traitement du bouton de mise à l'heure
  if (digitalRead(BUT_CLK_SET_PIN) == LOW) {

    Serial.println("Bouton Reset Midi");

    // On appuie sur le bouton de mise à l'heure : 
    //   - extinction de l'ensemble du cadran
    //   - allumage du M de "midi" en blanc
    allumeMIDI(1);
    tempoDepart = millis(); // on note le temps Arduino
    while ((millis() - tempoDepart) < 1000) {
      if (digitalRead(BUT_CLK_SET_PIN) == HIGH) { // poussoir relâché trop tot
        //Serial.println("appui trop court, arrêt procédure mise à heure midi");
        goto abort_procedure;      
      }
    }

    allumeMIDI(2);
    tempoDepart = millis(); // on note le temps Arduino
    while ((millis() - tempoDepart) < 1000) {
      if (digitalRead(BUT_CLK_SET_PIN) == HIGH) { // poussoir relâché trop tot
        //Serial.println("appui trop court, arrêt procédure mise à heure midi");
        goto abort_procedure;      
      }
    }

    allumeMIDI(3);
    tempoDepart = millis(); // on note le temps Arduino
    while ((millis() - tempoDepart) < 1000) {
      if (digitalRead(BUT_CLK_SET_PIN) == HIGH) { // poussoir relâché trop tot
        //Serial.println("appui trop court, arrêt procédure mise à heure midi");
        goto abort_procedure;      
      }
    }

    allumeMIDI(4);
    tempoDepart = millis(); // on note le temps Arduino
    while ((millis() - tempoDepart) < 1000) {
      if (digitalRead(BUT_CLK_SET_PIN) == HIGH) { // poussoir relâché trop tot
        //Serial.println("appui trop court, arrêt procédure mise à heure midi");
        goto abort_procedure;      
      }
    }

    clignoteMIDI();

    while (digitalRead(BUT_CLK_SET_PIN) == LOW){
      // boucle pour patienter en attendant que le bouton soit relâché
      Serial.println("appui validé, attente relâchement poussoir");
      delay(200);
    } 
  
    // On met le RTC à midi, et on valide par un clignotement
    DateTime ilEst = RTC.now(); 
    RTC.adjust(DateTime(ilEst.year(),ilEst.month(),ilEst.day(),12,0,0));

    clignoteMIDI(); 

    abort_procedure:
    delay(100);
  }

  // Traitement du bouton de recherche DCF77
  if (digitalRead(BUT_DCF77_PIN) == LOW) {
    rechercheHeureDCF77();
    timer_DCF = millis(); // pour éviter pb overflow 50j après démarrage de l'Arduino...
  }

  // Lecture du potentiomètre et ajustement de la luminosité en conséquence
  verifLuminosite();    

  // Récupération de l'heure du RTC
  DateTime heureCourante = RTC.now();   

  // S'il est 3h du matin, on lance la recherche automatique du signal DCF77
  //if (heureCourante.hour() == 3 && heureCourante.minute() == 0 && heureCourante.second() == 0) {
    //rechercheHeureDCF77();
    //timer_DCF = millis(); // pour éviter pb overflow 50j après démarrage de l'Arduino...
  //} 

  // Calcul de l'heure arrondie
  DateTime heureArrondie = arrondiHeure(heureCourante);
 
  // Calcul de l'heure arrondie suivante, et du coefficient de fondu entre les deux
  DateTime heureArrondieAVenir = prochaineHeureArrondie(heureArrondie);
  float coeffFondu = calculFondu(heureCourante, heureArrondie);

  // Calcul du masque d'affichage de l'heure
  byte masque[LED_COUNT];
  calculMasque(masque, heureArrondie, heureArrondieAVenir, coeffFondu);
 
  // Rendu du ruban LED
  FastLED.clear();
  allumeTout();         // On allume l'ensemble du cadran
  //fluctuations();       // On ajoute les composantes variables
  ajoutMasque(masque);  // On ajoute le masque pour ne laisser allumée que l'heure à afficher 
  delay(10);            // Temporisation de traitement
  FastLED.show();       // Affichage 
}

Bonjour, et merci pour le lien. Je l'avais trouvé avant de poster, mais je n'ai pas compris grand chose des explications...

Je crois avoir trouvé la source du problème ! Après plusieurs tentatives, j'ai (au petit bonheur la chance) changé le nom donné à mon RTC.

Code d'origine

#include <RTClib.h>
RTC_DS3231 RTC;

Code corrigé

#include <RTClib.h>
RTC_DS3231 ModuleRTC;

Résultat : le programme compile ! Pas très proprement, car j'ai plusieurs avertissements similaires à ceux relevés dans le sujet pointé par @al1fch, mais en tout cas, cela compile... :slight_smile:

Merci à tous pour vos idées ou suggestions !