Cohabitation SD-RTC-SD

Bonjour,
je suis en train de regrouper sur une carte UNO, diverses mesures sur ma maison (2 anémomètres et 2 fois 10 opta resistances : évaluer les ombres sur 2 sections d toit à équiper en panneaux solaires)

Sur pas mal d'aspect vous m'avez fait bien avancer ...mais là !!!

Je galère depuis 3 jours... surement un truc trivial mais ...... grrrr
Donc : une carte UNO, 1 shield SD + RTC, 1 oled 128x64 pixels. J'ai mis 2 resistances 6.8 K en pull up sur A4 et A5.

ET donc SD+RTC => OK, OLED seul => OK mais les 3 => le programme plante.

Ci après le code, le scan des 2 x I2C reconnu, et le shield utilisé.

Désolé de vous mettre encore a contribution

Jusque là, j'étais en mode essai/echec/re-essai.. j'aimerai passer en mode plus apprentissage mais je ne sais pas par ou commencer ..principalement concernant les Bibliothèques, compatibilité , ..etc

Cordialement

// racourcis pour  faicliter les message de mise au point
#define sp Serial.print(" ")
#define rc Serial.println()
#define pr Serial.print
#define ap display.print
#define aprc display.println();

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

//                    Horloge TR
#include <RTClib.h>
RTC_DS1307 RTC;
DateTime time ;

//                    Afficheur  OLED
#include <Adafruit_GFX.h> 
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

/*
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
*/

byte win_in   ;
byte speed_win ;
byte fini = 1;

const byte arret = 3;             // bouton d'interruption
const byte Led_surveillance = 8;  // led de surveillance  fonctionnement (verte)  fixe = ecriture / clignotant = en attente
const byte Led_alarme = 7;        // led d' alarme (rouge) => while(1) nb de clignotement = code  alarme.

const byte Pin_win=0;             // lecture  vitesse  vent

//                    Carte SD

// Variables utilisées pour la SD Card
#define sdCardPinChipSelect   10                                  // Le lecteur de SD card sera branché sur les pins 10 (CS), 11 (MOSI), 12 (MISO), et 13 (SCK)
File    monFichier;
String  nomDuFichier; 


void setup() {

  pinMode (arret, INPUT_PULLUP);
  pinMode (Led_surveillance, OUTPUT);
  pinMode (Led_alarme, OUTPUT);

  
Serial.begin(9600);                         //lancement liaison Serie

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);   //lancement OLED

RTC.begin();                                 //lancement RTC

//     CNX  carte  SD
if (!SD.begin(sdCardPinChipSelect))  {
    Serial.println(F("Erreur carte SD!"));
    erreur(2);       
    }

nomDuFichier="Test.txt";

if (!SD.exists(nomDuFichier)) {
    Serial.println(F("Nouveau fichier "));
    monFichier = SD.open(nomDuFichier, FILE_WRITE);
    
    if (!monFichier){
       Serial.println(F("Échec d'ouverture"));
       erreur(3);       
       }
    }
    else {
        Serial.println(F("Rajout au  fichier"));    
        monFichier = SD.open(nomDuFichier, FILE_WRITE);
        
        if (!monFichier){
          Serial.println(F("Échec d'ouverture"));
          erreur(4);       

         }      
    }

// Ecriture  fichier et  close....

pr("print  ");Serial.println (monFichier.println("ligne kkkkk  1")); // nb octets écrits

//pr("flush  ");Serial.println (monFichier.flush());    // voir si Code retour ???

//pr("close ");Serial.println (monFichier.close());

monFichier.close();

// essai d'écriture pour 1. Tracer l'anancement  2. tester l'écriture sur OLED

display.clearDisplay();display.display();
display.setTextColor(WHITE);ap("Bonjour  truc 4");aprc;aprc;

display.display();
pr("hhhh");rc;

// utilisation de RTC

time = RTC.now();

pr(" heure :");pr(time.hour());pr(" Mn :");pr(time.minute());rc;

ap(" heure :");ap(time.hour());ap(" Mn :");ap(time.minute());rc;
display.display();

}


