MTobjets: Exemple 2
Gestion par événements pour UNO, Nano, Mega
Trois pompes
Problème posé
Vu sur un forum:
Nous avons:
- 3 pompes
- 1 bouton poussoir nommé "depart"
- 1 bouton marche/arrêt
Quand on appuie le bouton nommé depart les pompes s'activent l'une après l’autre pendant un certain temps mais quand on appuie plus
de 5 secondes sur depart les 3 pompes s’activent ensembles pendant un certain temps.
Une solution
Globalement on peut résoudre le problème avec 5 temporisateurs:

Il manque des détails sur ce schéma, mais globalement un appui sur le bouton depart met en marche la pompe 1. Au bout de la première temporisation, c'est la pompe 2 qui se met en route (on arrête la pompe 1), et tout à la fin on fait un arrêt de la pompe 3.
En même temps, on déclenche un deuxième temporisateur de 5s. Si celui-ci arrive à la fin de son comptage de temps, il active les trois pompes. Non représenté, il doit aussi désactiver les trois temporisateurs de la ligne du haut. Un dernier temporisateur arrête les 3 pompes.
Programme complet recommandé
Ce programme se fait complètement sous interruption, et libère loop qui peut être utilisé pour faire autre chose.
// Nous avons: // - 3 pompes // - 1 bouton poussoir nommé "depart" // - 1 bouton marche/arrêt // Quand on appuie le bouton nommé depart les pompes s'activent l'une après // l’autre pendant un certain temps mais quand on appuie plus de 5 secondes // sur depart les 3 pompes s’activent ensembles pendant un certain temps. // depart─┬─┤ Pompe1 ├──┤ Pompe2 ├──┤ Pompe3 │ // │ // └─┤ CinqSecondes ├──┤ 3Pompes │ /////////////////////////// Bibliothèque utilisée ///////////////////////// #include <MTobjects.h> // V1.0.2 Voir http://arduino.dansetrad.fr/MTobjects /////////////////////////// Constantes du programme ///////////////////////// const unsigned long TEMPS_POMPE_1 = 5ul*60*1000 milli_secondes; // La pompe 1 fonctionnera seule pendant 5 minutes const unsigned long TEMPS_POMPE_2 = 5ul*60*1000 milli_secondes; // La pompe 2 fonctionnera seule pendant 5 minutes const unsigned long TEMPS_POMPE_3 = 5ul*60*1000 milli_secondes; // La pompe 3 fonctionnera seule pendant 5 minutes const unsigned long TEMPS_3_POMPES = 10ul*60*1000 milli_secondes; // Les 3 pompes fonctionneront ensembles pendant 10 minutes const unsigned long TEMPS_ATTENTE_POUR_3_POMPES = 5000 milli_secondes; // Il faut appuyer 5s pour faire fonctionner les trois pompes /////////////////////////// Broches utilisées /////////////////////////////// const uint8_t PIN_BOUTON_DEPART = A0; // Bouton câblé entre GND et A0 const uint8_t PIN_BOUTON_MARCHE_ARRET = A1; // Bouton câblé entre GND et A1 const uint8_t PIN_POMPE_1 = 2; // Un HIGH sur la broche 2 met en marche la pompe N°1 const uint8_t PIN_POMPE_2 = 3; // Un HIGH sur la broche 3 met en marche la pompe N°2 const uint8_t PIN_POMPE_3 = 4; // Un HIGH sur la broche 4 met en marche la pompe N°3 const uint8_t PIN_MARCHE = 5; // Informe si on est "sous tension" /////////////////////////// Permettre à la pompe 3 de tourner un certain temps void arretPompe3(void) { digitalWrite(PIN_POMPE_3, LOW); // Arrêt de la pompe 3 } MTclock TemporisateurPompe3(TEMPS_POMPE_3, arretPompe3, 1 action_et_arret, MT_OFF); /////////////////////////// Permettre à la pompe 2 de tourner un certain temps void arretPompe2(void) { digitalWrite(PIN_POMPE_3, HIGH); // Mise en marche de la pompe 3 digitalWrite(PIN_POMPE_2, LOW); // Arrêt de la pompe 2 TemporisateurPompe3.start(); // Déclenche le temporisateur suivant } MTclock TemporisateurPompe2(TEMPS_POMPE_2, arretPompe2, 1 action_et_arret, MT_OFF); /////////////////////////// Permettre à la pompe 1 de tourner un certain temps void arretPompe1(void) { digitalWrite(PIN_POMPE_2, HIGH); // Mise en marche de la pompe 2 digitalWrite(PIN_POMPE_1, LOW); // Arrêt de la pompe 1 TemporisateurPompe2.start(); // Déclenche le temporisateur suivant } MTclock TemporisateurPompe1(TEMPS_POMPE_1, arretPompe1, 1 action_et_arret, MT_OFF); /////////////////////////// Permettre aux 3 pompes de tourner un certain temps void arret3Pompes(void) { digitalWrite(PIN_POMPE_1, LOW); // Arrêt des pompes digitalWrite(PIN_POMPE_2, LOW); digitalWrite(PIN_POMPE_3, LOW); } MTclock Temporisateur3Pompes(TEMPS_3_POMPES, arret3Pompes, 1 action_et_arret, MT_OFF); /////////////////////////// C'est un appui long void troisPompes(void) { digitalWrite(PIN_POMPE_1, HIGH); // Mise en marche des pompes digitalWrite(PIN_POMPE_2, HIGH); digitalWrite(PIN_POMPE_3, HIGH); TemporisateurPompe1.stop(); // Arrêter les temporisateurs du cycle une pompe à la fois TemporisateurPompe2.stop(); TemporisateurPompe3.stop(); Temporisateur3Pompes.start(); // Déclenche le temporisateur suivant } MTclock TemporisateurCinqSecondes(TEMPS_ATTENTE_POUR_3_POMPES, troisPompes, 1 action_et_arret, MT_OFF); /////////////////////////// Bouton marche/arrêt ///////////////////////////// void marche(void) { digitalWrite(PIN_MARCHE, HIGH); // Allumer le voyant Marche/arrêt } void arretComplet(void) { TemporisateurPompe1.stop(); // Arrêter les temporisateurs TemporisateurPompe2.stop(); TemporisateurPompe3.stop(); Temporisateur3Pompes.stop(); digitalWrite(PIN_POMPE_1, LOW); // Arrêt des pompes digitalWrite(PIN_POMPE_2, LOW); digitalWrite(PIN_POMPE_3, LOW); digitalWrite(PIN_MARCHE, LOW); // Eteindre le voyant Marche/arrêt } MTcheckButton BoutonMarcheArret(PIN_BOUTON_MARCHE_ARRET, marche, arretComplet); /////////////////////////// Bouton départ /////////////////////////////////// void departCourt(void) { if (BoutonMarcheArret.getSelect()) // Si on est en mode marche { TemporisateurPompe1.start(); // Démarrer le cycle TemporisateurPompe2.stop(); // Arrêter les autres temporisateurs des pompes TemporisateurPompe3.stop(); Temporisateur3Pompes.stop(); TemporisateurCinqSecondes.start(); // Pour voir un appui long digitalWrite(PIN_POMPE_2, LOW); // Arrêt des pompes 2 et 3 digitalWrite(PIN_POMPE_3, LOW); digitalWrite(PIN_POMPE_1, HIGH); // Marche de la première pompe... } } void relachement(void) { TemporisateurCinqSecondes.stop(); // Pas d'appui long } MTbutton BoutonDepart(PIN_BOUTON_DEPART, departCourt, relachement); /////////////////////////// Setup et loop /////////////////////////////////// void setup() { pinMode(PIN_POMPE_1, OUTPUT); // Sorties pour les pompes pinMode(PIN_POMPE_2, OUTPUT); pinMode(PIN_POMPE_3, OUTPUT); pinMode(PIN_MARCHE, OUTPUT); // Led de contrôle } void loop(){} // Pour y mettre un autre programme indépendant