LOCODUINO
Parlons Arduino => Vos projets => Discussion démarrée par: jojolito le avril 04, 2019, 07:17:29 am
-
Bonjour
Voilà j'ai un projet visant à commander 2 relais à l'aide d'un capteur ultrason HC-SR04, dans le cadre d'un projet aquaponique ,les deux relais en question serviront à alimenter de pompes a eau j'ai déjà essayé d'écrire quelques lignes de code mais je n'obtiens pas le résultat voulu .. Car je sais pas si je dois utiliser la fonction "if" ou "else if" ou même les deux ,j'aimerais avoir votre aide pour écrire la base du code
Voilà grossièrement ce que je voudrais faire exprimer sans code :
x= 10cm
y=5cm
Si la hauteur est plus petit que (< ) que x
Le Relais 1 s'allume
Le Relais 2 reste éteint
Si la hauteur est = X
Le Relais 1 s'eteint
Le Relais 2 reste éteint
Temporisation de 3 secondes
Si la hauteur est plus grande (>) que Y
Le Relais 1 reste éteint
Le relais 2 s'allume
Si la hauteur est = Y
Le Relais 1 reste éteint
Le Relais 2 s'éteint
Temporisation de 3 secondes
Voilà grossièrement les ordres à executer mais je n'arrive pas à convertir ça en ligne de code
J'avais fait un premier essai mais ça a ete un echec :
Voilà les lignes de code du raté
Code: [Select]
void loop() {
niveau_culture = culture.distanceInMillimeters() / 10;
Serial.print("hautteur: ");
Serial.println(hautteur);
Serial.println("");
delay(250);
if (hauteur != x) {
digitalWrite(relais 2, LOW);
digitalWrite(relais 1, HIGH);
}
if (hauteur>=x) {
digitalWrite(relais 2, HIGH);
digitalWrite(relais 1, HIGH);
//Serial.println("marre_haute");
}
delay(3000);
if (hauteur !=y) {
digitalWrite(relais 1, LOW);
digitalWrite(relais 2, HIGH);
}
if (hauteur <= y) {
digitalWrite(relais 1, HIGH);
digitalWrite(relais 2, HIGH);
// Serial.println("marre_basse");
}
delay(3000);
Voilà avec Céline de code dès que la hauteur atteint la valeur X Le Relais 1 éteins la hauteur diminue et dès qu'elle devient au-dessOUS de la valeur X le relais 1 se rallume, et tout ça se fait de façon interminable
Est-ce que je dois pas utiliser une boucle fort genre " while " ???
J'ai aussi un doute sur l'utilisation de la fonction "delay" , est-ce que je dois utiliser Delaymillisecondes plutot ???
Voilà merci de votre lecture aidez-moi s'il vous plaît
-
Ni l’une ni l’autre.
Lisez ceci : http://www.locoduino.org/spip.php?article25
Modélisez votre problème avec un automate et implémentez le
-
Bonjour j'ai suivi votre conseil ça m'a permis de réécrire le code tout en inspirant du lien mais ça ne fonctionne toujours pas
Voilà le code ré écrit
#include <hcsr04.h> //Bifrost HCSR04 Library
const int TRIG_CULTURE_PIN = 28;
const int ECHO_CULTURE_PIN = 29;
const int POMPE_CULTURE = 19; // pompe depart d’eau sur relai
const int POMPE_AQUA = 9; // pompe arrive d’eau sur relai
HCSR04 niveau (TRIG_CULTURE_PIN, ECHO_CULTURE_PIN, 20, 4000);
enum { bac_tempo2, maree_basse, bac_se_remplie, maree_haute, bac_tempo, bac_se_vide };
int niveau_culture;
const float bacVide = 32;
const float bacRemplie = 20;
void setup() {
Serial.begin(115200);
pinMode(POMPE_AQUA, OUTPUT); // pompe arrive d’eau
// pinMode(POMPE_AQUA, HIGH);
pinMode(POMPE_CULTURE, OUTPUT); // pompe depart d’eau
//pinMode(POMPE_CULTURE, HIGH);
}
void loop() {
niveau_culture = niveau.distanceInMillimeters() / 10;
Serial.print("niveau_culture: ");
Serial.println(niveau_culture);
Serial.println("");
delay(250);
byte etatBac = bac_tempo2;
switch (etatBac)
{
case bac_tempo2 :
if (niveau_culture == bacVide) {
digitalWrite(POMPE_CULTURE, HIGH);
digitalWrite(POMPE_AQUA, HIGH);
delay(3000);
etatBac = maree_basse;
}
// else if (niveau_culture > bacVide ) {
// digitalWrite(POMPE_CULTURE, LOW);
//digitalWrite(POMPE_AQUA, HIGH);
//etatBac = bac_se_vide;
//}
break;
case maree_basse :
if (niveau_culture == bacVide) {
digitalWrite(POMPE_AQUA, LOW);
// digitalWrite(POMPE_CULTURE, HIGH);
etatBac = bac_se_remplie;
}
break;
case bac_se_remplie :
if (niveau_culture != bacRemplie) {
digitalWrite(POMPE_AQUA, LOW);
//digitalWrite(POMPE_CULTURE, HIGH);
etatBac = maree_haute;
}
break;
case maree_haute :
if (niveau_culture == bacRemplie) {
digitalWrite(POMPE_AQUA, HIGH);
etatBac = bac_tempo;
}
break;
case bac_tempo :
digitalWrite(POMPE_CULTURE, HIGH);
digitalWrite(POMPE_AQUA, HIGH);
delay(3000);
etatBac = bac_se_vide;
break;
case bac_se_vide :
if (niveau_culture != bacVide) {
digitalWrite(POMPE_CULTURE, LOW);
digitalWrite(POMPE_AQUA, HIGH);
etatBac = bac_tempo2;
}
break;
}
}
-
Tout d'abord si l'état de votre automate est dans un variable déclarée localement mais pas static. Par conséquent votre état est toujours bac_tempo2 à chaque exécution de loop.
Vous avez des fautes de conception un peu partout. Vous devriez vous interroger sur le sens de ce que vous avez écrit dans le code.
Exemple :
case bac_tempo2 :
if (niveau_culture == bacVide) {
niveau_culture étant la distance à la surface de l'eau en mm, quelle probabilité pour qu'elle soit exactement égale à bacVide au moment où elle est lue ?
Réfléchissez au sens physique que vous donnez à chaque condition permettant de passer d'un état à l'autre.
Par ailleurs ceci n'est pas du modélisme ferroviaire. Je verrouille le fil.
Bon courage pour la suite