Interaction probable entre les usages de Wire dans les libraries SD et U8G2

Avec un esp8266 (wemos mini) l'utilisation de chacune des bibliothèques en mode séparé fonctionne mais l'écran devient bloqué dès qu'une action sur la SD intervient.

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <SD.h>

/* ESP8266 SD(adaptateur sd --> microsd)

D5 --- CLK
D6 --- MISO
D7 --- MOSI
3.3v    3.3v
GNd    GND
D1 --- CS

écran  LCD UC1701x
 Screen      ESP8266
5 LedA         NC
6 Vss          GND
7 Vdd          3.3v
8 SCLK        D5   SCK
9 SDA          D7    MOSI
10 RS          D2     dc
11 Reset      D3 reset
12   CS        D8
*/



U8G2_UC1701_MINI12864_F_4W_SW_SPI u8g2(U8G2_R2, /* clock=/ D5, / data=/ D7, / cs=/ D8, / dc=/ D2, / reset=*/ D3);

const int CS_SD = D1; // for SD

void setup(void)
{ u8g2.begin();
u8g2.firstPage();
do { u8g2.setFont(u8g2_font_courB14_tr);
u8g2.drawStr(1,15,"Ecran OK");
} while ( u8g2.nextPage() );
Serial.begin (115200);
Serial.println(" ");
Serial.println(" Initialisation écran passée ");
delay(1000);
Serial.println("Initialisation SD card...");
if (!SD.begin(CS_SD)) // SD detectee ?
{ Serial.println("Pas de SD détectée");
u8g2.firstPage();
do { u8g2.setFont(u8g2_font_courB14_tr);
u8g2.drawStr(1,1,": Pas de SD");
} while ( u8g2.nextPage() );
Serial.println("Ici : rien n'a changé sur l'écran ");
return; }
}

void loop(void)
{
}

Je soupçonne que dans une bibliothèque l'affectation d'une pin ne soit pas effectuée correctement au changement de bibliothèque.
Faudrait-il fermer une instance avant d'en ouvrir une autre ?
Je suis bien incapable de résoudre ce genre de pb
L'usage des bibliothèques U8G et Sd sur un ATmega 2560 ne posait aucune difficulté semblable en SPI mais ce n'était pas le même écran.

Merci d'avance pour votre aide.

Pour éviter les soucis avec plusieurs périphériques SPI, je passe toutes les pins CS en output HIGH avant tout appel aux périphériques.
Cela permet d’eviter des réponses parasites de ceux qui n’auraient pas encore été initialisés par leur bibliothèque respective.
À tenter au début du setup:

pinmode (D1, OUPUT);
digitalwrite (D1, HIGH);
pinmode (D8, OUPUT);
digitalwrite (D8, HIGH);
SPI.begin ();

Tapé sur le téléphone, fautes de frappe inside :slight_smile:

Edit:
Je crois savoir que certains modules SD ne relâchent pas correctement certaines pins du bus SPI, du coup ils ne fonctionnent pas correctement sur un bus partagé. D’autres intervenants sur le forum auront plus d’infos sur le sujet je pense.

Merci mais pas de changement avec le code ci-dessous
Pour la SD j'utilise comme support un adaptateur MicroSD vers SD

#include <Arduino.h> 
#include <U8g2lib.h>
#include <SPI.h> 
#include <Wire.h> 
#include <TinyGPS++.h> 
#include <SoftwareSerial.h> 
#include <SD.h>

/* https://github.com/olikraus/u8g2/wiki/u8g2reference
 * 
 * ESP8266         SD(adaptateur sd --> microsd
 * D5         --- CLK
 * D6         --- MISO
 * D7         --- MOSI
 * 3.3v et GNd
 * CS       ----- sur D1
 * 
 * 
 * test pour un écran UC1701x c
 * 
 *      Ecran      ESP8266
 * 5    LedA       NC
 * 6    Vss        GND
 * 7    Vdd        3.3v
 * 8    SCLK       D5 SCK
 * 9    SDA        D7 MOSI
 * 10   RS         D2 dc
 * 11   Reset      D3 reset
 * 12   CS         D8  
 */

U8G2_UC1701_MINI12864_F_4W_SW_SPI u8g2(U8G2_R2, /* clock=*/ D5, /* data=*/ D7, /* cs=*/ D8, /* dc=*/ D2, /* reset=*/ D3);  

const int CS_SD = D1;               // pour SD


void setup(void)     
{ pinMode (D1, OUTPUT);
  digitalWrite (D1, HIGH);
  pinMode (D8, OUTPUT);
  digitalWrite (D8, HIGH);
  u8g2.begin();  
  u8g2.firstPage();
  do {  u8g2.setFont(u8g2_font_courB14_tr); 
        u8g2.drawStr(1,15,"Ecran OK");
     } while ( u8g2.nextPage() );
  Serial.begin (115200); 
  Serial.println("   ");
  Serial.println(" Initialisation écran passée  ");
  delay(1000);
  Serial.println("Initialisation SD card...");
  if (!SD.begin(CS_SD))                         // SD detectee ? 
    {   Serial.println("Pas de SD détectée");
        digitalWrite (D1, HIGH);
         u8g2.firstPage();
         do {  u8g2.setFont(u8g2_font_courB14_tr); 
               u8g2.drawStr(1,1,": Pas de SD");
            } while ( u8g2.nextPage() );
         Serial.println("Ici : rien n'a changé sur l'écran ");
         return;            }
}

void loop(void) 
{ 
}

si je comprends bien:
sd + écran 1 + mega = ok
sd + écran 2 + esp = pas ok

donc il faudrait essayer:
sd + écran 2 + mega
sd + écran 1 + esp
pour être sûr de la source du pb (écran 2 ou esp ?)

Non

J'ai un esp8266 branché avec un adaptateur microSD ET un écran lcd UC1701X

Je charge un programme pour lire écrire sur la SD : pas de pb
je charge un programme pour afficher sur le lcd : pas de problème
Donc les connections des matériels n'entrent pas en conflit

Je lance le programme de mon premier post
l'affichage "ecran ok s'affiche sur le lcd
le programme ensuite interroge le lecteur sd, constate bien qu'il n'y a pas de sd dans le lecteur MAIS si les messages en console série sont bien affichés, le texte "ecran ok" devrait s'effacer et être remplacé par "pas de Sd"
Il n'en est rien
Donc les commandes de l'écran ne sont plus reconnues.

Les ordres pour MISO, MOSI, SCLK qui ne devraient être pris en compte que s'ils sont validés par leur CS respectif doivent passer sur l'écran quand sd est concerné et le bloquer ou ne plus passer après usage de SD...
Est-ce parce que Wire ne fait pas correctement son boulot ? ou bien ???

J'ai vu le post #23 de
https://forum.arduino.cc/index.php?topic=153447.15
Mais je ne comprends pas pinmode(..., SPECIAL)

Ok, donc on dirait que le sd.begin() fait quelque chose qui ne plaît pas au lcd.

Essaie d’ajouter u8g2.begin(); après sd.begin () pour réinitialiser l’ecran avant de réafficher quelque chose.

Si là ça marche, il faudra regarder dans les deux libs pour voir s’il n’y a pas quelque chose d’incompatible dans les deux begin().

Dans un premier temps cela semble fonctionner l'appel à l'LCD fonctionne mais

Quand on alterne appels à chacun avec ou sans carte sd dans le lecteur on a ce qui est en fin de

#include <SD.h>



#include <Arduino.h> 
#include <U8g2lib.h>
#include <SPI.h> 
#include <Wire.h> 
#include <TinyGPS++.h> 
#include <SoftwareSerial.h> 

/* https://github.com/olikraus/u8g2/wiki/u8g2reference
 * 
 * ESP8266         SD(adaptateur sd --> microsd
 * D5         --- CLK
 * D6         --- MISO
 * D7         --- MOSI
 * 3.3v et GNd
 * CS       ----- sur D1
 * 
 * 
 * test pour un écran UC1701x c
 * 
 *      Ecran      ESP8266
 * 5    LedA       NC
 * 6    Vss        GND
 * 7    Vdd        3.3v
 * 8    SCLK       D5 SCK
 * 9    SDA        D7 MOSI
 * 10   RS         D2 dc
 * 11   Reset      D3 reset
 * 12   CS         D8  
 */

U8G2_UC1701_MINI12864_F_4W_SW_SPI u8g2(U8G2_R2, /* clock=*/ D5, /* data=*/ D7, /* cs=*/ D8, /* dc=*/ D2, /* reset=*/ D3);  

const int CS_SD = D1;               // pour SD

    
void setup(void)     
{ pinMode (D1, OUTPUT);
  pinMode (D8, OUTPUT);
  
  u8g2.begin(); 
  //onLcd(); 
  u8g2.firstPage();
  do {  u8g2.setFont(u8g2_font_courB14_tr); 
        u8g2.drawStr(1,15,"Ecran OK");
     } while ( u8g2.nextPage() );
  Serial.begin (115200); 
  Serial.println("   ");
  Serial.println(" Initialisation écran passée");
  delay(1000);

  if (!SD.begin(CS_SD))                          // SD detectee ? 
    {   Serial.println("Pas de SD détectée");
        return;            }
  
  Serial.println("Initialisation SD");
  u8g2.begin();
  u8g2.firstPage();
         do {  u8g2.setFont(u8g2_font_courB14_tr); 
               u8g2.drawStr(1,15,":SD in");
            } while ( u8g2.nextPage() );
  Serial.println("ici");  
  delay(1000);  

  if (SD.begin(CS_SD))                          // SD détectée ? 
    {   Serial.println("SD détectée");
        return;            }
  u8g2.begin();
  u8g2.firstPage();
         do {  u8g2.setFont(u8g2_font_courB14_tr); 
               u8g2.drawStr(1,15," Avec SD");
            } while ( u8g2.nextPage() );
  Serial.println("fin");    
}

void loop(void) 
{ 
}

// avec sd : les trois messages sont affichés sur l'écran 
// Mais pas SD détectée sur le port série

// sans sd
// lcd : 1er message ecran ok
// série : Initialisation écran passée puis Pas de SD détectée

// le programme semble être stoppé après le test négatif sur la SD

Après réflexions et essais il semble que l'ajout de U8G2.begin(); avant chaque appel de l'affichage corrige
Il faut que je teste plus précisément si un SD.begin(D1) est aussi nécessaire mais il semble que non

A suivre...

Je reviendrais mettre résolu si cela se confirme.

Merci Cbrandt !

As tu vraiment besoin de la carte SD ou bien peux tu utiliser la SPIFFS ?

tu as le lien de la lib u8g2 exacte que tu utilises ? ainsi que celui de la lib lcd ?

Bonjour,

j'avais eu un pb assez similaire, avec un autre écran mais exactement les mêmes symptômes. Résolu en utilisant des pin miso mosi sck différents par periphérique:

http://forum.arduino.cc/index.php?topic=587880.0