Bonjour
J'utilise une Uno avec 1024 octets d'EEPROM, dans laquelle je souhaite enregistrer l'instant de la mesure en secondes sur 2 octets et la valeur de la température sur un octect. Je définis une structure TetM en conséquence Préalablement au stockage des données j'efface le contenu précédent avec une série de 0, ou de 1 (j'alterne à chaque compilation). Si je ne déconnecte pas l'alim de la carte, ça marche bien. Mais si je la déconnecte de l'alimentation, j'ai une partie de la mémoire qui contient des données erronées, ou qui contient les 0 ou 1 mis pour l'effacement. Si, une fois qu'une lecture correcte à été faite sans déconnexion, je me déconnecte ensuite, une nouvelle lecture donne les valeurs attendues.
Le code pour l'écriture
#include <LiquidCrystal.h> // Inclusion de la librairie LiquidCrystal pour l'afficheur LCD
#include <EEPROM.h> // Inclusion de la librairie EEPROM pour stocker les données de mesure du capteur de température en mémoire EEPROM (non volatile) d'Arduino
// Déclaration des constantes de broches
const int broche1 = 0; // cablage de la broche 1 du moteur pas à pas sur l'entrée/sortie numérique 0 d'arduino
const int broche2 = 1; // cablage de la broche 2 du moteur pas à pas sur l'entrée/sortie numérique 1 d'arduino. L'utilisation des ces 2 broches (Rx, TX) interdit l'usage de la liaison série
const int broche3 = 2; // cablage de la broche 3 du moteur pas à pas sur l'entrée/sortie numérique 2 d'arduino
const int broche4 = 3; // cablage de la broche 4 du moteur pas à pas sur l'entrée/sortie numérique 3 d'arduino
const byte DB4 = 4; // cablage de l'entrée DB4 de l'afficheur LCD sur l'entrée/sortie numérique 4 d'Arduino
const byte DB5 = 5; // cablage de l'entrée DB5 de l'afficheur LCD sur l'entrée/sortie numérique 5 d'Arduino
const byte DB6 = 6; // cablage de l'entrée DB6 de l'afficheur LCD sur l'entrée/sortie numérique 6 d'Arduino
const byte DB7 = 7; // cablage de l'entrée DB7 de l'afficheur LCD sur l'entrée/sortie numérique 7 d'Arduino
const byte RS = 8; // cablage de l'entrée RS de l'afficheur LCD sur l'entrée/sortie numérique 8 d'Arduino
const byte E = 9; // cablage de l'entrée E de l'afficheur LCD sur l'entrée/sortie numérique 9 d'Arduino
const byte brocheThermoF = 2; // cablage de la sortie analogique du capteur de température du four sur l'entrée analogique A2 d'Arduino
// --- Déclaration des objets ---
LiquidCrystal lcd(RS, E, DB4, DB5, DB6, DB7); // Création de l'objet lcd avec initialisation de l'afficheur en mode 4 bits conformément au cablage du shield
void setup()
{
int x = 0;
Serial.begin(9600); // initialise connexion série à 9600 bauds. Connexion nécessaire pour la mise à l'heure du RTC et l'interface graphique Processing
while ( x < EEPROM.length()) {
EEPROM.put(x, 0); // écriture de la structure en mémoire EEPROM à l'adresse eeAddress
x++;
}
}
void loop()
{
float tempFour; // température du four en °C
long tpsMesure; // instant en millisecondes où l'on fait la mesure de temperature
struct TetM { // structure d'une ensemble de données non homogènes appelée TetM comprenant
unsigned int temps; // l'instant en secondes de la mesure de température. On doit pouvoir faire 12 h de mesures soit 43200 secondes
byte mesure; // la mesure de température du four
} varTetM; // définit une variable de type TetM appelée varTetM
static int eeAddress = 0; // adresse ou l'on va écrire dans la mémoire EEPROM, initialisée à 0 qu'=au 1er appel de la fonction
tempFour = (float)analogRead(brocheThermoF)*500/1023; // lecture de valeur retournée par le thermomètre du four et conversion d'échelle: [0; 1023] en [0; 500°C]
tpsMesure = millis(); // on relève le nombre de secondes écoulées depuis le début du programme, et c'est l'instant de la mesure
Serial.print(tpsMesure);Serial.print("\t");Serial.print(eeAddress/3);Serial.print("\t");Serial.println((int)tempFour);
while (eeAddress > EEPROM.length()-2) { // si capacité de l'EEPROM -2 dépassée (le -2 est là pour tenir compte de la taille de la structure à écrite dans la mémoire)
lcd.clear();
lcd.print("EEPROM pleine");
delay(1000);
lcd.noDisplay(); // clignotement du message (1 s allumé, 0.5 s éteint)
delay(500);
lcd.display();
}
varTetM = {tpsMesure/1000, (int)tempFour}; // remplissage de la structure varTetM par l'instant de la mesure en secondes et la température du four en °C entiers
EEPROM.put(eeAddress, varTetM); // écriture de la structure en mémoire EEPROM à l'adresse eeAddress
eeAddress+= 3;
}
Le code pour la lecture
#include <EEPROM.h> // Inclusion de la librairie EEPROM où sont stocké les données de mesure du capteur de température
void setup() {
Serial.begin(9600); // initialisation de la liaison série
}
void loop()
{
// Déclarations des variables locales
struct TetM { // structure d'une ensemble de données non homogènes appelée TetM comprenant
unsigned int temps; // l'instant en secondes de la mesure de température
byte mesure; // la mesure de température du four
} varTetM; // définit une variable de type TetM appelée varTetM
int eeAddress = 0; // adresse ou l'on va lire dans la mémoire EEPROM
while(eeAddress <= EEPROM.length()-2) { // Tant que l'on n'est pas sur la dernière adresse de l'EEPROM -2 (le -2 est necessaire car il faut pouvoir mémoriser toutes la structure qui occupe 3 octects)
EEPROM.get(eeAddress, varTetM); // Lecture de l'EEPROM à l'adresse eeAdress s'une structure de type TetM nomée varTetM
Serial.print(eeAddress/3);Serial.print("\t");Serial.print(varTetM.temps);Serial.print("\t");Serial.println(varTetM.mesure); // Ecriture dans le terminal série pour être copié ensuite sous Excel avec un control C
eeAddress +=3; // on passe à l'adresse de la structure suivante, soit un pas de 3 (1 int = 2 octects et 1 byte = 1 octect)
}
while(1); // on arrête le bouclage de loop()
}
Merci d'avance de votre aide