Bonjour messieurs,
J'avais une question concernant la fonction millis().
En effet, pour un projet de sciences de l'ingénieur en Terminale S, je programme actuellement un arduino qui fera office d'anémomètre, avec une girouette (avec un potentiomètre, je ferais donc une mesure analogique), et un ILS (l'arduino comptera les impulsions de l'ILS pour calculer la vitesse du vent).
Concernant la mesure de vitesse, autrement dit le comptage des impulsions, j'utilise la fonction millis, et pour mesurer les impulsions sur 10 secondes (par exemple) j'affecte la valeur de millis à une variable, puis j'utilise une fonction while qui compte tant que la différence entre millis() et ma variable est inférieure à 10 000.
Jusque là, je maitrise, cependant, concernant la remise à zéro de la fonction millis(), j'ai vu sur le site francophone arduino qu'une fois la capacité de la variable (unsigned long) dépassée, la variable revient à zéro, ce qui a lieu au bout d'environ 50 jours.
Le problème, c'est qu'en suivant ce raisonnement, si la fonction millis()revient à zéro en plein milieu de ma mesure (en admettant que j'ai fait tourner le programme pendant 50 jours), ma fonction while fera donc la mesure pendant 50 jours du coup, en attendant que la valeur de millis() revienne à la valeur de la variable à laquelle elle est comparée.
J'aimerais savoir si par hasard il était possible de remettre à zéro la fonction millis() en cours de programme (alors qu'au début elle se lance avec le programme), afin de proposer une solution qui soit automatisée sur le long terme, sans avoir besoin de redémarrer le programme tous les 49 jours pour ne pas avoir de problèmes.
Je joins le code de mon programme, mais il n'est pas très commenté, voilà pourquoi j'ai expliqué précédemment sa fonction.
Je vous remercie de votre patience, et vous souhaite une bonne journée.
const int entree_impulsion = 2; //on initialise le pin de mesure des impulsions
int etat_ILS = 0; //on mesurera l'état du contacteur
int last_etat_ILS = 0; //pour garder en mémoire l'ancien état du contacteur
unsigned int compteur = 0;
float vitesse_vent = 0;
unsigned long chrono = 0;
void setup()
{
pinMode(entree_impulsion, INPUT); //on met le pin entree impulsion en lecture
Serial.begin(9600); //initialiser la communication serie
}
void loop()
{
compteur = 0; //on réinitialise le compteur
chrono = millis(); //on affecte millis() à notre variable chrono
Serial.println(compteur); //affichage d'un 0 pour signaler le début de la mesure sur le moniteur série
while (millis() - chrono < 10000) //mesurer 10 secondes
{
etat_ILS = digitalRead(entree_impulsion); //lecture de l'état de l'ILS
if (etat_ILS != last_etat_ILS) //en cas de changement de l'état de l'ILS
{
compteur++; // on incrémente le compteur
last_etat_ILS = etat_ILS;
}
}
vitesse_vent = compteur / 20; //calcul du nombre de tour par seconde de l'hélice
vitesse_vent = vitesse_vent * 3.87; //coefficient pour calculer la vitesse en km/h
Serial.println(vitesse_vent); //affichage de la vitesse
delay(5000); //pause entre les mesures
}