Bonjour à tous,
Je souhaite mettre en mémoire toutes les 5 secondes les valeurs tension présentes sur une pin d'entrée (A5) dans l'EEPROM. puis pouvoir les relires.
je me suis inspiré du programme suivant : datalloger
mon programme est le suivant :
/*
* Datalogger de tension sur borne entrée analogique.
*/
#include <EEPROM.h>
/* Broche du capteur analogique + declaration des variables */
const int monCapteur = A5;
int valeurLue;
float tension;
/* Constantes pour le mode lecture */
const String HELP_CMD = "HELP";
const String READ_CMD = "READ";
const String LOG_CMD = "LOG";
const String ERASE_CMD = "ZERO";
const unsigned long READ_CMD_TIMEOUT = 10000;
/* Constante pour le datalogging */
const unsigned long DELAY_BETWEEN_SAMPLE = 5000; // Enregistrement de la valeur mesurée toutes les 5 secondes
/* Buffer temporaire pour les données */
const unsigned int MAX_NB_SAMPLES = 256;
struct DataBuffer {
unsigned int nb_samples;
float samples[MAX_NB_SAMPLES];
};
DataBuffer data = { 0, { 0 } };
/** Terminal de commande */
void command() {
/* Attends l'ordre de passage en mode lecture */
Serial.setTimeout(READ_CMD_TIMEOUT);
bool exit = false;
while (!exit) {
/* Lit la commande */
Serial.print(F("CMD> "));
String cmd = Serial.readStringUntil('\n');
Serial.println(cmd);
/* Interpréte la commande */
if (cmd == HELP_CMD) {
/* Menu aide */
Serial.println(F("-- COMMAND LIST --"));
Serial.println(F("HELP Display this help"));
Serial.println(F("READ Read back data from memory"));
Serial.println(F("LOG Starting logging data at last index"));
Serial.println(F("ZERO Reset index and data values"));
} else if (cmd == READ_CMD) {
/* Affiche les données en mémoire */
if (data.nb_samples) {
Serial.println(F("N° ECHANTILON; Tension; "));
for (unsigned int index = 0; index < data.nb_samples; ++index) {
Serial.print(index);
Serial.print(F("; "));
Serial.println(data.samples[index]); // on lit la structure mais pas la mémoire, pourquoi les valeurs alors restent-elles si coupure de l'alimentation ? rep : ds le setup EEPROM.get
}
} else {
Serial.println(F("No data in memory."));
}
} else if (cmd == LOG_CMD) {
/* Sortie du mode terminal */
exit = true;
} else if (cmd == ERASE_CMD) {
/* Vidage de la mémoire */
Serial.print(F("ERASING ... "));
data.nb_samples = 0; // Pourquoi ne pas mettre aussi data.samples aussi à zero ?
EEPROM.put(0, data); //Ecriture de la structure à l'adresse 0
Serial.println(F("Memory erased."));
} else {
/* Commande inconnue */
Serial.println(F("ERROR (Bad command)"));
}
}
}
/** Fonction setup() */
void setup() {
/* Initialise le port série */
Serial.begin(9600);
/* Load previous memory data */
EEPROM.get(0, data); // charge l'adresse 0 dans la structure data, ce qui permet la lecture "CMD affiche les données en mémoire"
}
/** Fonction loop() */
void loop() {
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
/* Mesure toutes les N millisecondes */
if (currentMillis - previousMillis >= DELAY_BETWEEN_SAMPLE)
{
previousMillis = currentMillis;
/* Arret en cas de fin de mémoire */
if (data.nb_samples == MAX_NB_SAMPLES) {
/* Empéche la surécriture des données */
Serial.println(F("LOGGING STOPPED (Out of memory)"));
for (;;);
}
/* Mesure la tension */
valeurLue = analogRead(monCapteur); // lit l'entrée analogique A5
tension = map(valeurLue, 0, 1023, 0, 5000); //conversion de la valeur lue en tension en mV
tension = tension / 1000; //conversion des mV en V
data.samples[data.nb_samples] = tension;
/* Debug */
Serial.print(F("ECHANTILLON "));
Serial.print(data.nb_samples);
Serial.print(F(": "));
Serial.println(data.samples[data.nb_samples]);
/* Sauvegarde */
data.nb_samples += 1; // on rajoute +1 à nb_samples
EEPROM.put(0, data); //Ecriture de la structure à l'adresse 0
}
/* Active le mode commande si l'utilisateur passe le caractère '
Cela fonctionne assez bien mais j'ai quelques soucis et des questions sur son fonctionnement :
- Lorsque j'efface la mémoire, je commence bien à l’adresse (data.nb_samples). par contre si je fait un reset de la carte arduino je commence tjs à 30. (même si je n'ai enregistré que 5 valeurs).
Avez vous une idée du pourquoi ?
- Dans ce paragraphe
/* Vidage de la mémoire */
Serial.print(F("ERASING ... "));
data.nb_samples = 0;
EEPROM.put(0, data); //Ecriture de la structure à l'adresse 0
Serial.println(F("Memory erased."));
Pourquoi ne pas mettre aussi data.samples aussi à zero ?
Comment toutes les valeurs tiennent à l'adresse 0 ? je pensais que chaque valeur étaient écrite dans une adresse ? non ?
Merci pour vos réponses, comme je vous l'indiquais plus haut le programme fonctionne mais cela me permettra de me coucher moins bête ce soir !!
sur le port série */
if (Serial.available() && Serial.read() == '
Cela fonctionne assez bien mais j'ai quelques soucis et des questions sur son fonctionnement :
1) Lorsque j'efface la mémoire, je commence bien à l’adresse (data.nb_samples). par contre si je fait un reset de la carte arduino je commence tjs à 30. (même si je n'ai enregistré que 5 valeurs).
Avez vous une idée du pourquoi ?
2) Dans ce paragraphe
/* Vidage de la mémoire */
Serial.print(F("ERASING ... "));
data.nb_samples = 0;
EEPROM.put(0, data); //Ecriture de la structure à l'adresse 0
Serial.println(F("Memory erased."));
Pourquoi ne pas mettre aussi data.samples aussi à zero ?
Comment toutes les valeurs tiennent à l'adresse 0 ? je pensais que chaque valeur étaient écrite dans une adresse ? non ?
Merci pour vos réponses, comme je vous l'indiquais plus haut le programme fonctionne mais cela me permettra de me coucher moins bête ce soir !!
) {
command();
Serial.println(F("RESTART LOGGING ..."));
}
}
Cela fonctionne assez bien mais j'ai quelques soucis et des questions sur son fonctionnement :
- Lorsque j'efface la mémoire, je commence bien à l’adresse (data.nb_samples). par contre si je fait un reset de la carte arduino je commence tjs à 30. (même si je n'ai enregistré que 5 valeurs).
Avez vous une idée du pourquoi ?
- Dans ce paragraphe
/* Vidage de la mémoire */
Serial.print(F("ERASING ... "));
data.nb_samples = 0;
EEPROM.put(0, data); //Ecriture de la structure à l'adresse 0
Serial.println(F("Memory erased."));
Pourquoi ne pas mettre aussi data.samples aussi à zero ?
Comment toutes les valeurs tiennent à l'adresse 0 ? je pensais que chaque valeur étaient écrite dans une adresse ? non ?
Merci pour vos réponses, comme je vous l'indiquais plus haut le programme fonctionne mais cela me permettra de me coucher moins bête ce soir !!