Carte SD et Récepteur/émetteur RF branché SPI : Erreur de lecture

Bonjour

J'ai une carte Adafruit Feather 32u4 RFM95 LoRa Radio - 868 or 915 : Adafruit Feather 32u4 RFM95 LoRa Radio- 868 or 915 MHz [RadioFruit] : ID 3078 : $34.95 : Adafruit Industries, Unique & fun DIY electronics and kits

Liste des pins

Avec une carte lecteur de carte SD.

Les deux sont branchées avec le protocol SPI

j'ai donc branché ma carte SD de la façon suivante :

Carte SD Adafruit Feather 32u4 RFM95 LoRa Radio

Miso -----------------------> Miso
Mosi -----------------------> Mois
Sck -----------------------> SClk
CS -----------------------> 6
Gnd -----------------------> Gnd
vcc -----------------------> 3,3V

j'ai fait une petite fonction pour lire le fichier mais elle ne marche qu'une fois sur deux et je ne comprend pas pourquoi...

Sans doute un truc avec CS (Chip Select) que je ne fais pas comme il faut et qui fait que je ne peux pas faire les deux en même temps...

J'ai besoin de votre expérience pour me débuger.

Ça fait plusieurs semaines que je cherche, j'ai lu et relu la Doc sur Adafuit et sur les branchement SPI.

Il doit y avoir qq chose qui m'échappe. (sans doit à cause de l'anglais...)

MERCI d'avance.

Voici mon code simplifié pour mieux voir l'erreur.

#include <SPI.h>
#include <RH_RF95.h>
#include <SD.h>

File fichierSD;
RH_RF95 rf95(8,7);

void setup() 
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
 
  while (!Serial);
  Serial.begin(9600);
  delay(100);

  digitalWrite(4, LOW);
  delay(10);
  digitalWrite(4, HIGH);
  delay(10);
 
  while (!rf95.init()) {
    Serial.println("LoRa radio init failed");
    while (1);
  }
  Serial.println("LoRa radio init OK!");

  if (!rf95.setFrequency(915)) {
    Serial.println("setFrequency failed");
    while (1);
  }

  rf95.setTxPower(23, false);


  SD.begin(6);
}
 
 
void loop()
{
      lireFichier();

// normalement je n'appelle pas la fonction lireFicher() ici.
// c'est pour tester la fonction que j'ai fais cet appelle ici

// ici le programme lit bien le 1 er caractère du fichier qui est sur la carte SD

//  Lors du première passage dans la boucle, il lit bien un "p" qui est bien le premier caractère du fichier.
// Lors du deuxième passage dans la boucle il ne sait plus lire le fichier : il lit un "?" à la place d'un "p"
// Puis pour tous les autres passage dans la boucle, il sait bien lire le fichier qui est sur la carte SD
//  il lit bien un "p" qui est bien le premier caractère du fichier.

// je ne veux pas lire tous le fichier, juste la 1 er lettre



      uint8_t buf[15];
      uint8_t len = sizeof(buf);
     
      Serial.println(F("Waiting for reply...")); 
      if (rf95.waitAvailableTimeout(1000))
      {  
        if (rf95.recv(buf, &len))
       {
          Serial.print(F("Got reply: "));
          Serial.println((char*)buf);  
          // Si ce message est une demande de Data
          if (strstr((char *)buf, "Data SVP")) 
          {
            lireFichier();

// J'attend une réponse, que je reçois en radio fréquence sur 915 Mhz. 
//Si la réponse est : "Data SVP", je veux relire le fichier txt sur la carte SD. juste la 1 er lettre du fichier.

// Ici plus rien ne marche????!!!!! GRRRRRRRR.....


// Là, à chaque fois que je vais lire sur la carte SD, il ne sais plus lire...: il lit un "?" à la place d'un "p"
// J'ai l'impression que c'est parce qu'il parle aux deux cartes en même temps et que le CS (chip Select) ne fait pas son travail....
// Mais je suis trop nouveau pour bien comprendre mon erreur.
// SOS pouvez vous m'expliquer mon erreur.





          }
        }
        else
        {
          Serial.println(F("Receive failed"));
        }
      }
      else
      {
        Serial.println(F("No reply, is there a listener around?"));
      }
  

}

