Besoin de votre avis pour mon petit soucis

Bonjour à tous ! Je vous expose mon petit problème.

Je me suis lancer dans l’idée de faire avec un Arduino UNO avec un Shield ETHERNET, un programme qui me permet de capter la température , d’afficher celle - ci sur un écran LCD , de stocker cette donnée sur un carte SD.
Mais aussi grâce à un bouton poussoir , de faire afficher sur la deuxième ligne de l’écran LCD ( 16.2) un message “OK” si je n’appuie pas et “ERREUR” si j’appuie dessus. J’ai utiliser une interruption même si cela ne m’enchantais pas trop.

Pour le moment j’ai fait un programme pour chaque fonction , et elles sont opérationnel.

C’est au moment de les fusionner que là les problèmes arrivent.

Quand je fusionne le stockage + l’affichage + le capteur de température. Cela prend un peu de temps à démarré mais sa fonctionne , c’est au moment de mettre le bouton poussoir que ça pose problème.

L’écran n’affiche plus que OK et ERREUR , et je ne peux plus avoir accès à ma donnée de température sur l’écran .

Je vous met le code final , si jamais vous vouliez voir les autres codes séparément je peux vous les mettre aussi.

Je pense que le problème viens du fait que les programmes ce mélange , malgré le fait que j’ai essayé de bien séparé pour qu’il n’y est pas de conflit.
Mais aussi que l’arduino m’indique que 56% de la mémoire est prise , donc j’imagine que cela est du au ralentissement au démarrage.

Enfin j’ai l’impression que l’arduino au bout d’un certain temps reboot tous seul . ce qui est un petit peu embêtant.

J’ai essayé de faire en sorte que le programme soit lisible sur le forum.

#include <SPI.h>        //Librairie qui est utilisé par la carte SD
#include <SD.h>          // Librairie qui sert pour la gestion de la carte SD
#include <LiquidCrystal.h>




byte degrees[8] = {  // Création du signe dégré
  B00000,
  B01000,
  B10100,
  B01000,
  B00000,
  B00000,
  B00000,
  B00000,
};

LiquidCrystal lcd(9, 3, 5, 6, 7, 8);        // les broches utilisés par mon lcd
const int selectSD=4;        // port utilisé par mon shield Ethernet
const int SensorPin = A0;         // le port du capteur de température
int BP = 12;        // port pour le Bouton Poussoir


