Comment vérifier l'import de mes librairies

Bonjour à tous

Je fais face à un problème récurent.
Mon SAMD21 lit des fichiers sur une carte SD. Qaund mon OLED est activé, il n'arrive plus à lire la carte SD quand "il croise" un

delay(2000);

Si je désactive mon OLED, tout fonctionne. C'est vraiment un truc de fou et je n'arrive pas comprendre pourquoi mon OLED (I2C) arrive faire en sorte qu'un delay() pertube ma carte SD! Surout que mon programme fonctionne sur mon ancienne version du PCB et pas sur la nouvelle.

Probleme Hardare, Software?

Bref, le but de ce post est de vérifier une modification majeur de mon code afin d'éliminer une source potentiel d'erreur.

Dans mon fichier .ino, je faisais appelle à des librairires comme

  // It need WIRE lib. Check above
  #include "RTClib.h"
  RTC_DS3231 rtc;
  char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  bool datetime_active = true;

Simplement, je voulais que cette partie de code ne se déroulait plus dans mon fichier.ino, mais dans ma librairie foxuino.ccp

Donc j'ai supprimé le code ci-dessus et dans foxuino.ccp et foxuino.h, j'ai fais les modifications suivantes:

foxuino.ccp

#include "Arduino.h"
#include "Foxuino.h"
#include "RTClib.h" // J ai rajouté ceci

dans foxuino.h j'ai aussi ajouté ceci, mais est-ce indispensable???

#include "RTClib.h"

Ou est-ce qu'il suffit de le mettre que dans fox.h?

Dans foxuino.h, j'ai encore ajouté ceci dans la class public

		RTC_DS3231 rtc;
		bool RtcBegin();
		void RtcGetTime(int16_t &y, int16_t &m, int16_t &d, int16_t &h, int16_t &mn, int16_t &s, int32_t &unix_time, char * datetime);
		bool RtcInterval(int32_t lastTx, int32_t tx_interval);
		bool RtcLostPower();
		int RtcCalibrate();
		bool RtcCalibrate(int16_t &y, int16_t &m, int16_t &d, int16_t &h, int16_t &mn, int16_t &s);
		bool isDs3231;
		char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

Puis dans foxuino.ccp, j'ai ajouté ceci (je ne les mets pas toutes)

bool Foxuino::RtcBegin()
{
  if(rtc.begin())
  {
    
    _sd.chdir();
    
    if (!_sd.exists(_config_rtc_file))
    {
      Serial.print(_config_rtc_file);
      Serial.print(F(" does not exist"));
      _config_rtc.year = 0;
      _config_rtc.month = 0;
      _config_rtc.day = 0;
      _config_rtc.hour = 0;
      _config_rtc.minute = 0;
      _config_rtc.second = 0;

      if(_save_Config_rtc(_config_rtc_file, false) == 1)
      {
        sprint(_config_rtc_file,0);
        sprintln(F(" created."),0);
      }
      else
      {
        sprint(_config_rtc_file,0);
        sprintln(F(" failed to be created...."),0);
        return false; 
      }
    }
    
    return true;
  }
  else
  {
    return false;
  }

}

Ai-je bien fait, u peut on faire mieux?

J'ai encore un autre exemple légérement différent.

J'ai des éléments i2C. Donc dans mon Ino j'ai ceci

#include <Wire.h>
Wire.begin()

Mais dans ma librarie, j'ai aussi la programmation de mon EEPROM qui passe aussi par du I2C.

Donc dans mon fichier foxuino.h, j'ai ceci

#ifdef EEPROM
	#include "Wire.h"
	#define EEPROM_ADDR 0x50
  	//#define EPPROM_DATA_LEN 16  // Control what does it and why
#endif

Mais je n'ai pas d'include de Wire.h dans mon fichier foxuino.cpp. Et pour vous dire tout j'ai même ceci

bool Foxuino::begin()
{

  #ifdef EEPROM
    //Wire.begin();
  #endif


	
  pinMode(_carddetect, INPUT_PULLUP);
_isSdReady = _sd_begin();
  
}

Donc je me deamnde si les includes doivent se faire dans les deux fichiers (.h et .ccp)

Et si Wire est importé dans fichier.ion, doit-il aussi etre fait dans .h ou .ccp?

Le cas du Wire m'intereplle, car l'OLED fonctionne ave I2C et si cette partie est mal faite, peut etre que ca pourrait troubler le BUS IC, saud que mes autres périférique I2C fonctionne bien......

Au passage, si vous aviez une idée concernant mon problème ultra récurent:
Pourquoi je n'arrive pas à lire le contenu d'une carte SD (SPI) quand le code lis a delay() et seulement quand OLED est activé? Comment pourrais mesurer l'influence de OLED sur le port SPI de la carte Sdet du delay()? Par ou pourrais-commencer à debugger? (J'y ai passé tout mon week-end :slight_smile: )

Milles mercis pour vos lumières

Ou est-ce qu'il suffit de le mettre que dans fox.h?

Oui
Parce que:
foxuino.ccp contient

#include "Arduino.h" // va copier coller le contenu de Arduino.h s'il y a lieu
#include "Foxuino.h" // va copier coller le contenu de Foxuino.h s'il y a lieu
#include "RTClib.h" // J ai rajouté ceci : ça va copier coller le contenu de RTXlib.h ... s'il y a lieu

et foxuino.h contient
#include "RTClib.h" // va copier coller le contenu de RTClib...

On risque, s'il n'y a pas un garde fou, que le préprocesseur copie colle deux fois RTClib (ce qui serait une source de désordre).
En pratique, les fichiers *.h protègent contre la double (ou triple) inclusion par un jeu de defines et de test (le préprocessur regarde si une macro a été positionnée; si elle ne l'a pas été, elle est positionnée et les include sont effectivement une sorte de copie coller.
Et le RTClib d'ada fruit est protégé contre les doubles includes
https://github.com/adafruit/RTClib/blob/master/RTClib.h (lignes 4 et 135)