14
« le: août 22, 2018, 08:55:55 pm »
Messieurs,
Voici mon nouveau projet pour mon réseau de jardin au 7/8n2
Je souhaiterais faire une entreprise de chargement de produit chimique (en vrai de l'eau pour arroser les plantes du réseau)
En gros : le feu est au vert, le train arrive sous le chargeur, une pédale de voie est activée, au bout de deux secondes (pédale enfoncée), le feux passe au rouge, le chargeur rempli le wagon de produit pendant un temps donné, puis une fois la tempo écoulé, le feu repasse au vert, le train repart.
j'ai essayé des programmes toutes l'aprem en vain (je suis en vacances!) j'ai testé machine à états, delay, millis...
mais rien ne fonctionne!!
Le remplissage est assuré par un relais qui actionne une pompe à eau.
Je n'arrive pas à faire en sorte que l'action ne se fasse, que lorsque la pédale reste 2 secondes, (comme ça si le train ne fait que passer le remplissage ne ce fait pas!) je reviens toujours à mon programme de base :
//déclaration des variables
int pinBouton;
int pinLed1, pinLed2;
void setup() {
// definition mode relais
pinMode(13, OUTPUT);
//initialisation des variables
pinBouton = 2;
pinLed1 = 4;
pinLed2 = 6;
//définition des modes
pinMode(pinBouton, INPUT); //mode lecture pour le bouton
pinMode(pinLed1, OUTPUT); //mode écriture pour led1
pinMode(pinLed2, OUTPUT); //mode écriture pour led2
}
void loop() {
//lecture de l'état du bouton et stockage dans etatBouton
boolean etatBouton = digitalRead(pinBouton);
//test des conditions
if (etatBouton==HIGH && ????)//test si bouton appuyé
{
remplissage ();
}
if (etatBouton==LOW)//test si bouton levé
{
digitalWrite(pinLed1,HIGH); //Led1 allumée
digitalWrite(pinLed2,LOW); //led2 éteinte
digitalWrite(13, HIGH); //Relais sur OFF
}
delay(100); //petite attente
}
void remplissage ()
{
digitalWrite(pinLed1,LOW); //led1 éteinte
digitalWrite(pinLed2,HIGH); //led2 allumée
delay (2000); //atternte de 2 secondes pour etre sur que le train ne bouge plus
digitalWrite(13, LOW);//relais sur ON
delay (10000);
digitalWrite(pinLed1,HIGH); //Led1 allumée
digitalWrite(pinLed2,LOW); //led2 éteinte
}
//digitalWrite(13, HIGH);
Pour le temps d'attente, j'ai trouvé ça qui fonctionne et que je pourrais intégrer à mon code mais je pense pouvoir faire plus simple..
int temps_defini = 2000;
int ledPin = 4;
int boutonPin = 2;
unsigned long debut_appui;
boolean variable = false;
int etat_bouton;
int dernier_etat_bouton = LOW;
int etat_led = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(boutonPin, INPUT);
}
void loop(){
etat_bouton = digitalRead(boutonPin);
if (etat_bouton == HIGH && dernier_etat_bouton == LOW){
debut_appui = millis();
variable = true;
}
if ( variable == true && etat_bouton == HIGH && dernier_etat_bouton == HIGH){
if ((millis() - debut_appui) >= temps_defini){
etat_led = HIGH;
if(etat_bouton == LOW && etat_led == HIGH && dernier_etat_bouton == HIGH){
etat_led = LOW;
variable = true;}}
}
dernier_etat_bouton = etat_bouton;
digitalWrite(ledPin, etat_led);
}
Le summum serait d'arrêter le remplissage si le train part avant la fin, mais c'est pas ma priorité...
Des pistes, un conseil? d'avance merci à vous et bonne soirée.
Peyo