//****************************************************************************************** // Temporisateur pour insoleuse // Code original sur: // www.amazing-vacuum-tubes.com/pages/ca-c-est-fait/deux-minuteries-universelles.html // Code modifié par F6IDT V 3.0 // - Uniquement décomptage des secondes // - Modification de la mise en mémoire du temps // - A la fin, affichage StoP et 4 bips // - Divers ajustements // // Mode d'emploi: // A la mise sous tension, l'afficheur indique la durée mémorisée en secondes. // En appuyant sur le bouton, le décomptage démarre. Arrivé à zéro, affichage StoP et // émission de quatre bips sonores. Le programme ne peut redémarrer qu'après avoir // débranché et rebranché l'insoleuse (ou avoir placé un bouton poussoir entre RST // et la masse). // Pour modifier le temps, il suffit de tourner le bouton dans un sens ou dans l'autre // et ensuite d'appuyer dessus pour mettre en mémoire et démarrer le décomptage. // Si au cours du décomptage, on désire arrêter celui-ci, il faut faire un appui long // sur le bouton (au moins une seconde). // Pendant le décomptage, le codeur est inactif. // Pour régler au mieux la précision, il faut utiliser un chronomètre et ajuster // la valeur numérique à la ligne 108. //****************************************************************************************** byte bouton = 6; // Validation par appui sur le bouton du codeur. byte codeur_dwn = 7; // Décrémentation menu sens descente. byte codeur_up = 8; // Incrémentation menu sens montée. byte relais = 12; // Sortie pour le relais bobine 5V. byte buzzer = 13; // Sortie pour le buzzer électo-mécanique 5 V. #include // Gestion de l'afficheur. #include // Réservation d'espace dans l'EEPROM. #define CLK 2 // Synchro horloge de l'afficheur. #define DIO 3 // Données de l'afficheur. const uint8_t SEG_StoP[] = { SEG_A | SEG_D | SEG_C | SEG_F | SEG_G, // S SEG_D | SEG_E | SEG_F | SEG_G, // t SEG_C | SEG_D | SEG_E | SEG_G, // o SEG_A | SEG_B | SEG_E | SEG_F | SEG_G // P }; TM1637Display display(CLK, DIO); // Raccordement ded l'afficheur. int n = 0; // Variable de boucle du beep. int sec; // Variables secondes. bool clkState = LOW; // Etat impulsion encodeur. bool clkLast = HIGH; // Etat dernière impulsion encodeur. bool swState = LOW; // Etat interpulse encodeur. bool swLast = LOW; // Etat dernière interpulse encodeur. //************************************************************************ void setup() { // Direction et attribution des pins. pinMode(codeur_dwn, INPUT); pinMode(codeur_up, INPUT); pinMode(bouton, INPUT); pinMode(buzzer, OUTPUT); pinMode(relais, OUTPUT); display.setBrightness(5); // Réglage luminosité sur l'afficheur. EEPROM.get(05,sec); // Adresse des secondes mémorisées dans l'EEprom. display.showNumberDec(sec); // Affichage du temps enregistré. if (digitalRead(bouton)==HIGH) { // Si le temps enregistré convient, on appui sur le bouton, sec = sec + 1; // on ajoute 1 seconde. decompt(); // et on passe au décomptage, sinon on tourne le bouton. } } //******************************************************************** void loop() // Modification du temps { clkState = digitalRead(codeur_dwn); // Suivant sens de rotation. if ((clkLast == LOW) && (clkState == HIGH)) { if (digitalRead(codeur_up) == HIGH) { sec--; // Décrémentation des secondes. if (sec < 0) // Pour éviter les chiffres négatifs. { sec = 0; } } else { sec++; // Incrémentation des secondes. } display.showNumberDec(sec); // Affichage des secondes delay(50); } clkLast = clkState; // Mémorisation de l'ancienne position du codeur. if (digitalRead(bouton)==HIGH) // Quand le temps a été choisi, on appuie sur le bouton. { EEPROM.put(05, sec); // le temps est mémorisé dans l'EEprom, digitalWrite (relais, HIGH); // on actionne le relais, sec = sec + 1; // on ajoute 1 seconde decompt(); // et on passe au décomptage. } } //***************************************************************** void decompt() // Sous-programme de décomptage { sec--; display.showNumberDec(sec); // Affichage des secondes restantes. delay (982); // VALEUR A AJUSTER suivant dérive. if (digitalRead(bouton)==HIGH) // Si on appuie sur le bouton pour arrêter le décomptage, { display.showNumberDec(0); // il y a mise à zéro de l'afficheur beep(); // et on passe à l'arrêt } if ((sec)== 1) // Si on arrive à la fin du décomptage, { beep(); // on passe à l'arrêt, } decompt(); // sinon on continue à décompter. } //***************************************************************** void beep() // Tonalité de fin. { display.setSegments(SEG_StoP); // Affiche "StoP". digitalWrite (relais, LOW); // Coupure du relais for (int n=0; n <= 3; n++) // et quatre tonalités. { digitalWrite (buzzer, HIGH); delay (500); digitalWrite (buzzer, LOW); delay (500); } while(1); // Suspension du programme jusqu'à RESET // ou coupure alimentation. }