void setup(){
 
  
  lcd.begin(16, 2);          // mon écran est un 16 caractère sur 2 lignes
  lcd.clear();                    // j'efface l'ecran
  lcd.print("OK");           // j'affiche OK
  attachInterrupt(0, message, CHANGE);              // Interruption quand l'état sur l'int 0 change je fait apparaitre message
pinMode (BP,INPUT);          // mon bouton poussoir est en entré







  // initialise le caractère ° dans le LCD
  lcd.createChar( 0, degrees );
  
  // configuration des broches E/S
  pinMode(10, OUTPUT);      // Obligatoire d'après la librairie SD
  
  Serial.begin(115200);          // débit de mon Terminal Serie
  
  //--- initialisation de la carte SD
  Serial.println("Initialisation de la carte SD en cours...");
 
  if (!SD.begin(selectSD)) 
{             // si initialisation avec broche selectSD en tant que CS n'est pas réussie
    Serial.println("Echec initialisation!");                   // message port Série
    return;                    // sort de setup()
  } 
  
  //--- si initialisation réussie : on se place ici :
  Serial.println("Initialisation reussie !"); // message port Série
 
 




 //---- test existence fichier et suppression du fichier si il existe --- 
  char nomFichier[]="testphot.txt"; // je crée le nom du fichier (8.3)
 
  if (SD.exists(nomFichier)) {          // si le fichier existe 
  
    Serial.println("------"); 
    Serial.print("Le fichier existe : ");          // affiche message 
    SD.remove(nomFichier);              // efface le fichier
    Serial.println("Suppression du fichier.");       // affiche message 
    
  } // fin si fichier existe



  
  // création nouveau fichier  
  File dataFile=SD.open(nomFichier, FILE_WRITE);              // crée / ouvre un objet fichier et l'ouvre en mode écriture - NOM FICHIER en 8.3 ++++
 
  Serial.println("--- Acquisition en cours : veuillez patienter ---"); 
    
  if (dataFile){ // le fichier est True si créé
 
    for (int i=0; i<100; i++) {   
   
   int reading = analogRead(SensorPin); // je récupere la valeur de mon capteur
   
    float voltage = reading * 5.0;           // je la convertie
    voltage /= 1024.0;               // sachant que c'est du 10bit je convertie par 1024
    float temperatureC = (voltage - 0.5) * 100 ;           // et je fini pour avoir ma temperature
 
      dataFile.print(i+1);               // la valeur du numéro de ligne
      dataFile.print(";");                // ; de séparation 
      dataFile.print(millis());          // la valeur de millis()
      dataFile.print(";");               // ; de séparation 
      dataFile.println(temperatureC);           // affiche la valeur de la temperature precedement calculé
      delay(100);                            // pause en ms entre chaque mesure...    
   
 if ((i+1)%50) Serial.print("."); else Serial.println(".");  
    } // fin for 
 
      dataFile.close(); // fermeture du fichier obligatoire après accès 
 
  } // si fichier existe 
  else { // sinon = si probleme creation
    Serial.println("Probleme creation fichier"); 
  } // fin else



  
   // lecture du contenu du fichier  
  dataFile=SD.open(nomFichier, FILE_READ); 

 
  Serial.println("------"); 
  
  if (dataFile){                  // le fichier est True si créé
    Serial.println("Ouverture fichier OK"); 

  
    while (dataFile.available()) { 
  
      char c = dataFile.read();          // lit le caractère suivant
      Serial.print(c);                     // affiche le caractère courant
      
    } // fin while available
  
    dataFile.close(); // fermeture du fichier obligatoire après accès 
        
  } // si fichier existe 
  else { // sinon = si probleme creation
    Serial.println("Probleme creation fichier"); 
  } // fin else
  
  
} // fin setup 
 int lastTemp = -100;
 
 
 
 
 
 
 
 
//--- fonction loop exécutée en boucle infinie
void loop(){
 
 float temp = lectureTemp();
  
  // rafraichit le LCD que si la 
  // température a varié sensiblement
  if( abs(temp-lastTemp)<0.20 )
    return;
  lastTemp = temp;
  
  lcd.setCursor(0,0); // je me place en haut a gauche
  lcd.print ( "Salle 1: "); // je fait apparaitre le message 
  lcd.print( temp ); // suivis de la valeur temp
  lcd.write( byte(0 ));  // affiche le signe degré 
  lcd.print( "c" );

  delay(800);
  
}

float lectureTemp(){
 // Je lit la valeur sur la sortie du pin
 // Retourne une valeur entre 0->1024 pour 0->5v
 int valeur = analogRead(SensorPin);  

 // Converti la lecture en tension
 float tension = valeur * 5.0;
 tension /= 1024.0; 
 
 // Convertir la tension (mv) en temperature
 float temperatureC = ((tension * 1000) - 500) / 100;
 
 return temperatureC;
 
 
 
}
 
 void message()
{
  lcd.clear();
  lcd.setCursor(0, 1); // je me place en bas a gauche
  if (digitalRead(BP) == LOW)  // si le Bouton est à l'état Bas 
  {
    
  lcd.print("ERREUR"); // j'affiche ERREUR
  }
  else // sinon
  {
    lcd.print ("OK"); // j'affiche OK
  }
}

Salut,

const int selectSD=4;        // port utilisé par mon shield Ethernet

T' es sûre, parce que:

pinMode(10, OUTPUT);      // Obligatoire d'après la librairie SD

