Wroom et SdCard

Bonsoir,

Je test l’écriture sur une carte SD avec un Wroom ESP 32.


#include <mySD.h>


int ligne;

void setup()
{
  Serial.begin(9600);

  Serial.print("Initializing SD card...");
  if (!SD.begin(26, 14, 13, 27)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

}

void loop()
{

  File dataFile = SD.open("datalog.txt", FILE_WRITE); 
  
  if (dataFile)
  {
    dataFile.print("copie:");
    dataFile.println(ligne);
    dataFile.close();
    Serial.print("ecriture ligne :");
    Serial.println(ligne);
    ligne++;
  }

  else {
    Serial.println("erreur carte");
  }

  delay(1000);
}

Tout fonctionne, mais lorsque j’arrache la SD pendant la loop , l’ESP continu d’affiché le decompte “ecriture ligne :” comme si la carte était encore là…

Une idée ?

Merci

Bonsoir

je ne connais pas la librairie utilisée.
les fonctions d'écriture renvoient sans doute une info particulière en cas d'erreur d'écriture sur la carte SD mais dans ton code tu ne testes pas l'info retournée par la fonction qui écrit dans le fichier, l'erreur n'est donc pas prise en compte et la boucle continue d'incrémenter la variable ligne même en cas d'erreur d'écriture sur la carte.

Bonjour

J'ai changer de lecteur carte pour le coup, pour full graphic smart controller, c'est une platine avec écran, encodeur avec bp, un autre bp.

Les sorties du module sont les suivantes :

EXP 1 =X EXP2 =Y
2,4,6,8,10 . 2,4,6,8,10
1,3,5,7,9 . 1,3,5,7,9,

X1=beeper Y1=SD Miso
X2=Encodeur switch Y2=SD SCK
X3=LCD RW Y3=Encoder 1
X4=LCD RS Y4=SD SS
X5=LCD E Y5=Encoder 2
X6=LCD 5 . Y6=SD MOSI
X7=LCD 6 Y7=SD Detect
X8=LCD 7 Y8=Reset
X9=GND Y9=GND
X10=VCC Y10=VCC

toujours avec un ESP32 Wroom j'arrive à faire fonctionné l'écran grâce à la librairie U8g2lib.h.


ESP MODULE
X5 E 14
X3 RW 12
X4 RS 13


U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, 14, 12, 13)

Je voulais utilisé la librairie "mySD"


ESP MODULE
26 CS Y4
14 MOSI Y6
13 MISO Y1
27 SCK Y4


SD.begin(26, 14, 13, 27))

mais les pin 13 et 14 sont les mêmes et rien ne fonctionne...

Je ne sais/trouve pas comment modifier pour faire fonctionné l'écran et la SD ensemble

Une idée de comment ?

J'ai oublier le plan du module:

J'ai trouvé mes reponses grace à se post :

Mais je n'arrive pas avec le controle de la SD ..

C'est du SPI. Le SPI est un bus de communication. Chaque device sur le bus partage les broches MISO, MOSI et CLK (c'est à dire que tous les périphériques et le master - ton ESP32 - utilisent les mêmes fils pour ces 3 lignes), et chaque slave a un CS (parfois appelé SS) personnel, relié au master.

C'est quoi ton "full graphic smart controller" ? As-tu une image, une datasheet ? Est-ce lui qui supporte le lecteur SD ? Ou est-ce un module à part ?
Comment tout ça est-il connecté ?

lesept:
C'est quoi ton "full graphic smart controller" ? As-tu une image, une datasheet ? Est-ce lui qui supporte le lecteur SD ? Ou est-ce un module à part ?
Comment tout ça est-il connecté ?

L'image :

Mais j'ai fait le pinout comme indiqué dans le post #2 :

J4l13n:
Les sorties du module sont les suivantes :

EXP 1 =X EXP2 =Y
2,4,6,8,10 . 2,4,6,8,10
1,3,5,7,9 . 1,3,5,7,9,

X1=beeper Y1=SD Miso
X2=Encodeur switch Y2=SD SCK
X3=LCD RW Y3=Encoder 1
X4=LCD RS Y4=SD SS
X5=LCD E Y5=Encoder 2
X6=LCD 5 . Y6=SD MOSI
X7=LCD 6 Y7=SD Detect
X8=LCD 7 Y8=Reset
X9=GND Y9=GND
X10=VCC Y10=VCC

et en quote #3 le synopsis :

Tous fonctionne, c’est juste le contrôle de la SD qui ne s’effectue pas, c’est un probleme dans le code

#include <mySD.h>


int ligne;

