Bonjour chef22
Voilà un schéma :
Les
relais sont des 12 Volts
Le tout est alimenté en 12V.
Sur la lancée, j’ai fait un petit bout de programme pour faire fonctionner tout ça :
Il nécessite la bibliothèque OneButton,h
Les paramètres sont gérés par :
pompeDef pompe[] =
{
// Tempo Pin de commande
{2000, 5},
{3000, 6},
{4000, 7}
};
La première colonne règle le temps fonctionnement de la pompe en millisecondes, le 2ème est le port de commande du relais.
L’état qui fait tirer le relais est réglé par :
const int relaisOnEtat = LOW; // Etat pour faire tirer le relais
Le bouton de commande est défini par :
const int btnCommandePin = 3
La fonction longue pression (5 sec.) est réglée par :
const unsigned int btnCmdLpTime = 5000; // Temps du long time press
Le temps de fonctionnement de toutes les pompes par:
unsigned long pompeToutesTempo = 4000; // Chrono de toutes les pompes
Le programme peut s’essayer sans relais et pompes, il suffit d’un bouton sur btnCommandePin
contre GND. Tout le déroulement du programme se fait dans le moniteur de l’IDE Arduino à 115200.
06:01:00:163 -> Commande de 3 pompes
Pompes toutes OFF
Fin sequence
06:01:04:589 -> BtnCmdClick
Demarrage sequence
Pompes toutes OFF
Pompe 1
06:01:06:596 -> Pompes toutes OFF
Pompe 2
06:01:09:578 -> Pompes toutes OFF
Pompe 3
06:01:13:576 -> Pompes toutes OFF
Fin sequence
06:01:21:931 -> BtnCmdLongPress
Pompes toutes ON
06:01:25:930 -> Pompes toutes OFF
Fin sequence
Le programme:
/*
Name: ARDFR_Commande3pompes.ino
Created: 26.05.2023
Author: jpbbricole
https://forum.arduino.cc/t/commande-3-pompes/1130545/4
*/
#include <OneButton.h> // https://github.com/mathertel/OneButton
//------------------------------------- Pompes (pompe)
enum pompesIndex {pompe1, pompe2, pompe3, pompesOff};
String pompeLabel[] = {"Pompe 1", "Pompe 2", "Pompe 3"};
int pompeEnCours = pompesOff; // Pompe en utilisation
struct pompeDef
{
unsigned long tempo; // Durée de fonctionnement
const int relaisPin; // Commande relais
};
pompeDef pompe[] =
{
// Tempo Pin de commande
{8000, 5},
{10000, 6},
{15000, 7}
};
const int pompeNombre = sizeof(pompe) / sizeof(pompe[0]);
unsigned long pompeOnTempo = 0; // Temps de fonctionnement de la pompe en cours
unsigned long pompeOnMillis = 0; // Chrono de la pompe en cours 0 si pas de pompe ON
unsigned long pompeToutesTempo = 20000; // Chrono de toutes les pompes
const int relaisOnEtat = LOW; // Etat pour faire tirer le relais
//------------------------------------- Boutons (btn)
const int btnCommandePin = 3;
OneButton btnCmd(btnCommandePin, true); // True = actif LOW (PULLUP)
const unsigned int btnCmdLpTime = 5000; // Temps du long time press
void setup()
{
Serial.begin(115200);
for (int p = 0; p < pompeNombre; p ++) // Initialisation des commandes de pompe
{
pinMode(pompe[p].relaisPin, OUTPUT);
digitalWrite(pompe[p].relaisPin, !relaisOnEtat); // Faire tomber le relais
}
btnCmd.setPressMs(btnCmdLpTime);
btnCmd.attachLongPressStart(btnCmdLongPress);
btnCmd.attachClick(btnCmdClick);
Serial.println(F("Commande de 3 pompes"));
pompeSelection(pompesOff);
}
void loop()
{
btnCmd.tick();
if (pompeOnMillis != 0 && (millis() - pompeOnMillis >= pompeOnTempo))
{
pompeEnCours ++; // On passe à la pompe suivante
pompeSelection(pompeEnCours);
}
}
void pompeSelection(int pompeNum)
{
pompeEnCours = pompeNum;
if ((pompeNum >= 0) && (pompeNum < pompeNombre)) // Si numéro de ponpe valide
{
pompeOnTempo = pompe[pompeNum].tempo;
pompeOnMillis = millis(); // Démarrage du chrono
pompesToutes(!relaisOnEtat);
digitalWrite(pompe[pompeNum].relaisPin, relaisOnEtat); // Faire tirer le relais
Serial.print(pompeLabel[pompeNum] + " ");
Serial.print(pompe[pompeNum].tempo);
Serial.println(F(" Millisecondes"));
}
else
{
pompeOnMillis = 0; // Arrêt du chrono
pompesToutes(!relaisOnEtat);
Serial.println(F("Fin sequence"));
}
}
void pompesToutes(int pompeEtat)
{
Serial.print(F("Pompes toutes "));
Serial.println((pompeEtat == relaisOnEtat) ? F("ON") : F("OFF"));
for (int p = 0; p < pompeNombre; p ++) // Arrêter toutes les pompes
{
digitalWrite(pompe[p].relaisPin, pompeEtat); // Faire tomber le relais
}
}
//------------------------------------- Bouton commande click
void btnCmdClick()
{
Serial.println(F("BtnCmdClick"));
if (pompeEnCours == pompesOff) // Si pas de séquence en cours
{
Serial.println(F("Demarrage sequence"));
pompeSelection(pompe1);
}
}
//------------------------------------- Bouton commande pression longue
void btnCmdLongPress()
{
Serial.println(F("BtnCmdLongPress"));
pompesToutes(relaisOnEtat);
pompeEnCours = pompeNombre -1;
pompeOnTempo = pompeToutesTempo;
pompeOnMillis = millis(); // Démarrage du chrono
}
Le PDF du schéma:
ARDFR_Commander3pompes Schéma.pdf (87.5 KB)
Cordialement
jpbbricole