Voici le code (en pièce jointe) pour un capteur de température à 1 CTN, avec affichage de la température commandée à l'aide d'un bouton poussoir (automate). Le programme fonctionne bien, cependant j'aimerai que l'affichage du temps soit remis à zéro, lors du premier appuie sur le bouton poussoir.
// Etat en cours de l’automate
int etat;
// Etat à mémoriser
int oldEtat;
// Les états possibles de l'automate
const int WAIT = 2;
const int START = 1;
const int STOP = 0;
// Définition des entrées numériques utilisées du microcontrôleur
const int BP = 3; // Broche 3 utilisée pour le bouton poussoir
// Définition des entrées analogiques utilisées du microcontrôleur
const int Ur = A1; // Entrée analogique A1 utilisée pour la tension de sortie Ur du pont diviseur - Elle se nomme maintenant : "Ur"
// BOUCLE D'INITIALISATION : exécutée une seule fois
void setup()
{
oldEtat = LOW;
etat = WAIT;
pinMode(BP, INPUT); // "BP" est une broche d'entrée
Serial.begin(19200); // ouvre le port série et fixe le debit de communication à 19200 bauds (nombre de symboles transmissibles par seconde)
Serial.print("t"); // Affichage dans le Monieur série, valeur du temps
Serial.print("\t"); // Ajout d'un espace
Serial.println("T1"); //Affichage dans le Moniteur Série, valeur de la température T1
Serial.print("s"); // Affichage dans le Monieur série, unité de t
Serial.print("\t"); // Ajout d'un espace
Serial.println("°C"); //Affichage dans le Moniteur Série, unité de T1
}
// BOUCLE PRINCIPALE : exécutée à l'infini
void loop()
{
int etatBP = digitalRead(BP); // Lecture de l'état du bouton poussoir
if(oldEtat == LOW && etatBP == HIGH){ // Gestion des états
if(etat == WAIT)
{
etat = START;
}
else if (etat == STOP)
{
etat = START;
}
else if (etat == START)
{
etat = STOP;
}
}
// Traitement des états
if (etat == START){
int valeur = analogRead(Ur); // Lecture de la valeur numérique (comprise en 0 et 1023) en sortie du CAN relié à la broche analogique "Ur" et stockage du résultat dans "valeur"
float tension = (valeur / 1024.0) * 5.0; // Conversion de la valeur numérique en tension : la valeur numérique comprise entre 0 et 1023 correspond à une tension comprise entre 0 et 5V
float temperature = (tension - 1.32)/0.0363; // Relation déterminer à partir de l'étalonnage du thermomètre numérique
float t = millis()/1000; // t, valeur du temps en s
Serial.print(t); // Envoi de la valeur temps
Serial.print("\t"); // Ajout d'un espace
Serial.println(temperature); // Envoir de la valeur T1 puis retour à la ligne
delay(1000);
}
oldEtat = etatBP;
}
// FONCTION D'INITIALISATION : exécutée une seule fois
Il suffit que tu mémorises la valeur de millis() quand tu passes de l'état WAIT à START
void loop()
{
static unsigned long millisDebut;
int etatBP = digitalRead(BP); // Lecture de l'état du bouton poussoir
if(oldEtat == LOW && etatBP == HIGH){ // Gestion des états
if(etat == WAIT)
{
etat = START;
millisDebut=millis();
}
else if (etat == STOP)
{
etat = START;
}
else if (etat == START)
{
etat = STOP;
}
}
// Traitement des états
if (etat == START){
int valeur = analogRead(Ur); // Lecture de la valeur numérique (comprise en 0 et 1023) en sortie du CAN relié à la broche analogique "Ur" et stockage du résultat dans "valeur"
float tension = (valeur / 1024.0) * 5.0; // Conversion de la valeur numérique en tension : la valeur numérique comprise entre 0 et 1023 correspond à une tension comprise entre 0 et 5V
float temperature = (tension - 1.32)/0.0363; // Relation déterminer à partir de l'étalonnage du thermomètre numérique
float t = (millis()-millisDebut)/1000.0; // t, valeur du temps en s
Serial.print(t); // Envoi de la valeur temps
Serial.print("\t"); // Ajout d'un espace
Serial.println(temperature); // Envoir de la valeur T1 puis retour à la ligne
delay(1000);
}
oldEtat = etatBP;
}