J-M-L:
le système à modéliser: un buzzer + un afficheur + un capteur
-
Le buzzer sonne 1s toutes les 3 secondes. il est donc indépendant du capteur, il faut juste relancer un son d'une seconde toutes les 3 secondes
-
l'écran dépend du temps qui passe (pour afficher "l'heure") et du capteur
on a donc deux machines à états (deux systèmes), on peut appliquer l'approche du tuto:
const byte pinBuzzer = 12;
unsigned long tempsBuzzer;
enum : byte {AFFICHE_HEURE, AFFICHE_VALEUR} etatEcran = AFFICHE_HEURE;
unsigned long tempsAfficheur;
const byte pinCapteur = 2; // avec pullup -> LOW veut dire activé
void gererBuzzer()
{
if (millis() - tempsBuzzer >= 3000) {
tone(pinBuzzer, 100, 1000); // buzz à 100Hz pendant une seconde et s'arrête tout seul
tempsBuzzer = millis();
}
}
void afficheHeure(bool forcerAffichage = false)
{
if (forcerAffichage || (millis() - tempsAfficheur >= 1000)) {
// plus d'une seconde a passé
Serial.print(F("Temps: "));
Serial.println(millis() / 1000); // on affiche des secondes qui défilent
tempsAfficheur = millis();
}
}
void afficheValeur(bool forcerAffichage = false)
{
if (forcerAffichage || (millis() - tempsAfficheur >= 1000)) {
// plus d'une seconde a passé
Serial.print(F("Valeur: "));
Serial.println(random(0, 100)); // on affiche une valeur aléatoire
tempsAfficheur = millis();
}
}
void gererEcran()
{
switch (etatEcran) {
case AFFICHE_HEURE:
// on affichait l'heure. on teste si le capteur est actionné
if (digitalRead(pinCapteur) == LOW) { // si oui on bascule sur l'affichage de valeur
afficheValeur(true); // true -> on force l'affichage immédiat
etatEcran = AFFICHE_VALEUR;
delay(15); // anti-rebond du pauvre
} else {
afficheHeure(); // on laisse l'affichage se faire toutes les secondes, on ne force pas le raffraichissment
}
break;
case AFFICHE_VALEUR:
// on affichait l'heure. on teste si le capteur est relâché
if (digitalRead(pinCapteur) == HIGH) { // si oui on rebascule sur l'heure
afficheHeure(true); // true -> on force l'affichage immédiat
etatEcran = AFFICHE_HEURE;
delay(15); // anti-rebond du pauvre
} else {
afficheValeur(); // on laisse l'affichage se faire toutes les secondes, on ne force pas le raffraichissment
}
break;
}
}
void setup() {
Serial.begin(115200);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinCapteur, INPUT_PULLUP);
tone(pinBuzzer, 100, 1000); // buzz à 100Hz pendant une seconde et s'arrête tout seul
}
void loop() {
gererBuzzer();
gererEcran();
}
Et si par exemple on devait changer la valeur du temp du graphique que renvoie la led avec un potentiomètre , on ferait
valeur=analogread(pinpotentiomètre);
percent=map(sensorvalue,0,1023,0,100);
et après ?