Bonjour, j'ai un problème avec l’écran LCD qui affiche des touches d'un clavier matriciel et ensuite je souhaite enregistrer la valeur des touches appuyées sur une carte SD. Alors quand je teste l'ensemble ça plante, j'ai vérifier mon câblage en exécutant bout par bout du code et ça fonctionne.
Mais c'est plutot l'ensemble qui ne fonctionne pas.
Voici mon code:
#include <SPI.h>
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD
#include <Keypad.h> // inclusion de la librairie pour clavier matriciel
#include <SD.h>
File dataFile;
int chipSelect = 4;//SD CARD
// --- Déclaration des constantes utiles ---
//--- Constantes utilisées avec le clavier matriciel 4x4
const byte LIGNES = 4; // 4 lignes
const byte COLONNES = 4; // 4 colonnes
// --- Déclaration des constantes des broches E/S numériques ---
const uint8_t C4=2; // Constante pour la broche 2
const uint8_t C3=3; // Constante pour la broche 3
const uint8_t C2=6; // Constante pour la broche 6
const uint8_t C1=5; // Constante pour la broche 5
const uint8_t RS=7; // Constante pour la broche 8
const uint8_t E=13; // Constante pour la broche 9
const uint8_t D4=A3; // Constante pour la broche 10
const uint8_t D5=A2; // Constante pour la broche 11
const uint8_t D6=A1; // Constante pour la broche 12
const uint8_t D7=A0; // Constante pour la broche 13
const uint8_t L4=11; // Constante pour la broche 11
const uint8_t L3=12; // Constante pour la broche 10
const uint8_t L2=9; // Constante pour la broche 9
const uint8_t L1=8; // Constante pour la broche 8
// --- Déclaration des constantes des broches analogiques ---
// --- Déclaration des variables globales ---
//--- Définition des touches
char touches[LIGNES][COLONNES] = { // tableau de char à 2 dimensions
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// tableaux de lignes et colonnes
byte BrochesLignes[LIGNES] = {5,6,3,2};//connexions utilisées pour les broches de colonnes du clavier
byte BrochesColonnes[COLONNES] = {8,9,13,11};//connexions utilisées pour les broches de lignes du clavier
volatile char touche; // variable de stockage valeur touche appuyée
// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
//------------ Création d'un objet afficheur LCD alphanumérique ----
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits
// création d'un objet keypad = initialisation clavier
Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );
// les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé
// les broches de colonnes sont automatiquement configurées en SORTIE
// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme
void setup() { // debut de la fonction setup()
// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---
// ------- Initialisation fonctionnalités utilisées -------
// Initialisation de l'afficheur LCD
lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes
delay(10); // pause rapide pour laisser temps initialisation
// Test de l'afficheur LCD
lcd.setCursor(0,1); // se positionne en colonne,ligne
lcd.print("LCD OK"); // affiche texte
delay (1000); //pause
lcd.clear(); // efface LCD
delay(10);
lcd.blink(); // active clignotement
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
}
// Créer un nouveau fichier, on les numérote successivement
char affichage(void){
touche = clavier.getKey(); // lecture de la touche appuyée
if ((touche != NO_KEY)){ // si une touche a été frappée -- gestion de la touche appuyée
if (touche=='#'){
lcd.clear();
}
else {
lcd.print(touche); // efface écran si appui # sinon affiche touche
}
delay(300); // pause entre 2 appuis
Serial.println(touche);
} // fin gestion de la touche appuyée
return(touche);
}
void carte(){
char filename[13] = "LOGGER00.txt";
dataFile = SD.open(filename, FILE_WRITE);
if(filename){
for (int i =0; i < 2; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
// === Stocker les mesures en fichier logger
dataFile.println(affichage());
dataFile.close();
// print to the serial port too:
// Serial.println(touche);
}
}
}
void loop(){
affichage();
carte();
}