void lireFichier()
{
  String nomFichier="1.txt";
 
  char ceChar="";
  
  fichierSD = SD.open(nomFichier);
  ceChar=fichierSD.read(); 
  Serial.println(ceChar);
  fichierSD.close();
   
}

bonjour

peux-tu éditer ton message et mettre ton code entre balises "code" ? (premier icone en haut de la barre de l'éditeur) ce sera plus clair

ensuite, ta fonction lireFichier telle qu'elle est conçue ne lit qu'un caractère dans le fichier, c'est donc normal qu'elle n'en lise qu'un.

ensuite là tu va à chaque tour de loop ouvrir le fichier, lire un caractère, fermer le fichier. Ça fa faire beaucoup d'ouverture/fermeture de fichier, je me demande si ça ne peut pas être à cause de ça.

Tu pourrais aussi vérifier que le fichier est bien ouvert et afficher une erreur s'il ne l'est pas, comme dans les exemples de la librairie SD, ça permettrait de mieux cerner le problème

Merci pour tes explication maintenant, je n'ouvre le fichier qu'une seul fois et ça marche bien même si je ne referme pas le fichier. Enfin ça marche pour la lecture du 1 er caractère.

Si maintenant je veux compter le nombre de virgules dans le fichier. Le code marche bien aussi dans 99% des cas...

Sur 100 boucles il lite bien le bon nombre de virgules...
Si je laisse tourner la boucle, il peut compter le nombre de virgules pendant des heures..

MAIS... il y a un truc vraiment très bizarre qui se passe et je ne comprend pas...

C'est une sorte d'interférence radio ou je ne sais quoi????

Si je déplace ma main proche des cartes sans les toucher ça bug...

Soit il compte le mauvais nombre de virgules

Soit LE PROGRAMME PLANTE et gèle.

Par la suite, si je re télécharge mon code, le programme n'est plus capable de lire la carte SD.
Je dois sortir la carte puis la remettre dans son emplacement pour que ça marche encore......

VRAIMENT ESOTÉRIQUE ET ALÉATOIRE COMME BUG. JUSTE APPROCHER MA MAIN SANS RIEN TOUCHER ET ÇA BUG.....

Il faut sans doute mettre un filtre (condensateur) qq part mais où et pour quoi?

Qu'est-ce qui peut créer cette interférence et surtout comment la régler?

Merci d'avance.

voici mon code :

#include <SPI.h>
#include <RH_RF95.h>
#include <SD.h>

File fichierSD;
String nomFichier="1.csv"; 

RH_RF95 rf95(8,7);

void setup() 
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
 
  while (!Serial);
  Serial.begin(9600);
  delay(100);

  digitalWrite(4, LOW);
  delay(10);
  digitalWrite(4, HIGH);
  delay(10);
 
  while (!rf95.init()) {
    Serial.println("LoRa radio init failed");
    while (1);
  }
  Serial.println("LoRa radio init OK!");

  if (!rf95.setFrequency(915)) {
    Serial.println("setFrequency failed");
    while (1);
  }

  rf95.setTxPower(23, false);


  SD.begin(6); 
  fichierSD = SD.open(nomFichier);
}
 
 
void loop()
{
      lireFichier();

      uint8_t buf[15];
      uint8_t len = sizeof(buf);
     
      Serial.println(F("Waiting for reply...")); 
      if (rf95.waitAvailableTimeout(1000))
      {  
        if (rf95.recv(buf, &len))
       {
          Serial.print(F("Got reply: "));
          Serial.println((char*)buf);  
          // Si ce message est une demande de Data
          if (strstr((char *)buf, "Data SVP")) 
          {
            lireFichier();
          }
        }
        else
        {
          Serial.println(F("Receive failed"));
        }
      }
      else
      {
        Serial.println(F("No reply, is there a listener around?"));
      }
  

}

void lireFichier()
{

 
  char ceChar="";
  int nbVirgules=0;
  
 fichierSD.seek(0);
  while (fichierSD.available()) { 
    ceChar=fichierSD.read(); 
    if(ceChar==','){nbVirgules++;}
  } 
  Serial.println(F("bn virgules"));
  Serial.println(nbVirgules);  
}

tu dois en effet avoir une interférence due à l'électricité statique ou je ne sais quoi, mais là dessus je ne suis pas du tout compétant pour t'aider... :frowning: