Commande 3 pompes

Bonjour je cherche quelle qu'un qui pourrais me faire un schéma d'un montage avec
3 pompe(12V)
1 bouton poussoirs
1 bouton on/off
une batterie (12V)

Le but est que quand on appuie sur le bouton poussoir une fois un programme se lance et active les pompe l'une après l’autre avec une tempo et que quand on appuie plus longtemps que 5 secondes les 3 pompes s’activent pendant un certain temps.

Merci

Le schéma de montage C’est simplement la possibilité de commander les pompes (mosfet ou relais, diode de roue libre). Le bouton est connecté simplement entre une broche et GND (en INPUT_PULLUP)

Le challenge c’est plus dans le code…

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Tiens, cette phrase me rappelle quelque chose!

On peut aussi utiliser la programmation avec des temporisateurs.

Bonjour chef22

Une séquence des 3 pompes doit-elle obligatoirement aller jusqu'au bout ou, pendant la séquence, si l'on réappuie brièvement sur le bouton, la séquence s'arrête ou repart au début?

Cordialement
jpbbricole

Bonjour chef22

Voilà un schéma :


Les relais sont des 12 Volts
image

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
image

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

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.