il me semble que ce serait :

const int selectSD=10;
pinMode(10,OUTPUT);

Qu’est ce qui est branché sur le pin 2 de l’arduino ?

weetox = > J'ai lu sur la librairie qu'il y avais deux possibilités selon ce qu'on utilisais pour la carte SD , mais il est possible que j'ai mélanger les deux informations , je vais modifié ceci mais j'imagine que je n'ai pas vraiment faux sachant que les données sont bien transférés sur ma carte SD.

bigben99 = > sur le pin 2 de mon arduino il y a la sortie du BP , sachant que l'int 0 est situé sur le broche 2 de l'arduino UNO.

Alors pourquoi as-tu int BP = 12; au début de ton programme ? Cela veut dire que lorsque tu lis l'état du BP dans ta routine d'interruption, tu vas lire l'état du pin 12 qui n'est pas celui du BP ?

J'ai une broche du bouton poussoir qui est sur le port 2 de l'arduino , pour l’interruption et une autre broche qui est sur le port 12. Après il est possible que j'ai fait une erreur de câblage de bouton poussoir ( il est vrai que j'ai jamais vraiment compris à 100% ) mais je pense avoir quelque chose de bon.

Quand appuis ça affiche bien OK et ERREUR , mais ça retire l'affichage de la température. Ou bien parfois les deux s'affiche correctement puis disparaissent .

J'ai surtout l'impression que ça bug au moment où l'arduino reboot tous seul , il n'y aurais pas un moyen d’empêcher cela ? Je remarque que ça reboot quand la led sur le pin 13 s'allume.

hum... peux-tu nous fournir un schéma de ton montage ? J'ai l'impression que ton BP n'est pas cablé correctement.

Ensuite, si tu regardes la documentation du shield Ethernet, tu verras qu'il utilise les pin 4, 10, 11, 12 et 13. Donc ça n'est pas une bonne idée d'utiliser le pin 12.

Si ton BP met en cours circuit ton pin 2 et 12, ça peut expliquer les reboots intempestifs.

Très bien le voici , désolé pour les quelques cafouilli sur le bas .

La résistance qui est sur le BP est brancher sur la masse

Edit : Je vais essayé de refaire un schéma , c'est vraiment moche.

D’après ton schéma, la résistance du BP est en l’air (donc branché sur rien). Donc ton BP au mieux ne fait un court-circuit que lorsqu’on appuie dessus, au pire fait un court circuit permanent entre ton pin 2 et ton pin 12…

Pourquoi veux-tu que ton BP soit sur 2 pins ?

Pour ça que je pensais à une erreur sur le BP , je n'ai jamais vraiment compris le câblage de cette bête qui n'est pas compliqué.

Donc il me suffit de retiré par exemple le pin 12 , et de mettre à la place une résistance qui va sur la masse ? ou sur le 5V ?

Il suffit de faire un minimum de recherche !!!

Vas sur le tuto d'eskimon, tu trouveras toutes les explications sur les BP.

Il est vrai que la technique de la diagonal ne mettais jamais venu à l'esprit , d'habitude j'utilisais un Ohmmètre pour savoir qu'elles étaient les broches qui étais reliés merci BigBen99

Du coup j'ai branché comme il faut , le BP fonctionne , mais j'observe toujours un reboot de l'arduino , chose qui m'embête un peu.

Je vais continué à chercher d'où peut bien venir ce soucis.

Pour la suite je vais essayé d’améliorer le programme en remplaçant la partie sauvegarde sur une carte SD , par une sauvegarde en temps réel , et pas seulement quand je lance le terminal Serie.

Et pour finir , faire une boucle à la place des interruptions , je vais essayé de mettre 2 interrupteurs , il va verifié l'état des deux constamment , et quand j’appuyais il me l'informera , c'est surement plus simple qu'une interruption.

Bonjour