void setup()
{
  Serial.begin(9600);

  Serial.print("Initializing SD card...");
  if (!SD.begin(26, 14, 13, 27)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

}

void loop()
{

  File dataFile = SD.open("datalog.txt", FILE_WRITE);
 
  if (dataFile)
  {
    dataFile.print("copie:");
    dataFile.println(ligne);
    dataFile.close();
    Serial.print("ecriture ligne :");
    Serial.println(ligne);
    ligne++;
  }

  else {
    Serial.println("erreur carte");
  }

  delay(1000);
}

Mais j'ai fait le pinout comme indiqué dans le post #2 :
Les sorties du module sont les suivantes :

EXP 1 =X EXP2 =Y
2,4,6,8,10 . 2,4,6,8,10
1,3,5,7,9 . 1,3,5,7,9,

X1=beeper Y1=SD Miso
X2=Encodeur switch Y2=SD SCK
X3=LCD RW Y3=Encoder 1
X4=LCD RS Y4=SD SS
X5=LCD E Y5=Encoder 2
X6=LCD 5 . Y6=SD MOSI
X7=LCD 6 Y7=SD Detect
X8=LCD 7 Y8=Reset
X9=GND Y9=GND
X10=VCC Y10=VCC

J'y comprends rien à tout ça: qu'est ce que EXP1, EXP2 ?

Que donne ton code sur la console ?
Initializing SD card...
puis : initialization done. ?
Ensuite : "erreur carte" ?
Copie le contenu de la console dans ta réponse.

Si je ne met pas la SD au démarrage il me fait "initialization failed!"

Si je met la SD il met bien "initialization done." , puis :

ecriture ligne :1
ecriture ligne :2
ecriture ligne :3
ecriture ligne :4
etc...

mais si j'enlève la SD pedant la loop il continu

ecriture ligne :5
ecriture ligne :6
ecriture ligne :7
ecriture ligne :8
etc...

Et que contient la carte une fois enlevée ?

Je ne sais pas où tu as trouvé ton code, mais il ne ressemble en rien aux exemples de la bibliothèque. Tu devrais les tester avant.

Bonjour

Elle contient bien le fichier datalog.txt avec les lignes

ecriture ligne :1
ecriture ligne :2
ecriture ligne :3
ecriture ligne :4
etc

j’ais regarder les fichiers exemple :

/*
  SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** UNO:  MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed)
  and pin #10 (SS) must be an output
 ** Mega:  MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed)
  and pin #52 (SS) must be an output
 ** Leonardo: Connect to hardware SPI via the ICSP header

 
 created   Nov 2010  by David A. Mellis
 modified 9 Apr 2012  by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
 
#include <SPI.h>
#include <mySD.h>

File myFile;

// change this to match your SD shield or module;
//     Arduino Ethernet shield: pin 4
//     Adafruit SD shields and modules: pin 10
//     Sparkfun SD shield: pin 8
const int chipSelect = 4;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(115200);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(SS, OUTPUT);
   
  if (!SD.begin(17, 14, 12, 15)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
	// nothing happens after setup
}

a part ré-ouvrir le fichier il ne fait rien de plus.

Le fichier devrait contenir:

copie: 0
copie: 1
copie: 2
etc.

Il y a cette ligne en plus

pinMode(SS, OUTPUT);

Mais si tu arrives à écrire dans la carte, le problème ne vient pas de là.

Ce que tu veux c’est qu’il vérifie la présence de la carte et n’écrive que lorsqu’elle est dans le lecteur ?

On pourrait penser que ces lignes font ça, mais il semble que non :

 File dataFile = SD.open("datalog.txt", FILE_WRITE);
 if (dataFile)
 {

Essaye ceci:

#include <mySD.h>
int ligne = 0;

void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(26, 14, 13, 27)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
}

void loop()
{
  if (SD.begin(26, 14, 13, 27)) {
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    dataFile.print("copie:");
    dataFile.println(ligne);
    dataFile.close();
    Serial.print("ecriture ligne :");
    Serial.println(ligne);
    ligne++;
  } else Serial.println("erreur carte");
  delay(1000);
}

Bonsoir

J’ai essayer le

if (SD.begin(26, 14, 13, 27))

sans succes

J’ai parcouru la librairie et est trouvé “.available()”

J’ai essayé également sans succes …

#include <mySD.h>
int ligne = 0;

void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(26, 14, 13, 27)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
}

void loop()
{
  File dataFile = SD.open("datalog1.txt", FILE_WRITE);
  delay(1000);
  
  if (dataFile) {
    
    dataFile.print("copie:");
    dataFile.println(ligne);
    dataFile.close();
    Serial.print("ecriture ligne :");
    Serial.println(ligne);
    ligne++;
  } 
  else {
  Serial.println("erreur carte");
  delay(1000);
  }

if (dataFile.available()){

  Serial.println("ok");
}
else{

  Serial.println("************Erreur***********");
}

}

Si j’enleve la carte pendant le process le terminal continu de retourné l’incrémentation de ligne et ok

C'était if (!SD... Avec le !

Bonsoir

S'il s'agit toujours de détecter le retrait de la carte SD il est possible d'utiliser le signal 'CD' = Card Detect, présent sur l'embase et que l'on voit aboutir à un connecteur sur le schéma montré au message #3

En principe dans l'embase l'insertion d'une carte provoque la mise à la masse du signal CD, reste à exploiter ce signal

Infos içi : memory - SD card detect in SPI mode - Electrical Engineering Stack Exchange

lesept:
C'était if (!SD... Avec le !

oui oui

@al1fch c'était pour controler que la SD est pas HS.

on peut compter jusqu'a 3 caractères sur l'ouverture du fichier ?

JE pensait ouvrir le fichier et compter les 3er caracteres et retourner 1 ou 0

 myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

Ok c'est bon

Merci

Bonjour

J'ai fait un pont de soudure pour alimenter la carte SD en 3.3v via la sortie VCC du Wemos.

Tout fonctionnait bien avec ou sans l'alimentation 5V plugger, les lignes s'incrémentaient et lisible sur le pc

J'ai fait un test en la laissant quelques jours juste le lecteur SD et le Wemos.
la pile s'est vidé, mais la Sd est illisible... "informatable"

Y a t-il un voltage minimum limite pour l'utilisé ?

Merci