Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tester présence carte SD

Sujet résolu
    3 octobre 2018 à 19:28:12

    Bonjour,

    je voudrai tester la présence de ma carte SD dans le void Loop()

    if (!SD.begin(53)) {
              lcd.setCursor(0,0); lcd.print("SD Erreur");
          }
          else {
              lcd.setCursor(0,0); lcd.print("SD ok");
    }

     
    code ci-dessous présent dans mon void Setup()

    ce code fonctionne

    via mon LCD en appuyant sur le bouton "Right" je voudrai vérifier le bon fonctionnement de ma carte SD

    mais en copiant ce code ci-dessus dans void Loop() cela ne fonctionne pas?

    matériel: arduino Méga

    merci

    cdlt

    • Partager sur Facebook
    • Partager sur Twitter
      4 octobre 2018 à 9:19:36

      Pourtant, il n'y a pas de raison que cela fonctionne dans le setup et pas dans le loop.

      Pourrais tu nous monter ton code complet ?

      • Partager sur Facebook
      • Partager sur Twitter
        4 octobre 2018 à 18:54:54

        bonsoir lorrio

        ci-dessous mon code complet

        test effectué: installation de la carte SD dans le lecteur puis Reset

        Arduino confirme via le Setup "SD ok"

        je sort la carte SD du lecteur puis appuie sur le bouton right => résultat ligne "Test SD" apparaît mais rien sur la 2ème ligne

        je remets la carte SD dans le lecteur puis rappuie sur le bouton right => résultat Test SD apparaît et SD Error! apparaît,

        j'ai voulu tester en vérifiant l'ouverture du fichier mais même en sortant la carte SD puis appuyant sur le bouton Right => résultat affichage Test SD et SD Ok alors que SD Error! aurait dû apparaître

        bout de code concerne si VarSelect == 7;

        Nb: si tu as des critiques sur mon code, je suis preneur - merci

        merci

        #include <LiquidCrystal.h>    //écran
        #include <config.h>
        #include <ds3231.h>         //Horloge
        #include <Wire.h>             //utilisé avec DS3231.h
        #include <SimpleDHT.h>        //Temp + tx humidité
        #include <SD.h>               //carte SD
        #include <SPI.h>              //utilisé avec SD.h
        
        //LCD
        LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
         
        // Definit des valeurs utilisées par les 5 boutons
        int lcd_key     = 0;
        int adc_key_in  = 0;
        #define btnRIGHT  0
        #define btnUP     1
        #define btnDOWN   2
        #define btnLEFT   3
        #define btnSELECT 4
        #define btnNONE   5
         
        // Lecture des  boutons (tous regroupés sur le Pin Analog A0)
        int read_LCD_buttons() {
            adc_key_in = analogRead(0);      // Lit la valeur depuis le sensor sur A0
            // centré sur ces valeurs : 0, 144, 329, 504, 741
            // on ajoute environ 50 à ces valeurs et on vérifie si on est proche
            if (adc_key_in > 1000) return btnNONE; // On définit ça en première option pour raison de rapidité car option la plus probable
            if (adc_key_in < 50)   return btnRIGHT; 
            if (adc_key_in < 195)  return btnUP;
            if (adc_key_in < 380)  return btnDOWN;
            if (adc_key_in < 555)  return btnLEFT;
            if (adc_key_in < 790)  return btnSELECT;   
            return btnNONE;  // Sinon, on n'a aucun bouton de sélectionné (par défaut)
        }
        
        // gestion boutons
        bool buttonReleased = false;
        int VarSelect = 0;
        int VarH;
        int VarM;
        int VarS;
        int VarPompCalc = 0;
        unsigned long VarPreviousMillis = 0;
        unsigned long VarGoRelai = 0;
        unsigned long VarTempo = 0;
        byte VarLed = 0;
        
        // DHT
        int pinDHT22 = 40;
        SimpleDHT22 dht22(pinDHT22); //déclaration du capteur
        float temperature = 0;
        float humidity = 0;
        
        //contact sec
        byte VarRelaiActif;
        long VarTpsPompage = 60000; //1 minute par défaut
        
        
        //Variable SD
        File Myfile;
        
        //RTC
        struct ts t; //déclaration variable t 
        char stringa[15];
        
        void setup() {     
              // définit la broche 38, 33 (contact sec) comme entrée
              pinMode(38, INPUT); //entrée interrupteur
              pinMode(33, OUTPUT); digitalWrite(33, LOW); //sortie vers relais
              pinMode(39, OUTPUT); digitalWrite(39, LOW); //sortie led si Marche Forcée
        
              // définit la broche 37 (marche forcée) comme entrée
              pinMode(37, INPUT);
              
              //LCD
              lcd.begin(16, 2); // Lance la librarie (16 caractères x 2 lignes)
              
              //RTC - mise à l'heure via code
              Wire.begin();
              /*DS3231 init(DS3231 INTCN);   
              t.hour=23; // données pour mettre à l'heure l'horloge
              t.min=13;
              t.sec=30;
              t.mday=13;
              t.mon=9;
              t.year=2018;   
              DS3231_set(t); // mise à l'heure de l'horloge*/
              
              //Message démarrage
              lcd.setCursor(0,0); lcd.print("Sketck Pompe"); //En haut à gauche (numéroté depuis 0)
              lcd.setCursor(0,1); lcd.print("Sept 2018");  //Ligne du bas
              delay(3000);  //maintien de l'affichage 3''
              lcd.clear(); //effacement de tout l'écran
              
              //Initialisation SD
              pinMode(53, OUTPUT); //définit la broche 53 (CS SD Card) comme sortie
              pinMode(35, OUTPUT); //définit la broche 35 (led SD Card) comme sortie
              digitalWrite(53, HIGH);
              if (!SD.begin(53)) {
                  lcd.setCursor(0,0); lcd.print("SD Erreur");
              }
              else {
                  lcd.setCursor(0,0); lcd.print("SD ok");
                  digitalWrite(35, HIGH);
                  Myfile = SD.open("Data.csv", FILE_WRITE);
                  Myfile.print("Date/Hrs;"); Myfile.print("Actions;");
                  Myfile.print("Val1;"); Myfile.println("Val2;");
                  Myfile.close();
              }
              delay(3000);  //maintien de l'affichage 3''
              lcd.clear(); //effacement de tout l'écran
              digitalWrite(35, LOW);
        }
         
        void loop() {
              //boucle active si pompe activée
              if (VarRelaiActif == 1 && millis() - VarGoRelai > VarTpsPompage) {
                 digitalWrite(33, LOW);
                 VarRelaiActif = 0;
              }
          
              //rafraichit LCD toutes les secondes
              if (millis() - VarPreviousMillis > 1000) {
                  VarPreviousMillis = millis();
        
                  // clignotement led rouge si MF activée
                  if (VarRelaiActif == 2) {
                     if (VarLed == 0) {
                        VarLed =1;
                        digitalWrite(39, HIGH); 
                     }
                     else {
                        VarLed =0;
                        digitalWrite(39, LOW);
                     }
                  }
                  
                  //RTC - Affichage de la date
                  DS3231_get(&t);
                  sprintf(stringa,"%02d/%02d/%02d", t.mday, t.mon, t.year%100); //affichage date: dd/mm/yy - nota: %100 après myrtc.year permet l'affichage de 2 chiifres
                  lcd.setCursor(0,0); lcd.print(stringa);
                  // pour affichage du jour: ddd dd/mm/yy
                  //static const char* dayStrings[] = {"Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"};
                  //sprintf(stringa,"%s %02d/%02d/%02d", dayStrings[myrtc.dayofweek], myrtc.dayofmonth, myrtc.month, myrtc.year%100);
                  
                  //RTC - Affichage de l'heure
                  sprintf(stringa,"%02d:%02d:%02d", t.hour, t.min, t.sec);
                  lcd.setCursor(0,1); lcd.print(stringa);
          
                  // Affiche Nbr pompage durant 5'' après click sur select
                  if ((millis() - VarTempo) <= 5000) {
                      if (VarSelect==1) {    //Affiche Nb cycle pompage
                          lcd.setCursor(9,0); lcd.print("Nb     ");
                          lcd.setCursor(13,0);
                          if (VarPompCalc >= 0 && VarPompCalc < 10) {lcd.write("00");}
                          if (VarPompCalc >= 10 && VarPompCalc < 100) {lcd.write("0");}
                          lcd.print(VarPompCalc);
                          //Affiche V3 eau pompée
                          lcd.setCursor(9,1); lcd.print("V3     ");
                          if (VarPompCalc == 0) {lcd.setCursor(15,1);}
                          if (VarPompCalc*(VarTpsPompage*3.05556/1000) >= 100 && VarPompCalc*(VarTpsPompage*3.05556/1000) < 1000) {lcd.setCursor(13,1);}
                          if (VarPompCalc*(VarTpsPompage*3.05556/1000) >= 1000 && VarPompCalc*183.334 < 10000 ) {lcd.setCursor(12,1);}
                          if (VarPompCalc*(VarTpsPompage*3.05556/1000) >= 10000) {lcd.setCursor(11,1);}
                          lcd.print(VarPompCalc*(VarTpsPompage*3.05556/1000), 0);
                      }
                      if (VarSelect==2) {
                          lcd.setCursor(0,0); lcd.print ("  TPS POMPAGE:  ");
                          lcd.setCursor(0,1); lcd.print ("                ");
                          lcd.setCursor(6,1); lcd.print(VarTpsPompage/1000); lcd.print("sec");
                      }
                      if (VarSelect==3) {
                          lcd.setCursor(0,0); lcd.print ("   Modif Hrs    ");
                          lcd.setCursor(0,1); lcd.print ("                ");
                          if (VarH >= 0 && VarH < 10) {lcd.write('0');}
                          lcd.setCursor(7,1); lcd.print ("<"); lcd.print (VarH); lcd.print (">");
                          VarTempo = millis();
                      }
                      if (VarSelect==4) {
                          lcd.setCursor(0,0); lcd.print ("   Modif Min    ");
                          lcd.setCursor(0,1); lcd.print ("                ");
                          if (VarM >= 0 && VarM < 10) {lcd.write('0');}
                          lcd.setCursor(7,1); lcd.print ("<"); lcd.print (VarM); lcd.print (">");
                          VarTempo = millis();
                      }
                      if (VarSelect==5) {
                          lcd.setCursor(0,0); lcd.print ("   Modif Sec    ");
                          lcd.setCursor(0,1); lcd.print ("                ");
                          if (VarS >= 0 && VarS < 10) {lcd.write('0');}
                          lcd.setCursor(7,1); lcd.print ("<"); lcd.print (VarS); lcd.print (">");
                          VarTempo = millis();
                      }
                      if (VarSelect==6) {
                          lcd.setCursor(0,0); lcd.print ("   confirmer    ");
                          lcd.setCursor(0,1); lcd.print ("    reste: "); lcd.print(5-((millis() - VarTempo)/1000));
                          if ((millis() - VarTempo)==0) {VarSelect = 0;}
                      }
                      if (VarSelect==7) { //activer si appuie sur Right && VarSelect = 0
                          lcd.clear();
                          lcd.setCursor(4,0);lcd.print("Test SD");
                          digitalWrite(35, HIGH);
                          //Myfile = SD.open("Data.csv", FILE_READ);
                          if (!SD.begin(53)) {
                          //if (Myfile) {
                              //lcd.setCursor(5,1); lcd.print("SD ok");
                              //Myfile.close();
                              lcd.setCursor(3,1); lcd.print("SD error!");
                          }
                          else {
                              //lcd.setCursor(3,1); lcd.print("SD error!");
                              lcd.setCursor(3,1); lcd.print("SD ok");
                          }
                      }
                  }
                  else {
                      // affichage écran princ DHT
                      lcd.setCursor(8,0); lcd.print(" T:");
                      lcd.setCursor(8,1); lcd.print(" H:");
                      int err = SimpleDHTErrSuccess;
                      if ((err = dht22.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
                          lcd.setCursor(9,0); lcd.print("T: Err#");
                          lcd.setCursor(9,1); lcd.print("H: Err#");
                          return;
                      }
                      lcd.setCursor(11,0); lcd.print((float)temperature);
                      lcd.setCursor(11,1); lcd.print((float)humidity);
                      digitalWrite(35, LOW);
                      VarSelect=0;
                  }
              }
        
              //Save SD T° et Hum
              //if (t.min==0 && t.sec==0){FuncSaveSD();}
              if (t.min==15 && t.sec==0){FuncSaveSD();}
              if (t.min==30 && t.sec==0){FuncSaveSD();}
              //if (t.min==45 && t.sec==0){FuncSaveSD();}
        
              //si contact sec déclenché - mémorisation cycle pompage + save SD
              if (digitalRead(38) == HIGH && VarRelaiActif == 0) {FuncPompage();} 
        
              //si marche forcée - mémorisation save SD
              if (digitalRead(37) == HIGH && VarRelaiActif == 0) {FuncPompageMFdeb();}
              if (digitalRead(37) == LOW && VarRelaiActif == 2) {FuncPompageMFend();}
              
              //LCD - gestion affichage
              lcd_key = read_LCD_buttons();         //Lire le bouton appuyé
              
              if (lcd_key == btnNONE) {             //Aucun bouton n'est appuyé
                  buttonReleased = true;            //Ce qui indique que le bouton a été relâché 
              } 
              else if (buttonReleased) {            //n'exécute le switch que si le bouton vient d'être appuyé 
                       buttonReleased = false;  // réinitialise la variable pour attendre le relâchement suivant
                      switch (lcd_key) {            //selon le bouton choisi
                             case btnSELECT:  {     //bouton select appuyé
                                  FuncbtnSelect();
                                  break;
                               }
                             case btnRIGHT: {       //bouton droite appuyé           
                                  FuncbtnRight();
                                  break;
                               }
                             case btnLEFT: {      //bouton gauche appuyé
                                  FuncbtnLeft();
                                  break;
                               }
                      }
              }
         }
        
        void FuncbtnSelect() {                      //bouton select appuyé
              switch (VarSelect) {
                      case 0: {    //Affichage pompage
                            VarTempo = millis();
                            VarSelect = 1;          //si ré appui sur select
                            break;
                      }
                      case 1: {    //Affiche Tps pompage
                            VarTempo = millis();
                            VarSelect = 2;
                            break;
                      }
                      case 2: {    //Affiche les Hrs
                            VarTempo = millis();
                            VarH = t.hour;
                            VarSelect = 3;
                            break;
                      }
                      case 3: {    //Affiche les Minut
                            VarTempo = millis();
                            VarM = t.min;
                            VarSelect = 4;
                            break;
                      }
                      case 4: {     //Affiche les Second
                            VarTempo = millis();
                            VarS = t.sec;
                            VarSelect = 5;
                            break;
                      }
                      
                      case 5: {
                            VarTempo = millis();
                            VarSelect = 6;
                            break;
                      }
                      case 6: {    //enregistrer les modifications H, M, S
                            t.hour=VarH; // données pour mettre à l'heure l'horloge
                            t.min=VarM;
                            t.sec=VarS;
                            DS3231_set(t); // mise à l'heure de l'horloge*/
                            lcd.setCursor(0,0); lcd.print ("   confirmer    ");
                            lcd.setCursor(0,1); lcd.print ("    save ok     ");
                            delay(1000);
                            VarSelect = 0;
                            break;
                      }
              }
        }
        
        void FuncbtnRight() {       // bouton droite appuyé
              switch (VarSelect) {
                     case 0: {      // test bon fonctionnement SD
                             VarTempo = millis();
                             VarSelect = 7;
                             break; 
                     }
                     
                     case 3: {     //si hrs à modifier
                             VarH = VarH + 1;
                             if (VarH < 0) {VarH = 23;}
                             if (VarH > 23) {VarH = 0;}
                             break;
                     }
                    case 4: {     //si Minut à modifier
                            VarM = VarM + 1;
                            if (VarM < 0) {VarM = 59;}
                            if (VarM > 59) {VarM = 0;}
                            break;
                    }
                    case 5: {     //si second à modifier
                            VarS = VarS + 1;
                            if (VarS < 0) {VarS = 59;}
                            if (VarS > 59) {VarS = 0;}
                            break;
                    }
              } 
        }
        
        void FuncbtnLeft() {       // bouton gauche appuyé
              switch (VarSelect) {
                      case 3: {    //si Hrs à modifier
                              VarH = VarH - 1;
                              if (VarH < 0) {VarH = 23;}
                              if (VarH > 23) {VarH = 0;}
                              break;
                      }
                      case 4: {   //si Minut à modifier
                              VarM = VarM - 1;
                              if (VarM < 0) {VarM = 59;}
                              if (VarM > 59) {VarM = 0;}
                              break;
                      }
                      case 5: {     //si Second à modifier
                              VarS = VarS - 1;
                              if (VarS < 0) {VarS = 59;}
                              if (VarS > 59) {VarS = 0;}
                              break;
                      }
              }
        }
        
        void FuncSaveSD() {
              digitalWrite(35, HIGH);
              Myfile = SD.open("Data.csv", FILE_WRITE);
              sprintf(stringa,"%02d/%02d/%d %02d:%02d:%02d", t.mday, t.mon, t.year, t.hour, t.min, t.sec);
              Myfile.print(stringa); Myfile.print(";");
              Myfile.print("Relev (Temp, Hum);");
              Myfile.print((float)temperature); Myfile.print(";");
              Myfile.print((float)humidity); Myfile.println(";");
              Myfile.close();
              delay(1000);
              digitalWrite(35, LOW);
         }
        
         void FuncPompage() {
              VarRelaiActif = 1;
              VarPompCalc++;
              Myfile = SD.open("Data.csv", FILE_WRITE);
              sprintf(stringa,"%02d/%02d/%02d %02d:%02d:%02d", t.mday, t.mon, t.year, t.hour, t.min, t.sec);
              Myfile.print(stringa); Myfile.print(";");
              Myfile.print("pompage (Nb/V3);");
              Myfile.print(VarPompCalc); Myfile.print(";");
              Myfile.print(VarPompCalc*(VarTpsPompage*3.05556/1000)); Myfile.println(";"); //11M3 / Hrs = 3,05556 / second
              Myfile.close();
              //active le relai durant un laps de temps
              digitalWrite(33, HIGH);
              VarGoRelai = millis();
         }
        
         void FuncPompageMFdeb() {
              VarRelaiActif = 2;
              Myfile = SD.open("Data.csv", FILE_WRITE);
              sprintf(stringa,"%02d/%02d/%02d %02d:%02d:%02d", t.mday, t.mon, t.year, t.hour, t.min, t.sec);
              Myfile.print(stringa); Myfile.print(";");
              Myfile.println("Debut pompage Marche Forcee;");
              Myfile.close();
              //active le relai durant un laps de temps
              digitalWrite(33, HIGH);
         }
        
          void FuncPompageMFend() {
              VarRelaiActif = 0;
              Myfile = SD.open("Data.csv", FILE_WRITE);
              sprintf(stringa,"%02d/%02d/%02d %02d:%02d:%02d", t.mday, t.mon, t.year, t.hour, t.min, t.sec);
              Myfile.print(stringa); Myfile.print(";");
              Myfile.println("Fin pompage Marche Forcee;");
              Myfile.close();
              //active le relai durant un laps de temps
              digitalWrite(33, LOW);
              //éteint la Led rouge de la MF
              VarLed =0; digitalWrite(39, LOW);
         }



        -
        Edité par OcinBzh 4 octobre 2018 à 18:59:12

        • Partager sur Facebook
        • Partager sur Twitter
          9 octobre 2018 à 21:38:38

          Bonsoir,

          pas d'idée? s'il vous plaît

          • Partager sur Facebook
          • Partager sur Twitter
            19 octobre 2018 à 21:46:33

            bon, tans pis

            j'avais pourtant pris en compte la demande de mise en ligne de tout mon code

            je cherche une autre solution

            cdlt

            • Partager sur Facebook
            • Partager sur Twitter
              20 octobre 2018 à 19:36:06

              Bonjour OcinBzh,

              Sans code, il est clair que l'on ne pouvait rien faire.

              Une fois ton code posté, j'ai bien regardé celui-ci mais je n'ai rien vu d'anormal, donc malheureusement aucune réponse à te proposer.

              Il semble que cela soit aussi le cas pour les autres membres.

              Du coup, chose assez rare ici, personne n'a de solution à te proposer.

              • Partager sur Facebook
              • Partager sur Twitter
                1 novembre 2018 à 1:44:58

                tant pis merci pour ton retour

                bonne continuation

                • Partager sur Facebook
                • Partager sur Twitter

                Tester présence carte SD

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown