je suis débutant dans le codage et j'aimerais faire un system pour actionner une pompe de relevage dans un puits.
J'ai un flotteur, un bouton un relai et bien sur une carte arduino.
J’aimerais que le flotteur en mode haut ouvre le relai pour actionner la pompe ainsi qu'une LED bleu, tant que le flotteur est haut le relai est ouvert, puis des qu'il passe en bas je voudrais le laisser ouvert encore 2 minutes puis couper le relai éteindre la LED bleu et allume une LED verte
J'ai essayer de coder mais je bute sur un problème qui est le suivant ; lorsque le flotteur passe en haut le relai ouvre mais déclenche tt de suite la tempo alors que je voudrais qu'elle ce déclenche lorsque le flotteur passe en bas.
int FLOTTEUR = 4;
int RELAIS =2;
int BLEU =9;
int VERT =11;
// Déclaration des variables
int memoireBp = LOW; //Mémoire du bouton poussoir
int etatBp = LOW; //Etat actuel du PB
int etatRelais = LOW; //Etat du relais
int etatVERT = HIGH; //Etat de la led Verte
int etatBLEU = LOW; //Etat de la led Bleue
// État d'activation de la temporisation
int tempoActive = 0;
// Temps à l'activation de la temporisation
unsigned long tempoDepart = 0;
void setup() {
// On initialise les entrées/sorties
pinMode(FLOTTEUR, INPUT);
pinMode(BLEU,OUTPUT);
pinMode(VERT,OUTPUT);
pinMode(RELAIS, OUTPUT);
digitalWrite(RELAIS, etatRelais); // On écrit l'état du relais
digitalWrite(VERT, etatVERT); //On écrit l'état du la led Verte
digitalWrite(BLEU, etatBLEU); //On écrit l'état du la led Bleue
}
void loop() {
// Récupération de l'état actuel du Flotteur
etatBp = digitalRead(FLOTTEUR);
//Si l'état est différent de la mémoire et qu'il est à HIGH
if(etatBp != memoireBp && etatBp == HIGH) {
delay(500);
//Si relais est LOW
if(etatRelais == LOW) {
//On demande à le passer à HIGH
etatRelais = HIGH;
etatVERT = LOW;
etatBLEU = HIGH;
// Et on lance la temporisation
tempoActive = 1;
tempoDepart = millis();
// Sinon
} else {
//On demande à le passer à LOW
etatRelais = LOW;
etatVERT = HIGH;
etatBLEU = LOW;
//Et on annule la temporisation
tempoActive = 0;
}
//On écrit l'état du relais
digitalWrite(RELAIS, etatRelais);
digitalWrite(VERT, etatVERT);
digitalWrite(BLEU, etatBLEU);
}
// Si la temporisation est active,
if ( tempoActive==1 ) {
// Et si il s'est écoulé 3 secondes,
if ( ( millis() - tempoDepart ) >= 5000 ) { //1000 et egal a 1 seconde
//On demande à passer le relais à LOW apres la temporisation
etatRelais = LOW;
etatVERT = HIGH;
etatBLEU = LOW;
//On écrit l'état du relais
digitalWrite(RELAIS, etatRelais);
digitalWrite(VERT, etatVERT);
digitalWrite(BLEU, etatBLEU);
// Et on désactive la temporisation puisque l'action a été faite
tempoActive = 0;
}
}
//On conserve l'état du bouton
memoireBp = etatBp;
Salut SilverLeo
Tu peux utiliser un while qui reste dans la boucle jusqu'à que le flotteur est en haut.
Quand le flotteur est en bas le code sort du while et tu peux mettre une pause (delay ou autre) de 2 mn et après arrêter la pompe.
Serait utile de prevoir un bouton d'émergence qui arrêterait la pompe en cas de danger.
Ce bouton arrêtera la boucle while et/ou sortir de la pause de 2 mn.
comme dis je suis débutant et j'ai bidouillé en me servant d'un code trouvé dans les topics...
Le flotteur est branché en parallèle avec un bouton poussoir en passant par une résistance de 10 k hom sur le GND quand au relai je ne saurais pas vous dire.
J'aimerais que la pompe ce déclenche quand le flotteur est haut et qu'elle tourne 2 min après que le niveau du flotteur soit passé en bas...j'aimerais aussi pouvoir lancé ce même délai de 2 min manuellement en appuyant sur un bouton poussoir
Je ne comprend pas les concept pas le concept du while, pourriez vous me faire un exemple que je pourrais intégrer a mon code ?
j'aimerais aussi pouvoir lancé ce même délai de 2 min manuellement en appuyant sur un bouton poussoir
tu peux utiliser un bouton en parallèle (ou en série!!!!)avec le contact du flotteur.
Comme a demandé hbachetti un petit schéma ne fera mal à personne!!
pour le while:
if (digitalRead(FLOTTEUR) == HIGH) {
etatRelais = HIGH;
etatVERT = LOW;
etatBLEU = HIGH;
digitalWrite(RELAIS, etatRelais);
digitalWrite(VERT, etatVERT);
digitalWrite(BLEU, etatBLEU);
while (digitalRead(FLOTTEUR) == HIGH) {//il reste dans cette boucle jusqu'à que digitalRead(FLOTTEUR) == HIGH
//ici bouton emergence?
}
tempoDepart = millis();
if (tempoDepart + 20000 < millis()) {
//ici bouton emergence?
//tu peux mettre ici un petit code pour faire clignoter la led bleu
// pour avertir que le 2mn sont lancé.
}
etatRelais = LOW;
etatVERT = HIGH;
etatBLEU = LOW;
digitalWrite(RELAIS, etatRelais);
digitalWrite(VERT, etatVERT);
digitalWrite(BLEU, etatBLEU);
}
j'ai utilisé ton code pour le while mais je n'ai pas réussi a mettre en pratique la fonction millis, je pense que j'ai du merder au niveau de la déclaration...le relai coupait immédiatement lorsque le programme sortait du while.
j'ai donc changer le code pour y mettre un delay, pensé vous que ca peu fonctionner ou est ce que ca peu engendrer un bug a la longue ?
Et je suis preneur pour un code pour faire clignoter la LED bleu pendant le delai
Pardon 2mn c'est 120000 millis!! et pas 20000 (20sec) et il faut un > au lieu de <
Essaye comme ça:
if ((tempoDepart + 120000UL) > millis()) {
//ici bouton émergence?
//tu peux mettre ici un petit code pour faire clignoter la led bleu
// pour avertir que les 2mn sont lancés.
}
Et je suis preneur pour un code pour faire clignoter la LED bleu pendant le delai
tempoDepart = millis() + 120000UL;
while (tempoDepart > millis()) {
//ici bouton émergence?
//tu peux mettre ici un petit code pour faire clignoter la led bleu
// pour avertir que les 2mn sont lancés.
}