Bonjour à tous,
J'ai un problème de fou.
J'ai deux PCB. Le deuxièmre est l'évolution du premier.
En soit la partie des connections de la carte SD au microcontrolleur n'a pas changé. J'ai rgeardé, c'est le meme sur les deux schéma.
Quand j'upload le code avec le LCD active dans la premiere carte,
- L'OLED est initité et affiche des message
- La carte SD est initité et il vérifie les dossiers (lis) et écris les log
Quand j'upload le meme code sur ma deuxièmre carte
- l'OLEDest initié et affiche des message
- la carte SD est initié mais il n'arrive plus a lire un fichier qui existe
Ceci
Serial.println(F("DBUG"));
Serial.println(_config_rtc_file);
if (!_sd.exists(_config_rtc_file))
{
Serial.print(_config_rtc_file); Serial.println(F(" n'existe pas"));
}
m'affiche
/clock.txt n'existe pas
Quand je commente ceci
//#define OLED
(Tout mon code lié à l'OLED est entouré de #ifdef OLED #endif)
Ma carte SD est lue.
C'est dingue, car je n'arrive pas voir de différence entre les deux schémas et je n'arrive pas à comprendre pourquoi l'OLED qui communique via I2C a une influence alors que les autres élément I2C ne cause pas de problèmes.
Vous me direz ca doit etre un problème hardware (soit du deuxième PCB) et pas un problème de code, mais j'ai encore vérifier les schema et je ne vois pas binz.
Avez-vous déjà eu un problème similaire?
je vais vous donner du code, mais il va en avoir tellement, que vous ne souriez pas par ou commencer:
void setup() {
Serial.begin(9600);
if(!Si.begin()){ // Init SD
while(1){
Si.sprintln(F("Error: Si.begin()"),0);
delay(1000);
}
}
// C'est ici que j'iniatilse ma carte CD
}
Voici comment j'initialise ma carte SD
bool Foxuino::_sd_begin()
{
// #if defined(LOGGER)
Serial.println(F("Begin SD"));
bool isOk = false;
do
{
if (!_sd.begin(_chipselect))
{
Serial.println(F("No card SD"));
isOk = false;
delay(1000);
}
else
{
isOk = true;
}
}while(isOk == false);
_sd.chdir();
return isOk;
// #endif
}
Je continue par initié Wire.begin
(je continue mes commentaire dans le code)
void setup() {
Serial.begin(9600);
if(!Si.begin()){ // Init SD
while(1){
Si.sprintln(F("Error: Si.begin()"),0);
delay(1000);
}
}
// C'est ci-desus que j'iniatilse ma carte CD
Wire.begin();
// J ENABLE WATCHDOG ET OLED
#if defined(OLED)
#if defined (WATCHDOG)
wtime = Watchdog.enable();
Si.sprint(F("\r\nEnabling Watchdog for "),0);
Si.sprint(wtime,0);
Si.sprintln(F("ms"),0);
Watchdog.reset();
#endif
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.display()
#if defined (WATCHDOG)
Watchdog.disable();
#endif
delay(10000); // Give a delay to display the Splash
// Clear the buffer.
display.clearDisplay();
display.fillRect(0, 0, display.width(), 10, INVERSE);
display.display();
display.setTextColor(BLACK);
display.setCursor(1,1);
display.print("Setup");
display.display();
display.setTextColor(WHITE);
display.setCursor(0,16);
int o_y = 10;
o_y = oledCursorY(o_y);
display.setCursor(0,o_y);
display.print("[OK] OLED");
display.display();
#else
Si.sprintln(F("[NA] OLED"),0);
#endif
// EN AUCUN CAS J ECRIS OU LIS DANS MA CARTE JUSQU'A LA
#if defined(OLED)
o_y = oledCursorY(o_y); // Je déplace mon curseur en Y
display.setCursor(0,o_y);
display.print("[OK] Wire");
display.display();
#endif
// Je scan tous mes périférique I2C. L'OLED et LES AUTRES I2C SONT BIEN VUS
// IL N Y A PAS DE CONFLIT D'ADRESSAGE
I2Cscan.begin();
// J'INITIALISE LE PCF8674 ET DEFINI LES BROCHE EN SORTIE
expander.begin(0x27);
expander.pinMode(1,OUTPUT);
expander.pinMode(2,OUTPUT);
expander.pinMode(3,OUTPUT);
expander.pinMode(4,OUTPUT);
expander.pinMode(5,OUTPUT);
expander.pinMode(6,OUTPUT);
// JE METS TOUTES MES SORTIE DU PCF8574 EN L ETAT BAS SAUF POUR P1,P2;p3
for(int p=1; p<7;p++){
expander.digitalWrite(p,LOW);
delay(50);
Serial.print(F("\tP")); Serial.print(p); Serial.print(F(":"));
Serial.println(expander.digitalRead(p) ? "HIGH" : "LOW");
delay(50);
}
// JE METS ICI P1, P2 et P3 DANS l'ETAT HAUT
expander.digitalWrite(wm1_power_pin, HIGH);
Serial.print(F("\twm1_power_pin")); Serial.print(wm1_power_pin); Serial.print(F(":"));
Serial.println(expander.digitalRead(wm1_power_pin) ? "HIGH" : "LOW");
expander.digitalWrite(wm2_power_pin, HIGH);
Serial.print(F("\twm2_power_pin")); Serial.print(wm2_power_pin); Serial.print(F(":"));
Serial.println(expander.digitalRead(wm2_power_pin) ? "HIGH" : "LOW");
expander.digitalWrite(wm3_power_pin, HIGH);
Serial.print(F("\twm3_power_pin")); Serial.print(wm3_power_pin); Serial.print(F(":"));
Serial.println(expander.digitalRead(wm3_power_pin) ? "HIGH" : "LOW");
// J'USQU'ICI LA CARTE SD N'INTERVINT TOUJOURS = PAS DE LECTURE / ECRITUE
// MAINTENANT LESPROBLEMES COMMENCENT
// J'INITIALISE MON RTC (DS3231)
if (! Si.RtcBegin())
{
Serial.println("RTC ERREUR");
}
}
et j'ai le message RTC ERREUR dans mon terminal.
Je vais donc détailler Si.RtcBegin(), car c'est là que je lis dans ma carte SD pour voir si le fichier clock.txt existe
bool Foxuino::RtcBegin()
{
if(rtc.begin())
{
Serial.println(F("DBUG"));
Serial.println(_config_rtc_file);
if (!_sd.exists(_config_rtc_file))
{
Serial.print(F("does not exist"));
}
}
}
Ceci m'afiche
/clock.txt does not exist
Il m'indique bien que le fichier n'existe alors qu'il existe.
Si j'utilise ma premiere carte avec la meme carte SD, je n'ai pas ce problème que mon OLED est activé.
Comme je l'ai indiqué aucun autres périférique I2C me cause se problème. Je vais encore regarder regarde mes deux schéma, mais même je me demandais si vous aviez déjà expérimenté un problème comme celui-ci avec une carte SD et un écran LCD OLED?
Merci pour vos tuyaux