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
}
}