Bonjour,
J'utilise une carte Arduino Uno comme petite console d'acquisition.
J'ai créé une fonction pour paramétrer l'acquisition : période d'échantillonnage, durée d'acquisition.
Dans ma boucle principale loop, je lance une mesure lorsque le temps courant (avec millis()) dépasse le temps précédent (qui a été incrémenté de la période d'échantillonnage lors de la mesure précédente).
Globalement, cela fonctionne pas si mal mais j'ai parfois quelques erreurs : même temps affiché deux fois consécutivement, écart entre deux mesures un peu supérieur à la valeur de la période d'échantillonnage.
Je viens vers pour améliorer mon code et essayer d'être plus précis (ou rigoureux) sur la fréquence des mesures
Mon code :
// Déclaration des variables du programme
unsigned long fluxSerie = 250000; // flux de la liaison série
// Variables d'acquisition
int tempsEchant ; // période d'échantillonnage en ms, saisi par l'utilisateur
int dureeAcquisition ; // durée totale de l'acquisition en s, saisie par l'utilisateur
unsigned long tempsZero;
unsigned long tempsCourant;
int topDepart = 0; //variable pour lancer l'acquisition
String envoi;
unsigned long tempsPrec;
// Broches de branchement au circuit
byte mesureTension = 0; //broche analogique de mesure de la tension aux bornes de C
byte capteur = 3; //broche pour décharger initialement le condensateur
void setup() {
Serial.begin(fluxSerie);
tempsPrec = millis();
tempsZero = millis();
envoi = "0";
//configure la broche commandePin en tant que sortie
pinMode(capteur, OUTPUT) ;
}
// Boucle principale
void loop()
{
tempsCourant = millis() - tempsZero;
if ( topDepart == 0)
{
reglages();
}
else
{
if (tempsCourant <= dureeAcquisition)
{
if (tempsCourant >= tempsPrec)
lecture();
}
}
}
void reglages()
{
while (topDepart == 0)
{
envoi = Serial.readString();
Serial.print("Saisir la période d'échantillonnage (en ms) : ");
while (Serial.available() == 0 );
{
tempsEchant = Serial.parseInt(); //on enregistre la valeur saisie dans tempsEchant
Serial.println(tempsEchant);
delay(100); //délai de temporisation
}
Serial.print("Saisir la durée d'acquisition (en ms) : ");
while (Serial.available() == 0 );
{
dureeAcquisition = Serial.parseInt(); //on enregistre la valeur saisie dans dureeAcquisition
Serial.println(dureeAcquisition);
delay(100); //délai de temporisation
}
Serial.println("Saisir S pour lancer l'acquisition : ");
while (Serial.available() == 0 );
{
topDepart = 1;
tempsPrec = 0;
tempsZero = millis();
}
}
}
void lecture()
{
float tension;
// Lecture et conversion des données
tension = analogRead(mesureTension) * 5.0 / 1024; // mesure analogique et conversion en tension
// Envoie les données
Serial.print(tempsCourant / 1000.0, 3); // donne la date en seconde
Serial.print('\t');
Serial.println(tension, 2); // donne la valeur recalculée de tension aux bornes de C
tempsPrec += tempsEchant;
}
Merci pour votre aide