Bonjour Je suis débutant en la matière et je découvre ce passionnant tuto d’Eskimon et Olyte. Je bloque sur la modification du programme du compteur de 0 à 100 en se servant de la boucle millis à la place de delay pour gérer un bouton par la suite. (Page 81 du PDF). Le compteur ne fonctionne pas comme je l’attends. L’afficheur des unités s’allume seul et fait 9 fois des boucles de 0 à 9 puis il s’éteint et c’est l’afficheur des dizaines qui s’allume à son tour pour afficher de 0 à 9 puis s’éteint pour laisser l’afficheur des unités reprendre son tour et ainsi de suite. Je ne comprends pas ce qui cloche dans mon code. Merci de bien vouloir m’aider. voici le code:
// définition des broches du décodeur 7 segments // (vous pouvez changer les numéros si vous voulez) const int bit_A = 2; const int bit_B = 3; const int bit_C = 4; const int bit_D = 5;
// définitions des broches des transistors pour chaque afficheur const int alim_dizaine = 6; // les dizaines const int alim_unite = 7; // les unites bool afficheur = false ; // variable pour le choix de l’afficheur long temps;
void setup() { // Les broches sont toutes des sorties pinMode(bit_A, OUTPUT); pinMode(bit_B, OUTPUT); pinMode(bit_C, OUTPUT); pinMode(bit_D, OUTPUT); pinMode(alim_dizaine, OUTPUT); pinMode(alim_unite, OUTPUT);
1 2 3 4 5 6 7 | // Les broches sont toutes mises à l'état bas digitalWrite(bit_A, LOW); digitalWrite(bit_B, LOW); digitalWrite(bit_C, LOW); digitalWrite(bit_D, LOW); digitalWrite(alim_dizaine, LOW); digitalWrite(alim_unite, LOW); |
}
void loop() // fonction principale
{
// boucle qui permet de compter de 0 à 99 (= 100 valeurs)
for(char i = 0; i<99; i++)
{
// appel de la fonction affichage avec envoi du nombre à afficher
afficher_nombre(i, afficheur);
1 | } |
// gestion du rafraichissement // si ça fait plus de 10 ms qu’on affiche, // on change de 7 segments (alternance unité <-> dizaine)
1 2 3 4 5 6 7 8 9 | if((millis() - temps) > 10) { // on inverse la valeur de "afficheur" // pour changer d'afficheur (unité ou dizaine) afficheur = !afficheur; // on affiche la valeur sur l'afficheur // afficheur : true->dizaines, false->unités temps = millis(); // on met à jour le temps } |
}
1 | // ici, on peut traiter les évènements (bouton...) |
// fonction permettant d’afficher un nombre
// elle affiche soit les dizaines soit les unités
void afficher_nombre(char nombre, bool afficheur){
delay(100);
char unite = 0, dizaine = 0;
if(nombre > 9)
dizaine = nombre / 10; // on recupere les dizaines
unite = nombre - (dizaine*10); // on recupere les unités
// si "
if(afficheur)
{
// on affiche les dizaines
digitalWrite(alim_unite, LOW);
digitalWrite(alim_dizaine, HIGH);
afficher(dizaine);
}
1 2 3 4 5 6 7 | else // égal à : else if(!afficheur) { // on affiche les unités digitalWrite(alim_dizaine, LOW); digitalWrite(alim_unite, HIGH); afficher(unite); } |
} // fonction écrivant sur un seul afficheur // on utilise le même principe que vu plus haut void afficher(char chiffre) { digitalWrite(bit_A, LOW); digitalWrite(bit_B, LOW); digitalWrite(bit_C, LOW); digitalWrite(bit_D, LOW);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | if(chiffre >= 8) { digitalWrite(bit_D, HIGH); chiffre = chiffre - 8; } if(chiffre >= 4) { digitalWrite(bit_C, HIGH); chiffre = chiffre - 4; } if(chiffre >= 2) { digitalWrite(bit_B, HIGH); chiffre = chiffre - 2; } if(chiffre >= 1) { digitalWrite(bit_A, HIGH); chiffre = chiffre - 1; } |
}