void message()
{
  lcd.clear();
  lcd.setCursor(0, 1); // je me place en bas a gauche
...

Ton lcd.clear() efface ton ecran, c'est pour ça que tu n'as que OK ou ERREUR qui s'affiche. A+

Ça n'est pas normal que ton arduino reboot. Peux-tu refaire ton schéma avec tous les composants et les branchements tels qu'ils sont fait maintenant ?

Ensuite, pour la gestion des BP, les interruptions sont à mon avis la meilleure solution pour capter un événement extérieur aléatoire (l'appui sur un BP).

BigBen99 ==> Bien sur , le voici :

Mais les interruptions , je n’en dispose que de deux sur l’arduino , si par exemple je voudrais avoir 4 informations différentes sur une seul entré.
Que je simulerais avec 4 boutons poussoirs , j’ai essayé avec une boucle If , il reconnais bien les 4 boutons ( quand je dit que j’appuie sur un bouton il affiche L et si j’appuie sur aucun j’écrit H ) mais il ne distingue pas sur quel bouton j’appuie.

Caape ==> Je vais regarder ça merci .

Edit : Caape ==> je viens d’essayé , ce n’est pas ici mon problème , si je retire le lcd.Clean() , quand j’appuie sur le bouton , l’erreur apparais sur l’écran , mais quand je le retire , l’erreur ce mélange avec OK , donc incompréhensible. C’est pour ça que je l’avais ajouté.

Si vous voulez au départ quand je lance le programme , l’écran affiche OK en haut a gauche , puis une dizaine de seconde plus tard , la température apparais , et le OK redescend en bas a gauche , là tous fonctionne très bien , puis j’ai un reboot.

L'Arduino dispose de 2 interruptions "matérielles" mais peut gérer des "pin change interrupts" sur toutes ses pins. Des exemples d'utilisation ici: http://playground.arduino.cc/Main/PinChangeInterrupt http://www.geertlangereis.nl/Electronics/Pin_Change_Interrupts/PinChange_en.html

La résistance de ton BP n'est pas reliée au +5V ?

Sinon, je ne comprend pas comment tu peux avoir un reboot avec ton code.

Comment vois-tu que ton arduino reboot ?

Si la résistance est relié au +5V

Je vois le reboot car la led de l'arduino s'allume et la l’écran s'éteint et je dois de nouveau attendre quelque seconde que l'affichage revienne.

J'ai mis en commentaire la partie de sauvegarde des données sur une carte SD , là l'affichage reste il n'y a qu'au moment où je lance une interruption , que le message disparais au bout d'un moment.

J'imagine que c'est du au fait que le programme de stockage des données prenais trop de mémoire de l'arduino.

Du coup je vais voir comment je peux l'arranger

Bonjour à tous ! Je reviens aux nouvelles.

Alors comme je l'avais dit sur mon précédent message , j'ai refait mon programme d'écriture sur la carte SD.

Maintenant j'ai une écriture constante ( toutes les 10 minutes ) et pas seulement sur 100 fois comme je l'avais écrit.

Ensuite j'ai retiré la partie lecture qui ne me servais pas finalement.

Résultat : le programme fonctionne bien , j'ai bien l’acquisition des données sur la carte SD et dans le Terminal. Et il ne me semble plus avoir vu de reboot de l'arduino.

Mes boutons poussoirs font bien apparaitre les messages que je souhaites donc tout niquel.

Maintenant , dans l'optique de remplacer mes boutons poussoir par des contacts secs ( les boutons poussoirs me servais de test ) , Vous pensez que je peux en mettre combien pour les 2 interruptions de l'arduino ? Car j'ai testé seulement 3 boutons poussoir brancher sur une seul broche digital de l'arduino.

Je vais me pencher là dessus.

Dernière question qui me viens , j'imagine que pour avoir un système d'horloge pour l'acquisition qui m'indiques quand la données à été prise , je dois me fournir d'un module d'horloge de type RTC ?