void loop() {
  // put your main code here, to run repeatedly:


  delay (100);

}
//        Diverses procédures de  service
//  void attente (int nb_min, int cycle) { (Attente  avec clichotement  LED VERTE )
//  void erreur (int code) {            ( Boucle sans  fin avec nb de clignoment LED  rouge) 
//
 

Capture d’écran 2022-03-05 à 15.01.14

Capture d’écran 2022-03-05 à 15.05.24

J'ai oublié de dire, le code précédant n'est qu'un extract d'essai, j'ai enlevé les traitements eux même pour gagner du temps et de la place dans ma phase de debug.

Bonjour michel_de_toulouse

Quels sont les symptômes?

Cordialement
jpbbricole

j'ai mis des Serial.print ..par ci par là.

Il me semble que le prog ne dépasse pas le "close" du fichier (l'enregistrement est bien créé - rien ne s'affiche sur l'OLED - ni le hh sur Serial.
Capture d’écran 2022-03-05 à 16.43.33

SI je mets les lignes de "display" écran en commentaire => l'heure et le SD fonctionne.

Si je remplace la déclaration (d'ailleurs je m'y perds ..) :

  • "Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);"
    par :
  • "
    #define OLED_RESET -1
    Adafruit_SSD1306 display(OLED_RESET);
    "
    La c'est l'accés a la SD qui est perdu .... grrrr !!!

si vos voyez qq chose ... merci d'avance

Bonjour michel_de_toulouse

Avec ton programme au grand complet, quand tu compiles quel est le bilan mémoire affiché dans la fenêtre du bas?

Cordialement
jpbbricole

Bjr jpbbricole,

Le programme au grand complet est ... ultra limite an RAM : 95 % et 90% en programme.

C'est pour ça que , avec ces essais mini, j'essaye de voir TOUT ce que prennent les "basiques", Bib, etc.. pour voir ce qui me reste en place utile et me limiter et optimiser.
Mon plan b) est, si je n'ai pas le choix, je ferai un prog mini d'enregistrement des données et 1 deuxième qui traitera (moyenne, stat, ..etc) , ailleurs

Mon plan C), je vire l'écran mais c'est problématique de n'avoir que les LED pour me signaler que tout marche bien (ex: pb sur la SD, capteur en défaut, plantage, ...) ...... (le prog va tourner 2 à 3 mois min pour avoir une vision mi printemps-mi été)

Voila....

plan D) deport d'affichage sur un nano auxiliaire..mais alors la ..pfeuuuu

Toute mes excuses..j'ai mal compris la question :wink:
la, le programme compilé occupe :
" le croquis utilise 25608 octets (79%)
Les variables globales utilisent 1275 octets (62%) de mémoire dynamique, ce qui laisse 773 octets"

Dangereux !
Une suggestion : SSD1306Ascii

Bonsoir michel_de_toulouse

Tu est certainement limite en mémoire.
Mise à part la suggestion pertinente de @hbachetti, si tu as un Mega sous la main pour transporter le tout dessus, tu gagnerai de la place et tu pourrais continuer à développer en toute quiétude.

Cordialement
jpbbricole
.

Merci a vous deux,

j'ai un Mega avec une autre application ... ( je vais essayer... Juste j'avais bien câblé mon shield .... :wink: )

De même SSD1306 ascii, ca aussi bonne piste ... Je suppose que il doit être moins gourmand...

Mais je suis têtu... sur mon prog d'essai, avec :

" le croquis utilise 25608 octets (79%)
Les variables globales utilisent 1275 octets (62%) de mémoire dynamique,"

ca devrait le faire !!!!!!! Grrrr que se passe t il.. ??

Il y a t il un ordre de déclaration à respecter ? Des cohérences plus fines à vérifier ?

je m'y replongerai demain...

Pas sûr, de la mémoire est allouée dynamiquement au moment du setup() par la librairie graphique, par exemple.

Bjr
pour clore cet demande..

En utilisant la bib SSD1306Ascii (griman), le pb semble réglé. C'était, probablement bien un PB de manque de mémoire RAM.

Merci a vous.

CDLT

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.