Commande de volet (manuel, horaire, detection de lumiere)

oui,c'est bien ça.

Yep!

Gromain59, comment savoir avec certitude si le volet est à interruption mécanique ou électrique, je vais certainement avoir à me poser la question prochainement ???

Pour la partie codage, la bibliothèque de Gromain59 demande expertise, un lien peut être ???

L'avantage des switch/case est qu'ils ne monopolisent pas trop les ressources de l'arduino, on peut donc envisager d'effectuer d'autres tâches. Au demeurant, il y a plusieurs manières différentes de coder ton process.

@+

Zoroastre.

avec certitude je ne sais pas mais j'ai deja laisser le boutton "montée" enfoncer tt la journée y a pas de probleme mais c'est pour eviter tt risques que je limite le temps a 25 sec (en realité il faut au volet 22.3sec)

Gromain59, comment savoir avec certitude si le volet est à interruption mécanique ou électrique

  • si la commande est faite par impulsion sur un bouton poussoir, alors l'arret est par détection de surcharge.
  • si la commande est faite par appui (avec maintien) sur un bouton à accrochage, alors c'est que le bouton alimente le moteur en permanence, et la puissance est coupée par des détecteurs de fin de course réglable au niveau de l'axe du moteur.
    superdd est dans ce dernier cas (voir son schéma dans post précédent)

Concernant la bibliothèque, elle ne monopolise pas les ressources du µC, je n'utilise pas de delay(), et permet donc de faire autre chose :wink:

Gromain

Yep!

Merci pour ces précisions Gromain59 :wink:

Je suis donc dans le même cas de figure que vous messieurs (3 boutons maintiens). Par contre, je m'interroge sur le cablage électrique. Je compte utiliser des relais qui en toute logique doivent se positionner en parallèle des commandes manuelles. Que se passerait-t'il si l'interrupteur est bloqué en postion montée par exemple et que j'excite mon relais pour descendre le volet. On se retrouve avec une incohérence qui pourrait mettre en danger le moteur ???

@+

Zoroastre.

Hello tous

zoroastre:
On se retrouve avec une incohérence qui pourrait mettre en danger le moteur ???

Vui , jai eu a gérer ça il y a pas long, un relais supplémentaire (R/T) qui coupe l'alim (phase) avant les boutons, commandé par l'alim des autres relais : 2 diodes pour que dès qu'un des relais est en service => pas de jus sur les boutons. c'est priorité à l'Arduino dans ce cas. Ne pas oublier de prendre aussi des relais 2R/T pour pouvoir verrouiller la montée ou la descente (erreur de prog. possible)

Esperant que ça te serve
A plus tard

à mon sens, il faut que l'arduino gère tout, ou bien rien.
En clair, il faut supprimer la commande actuelle par bouton à accrochage, et la remplacer par 2 BP (ou même un seul) connecté à l'arduino, et les contacts de 2 relais pour commander la montée/descente du volet.

voir PJ pour un exemple de câblage.

Gromain

il faut supprimer la commande actuelle par bouton à accrochage, et la remplacer par 2 BP

oui c'est bien ce que je comptais faire juste mes 2 bp mon arduino 2 relais la photoresistance et basta ( ou peut-etre un moyen de communiquer avec mon phone par bluetooth ou wifi mais ça c'est pour une autres fois ..

voici les derniere PETITE modif apporter

//commande de volet 

//definition des constantes
const int buttonPin1 = 2;     //boutton "montée"
const int buttonPin2 = 3;    //boutton "descente"
const int ledPin1 =  13;      // relay "Montéé"
const int ledPin2 =  12;      // relay "Descente"
const int ledPin3 =  11;      // led etat volet (on= up) (off= down) 

//definition des variables
int buttonState1 = 0;        
int buttonState2 = 0;

//definition des entree et sorties
void setup(){
  pinMode(ledPin1, OUTPUT);      
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop(){
if (buttonState1 == HIGH){ //determine le type de pression et sur quelle boutton
  action = monté_court;
}
else if (buttonState1 == HIGH){
  action = monté_long;
}
else if(buttonState2 == HIGH){
  action = descente_court;
}
else if (buttonState2 == HIGH){
  action = descent_long;
}
switch (action){
  case montécourt:
  digitalWrite(ledPin1, High);//le volet monte
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la montée)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      } 
digitalWrite(ledPin1, LOW);//le moteur s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat rest alumé

case monté_long:
digitalWrite(ledPin2, High);//le volet descent
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la descente)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }   
digitalWrite(ledPin2, LOW);//le volet s'arrete 
digitalWrite(ledPin3, LOW);//la led d'etat s'eteint 
default:
//si il est X heure 
digitalWrite(ledPin1, HIGH);//le volet monte
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la montée)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      } 
digitalWrite(ledPin1, LOW);  //le moteur s'arrete

//si il est X heure
digitalWrite(ledPin2, HIGH);//le volet descent
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la montée)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      } 
digitalWrite(ledPin2, LOW);        //le moteur s'arrete
}
}

je ne suis pas tres au point niveau programation! :roll_eyes:

Yep!

//commande de volet 

//definition des constantes
const int buttonPin1 = 2;     //boutton "montée"
const int buttonPin2 = 3;    //boutton "descente"
const int ledPin1 =  13;      // relay "Montéé"
const int ledPin2 =  12;      // relay "Descente"
const int ledPin3 =  11;      // led etat volet (on= up) (off= down) 

//definition des variables
int buttonState1 = 0;        
int buttonState2 = 0;

//definition des entree et sorties
void setup(){
  pinMode(ledPin1, OUTPUT);      
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop(){
//si bp1 est presser et que led d'etat est off
digitalWrite(ledPin1, HIGH);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);//le moteur s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat rest alumé

//si bp2 est presser et que led d'etat est on
digitalWrite(ledPin2, HIGH);//le volet descent
Temporisation();
digitalWrite(ledPin2, LOW);//le volet s'arrete 
digitalWrite(ledPin3, LOW);//la led d'etat s'eteint 

//si il est X heure 
digitalWrite(ledPin1, HIGH);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);  //le moteur s'arrete

//si il est X heure
digitalWrite(ledPin2, HIGH);//le volet descent
Temporisation();
digitalWrite(ledPin2, LOW);        //le moteur s'arrete

}

void Temporisation()
{
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }
}

@+

Zoroastre.

voila j'ai aporter tes modifs et j'ai rajouter quelques trucs je ne suis pas sùr que ça soit mieux mais je fait comme je crois !!! on verra bien :cold_sweat: :roll_eyes:

//commande de volet 

//definition des constantes
const int buttonPin1 = 2;     //boutton "montée"
const int buttonPin2 = 3;    //boutton "descente"
const int ledPin1 =  13;      // relay "Montéé"
const int ledPin2 =  12;      // relay "Descente"
const int ledPin3 =  11;      // led etat volet (on= up) (off= down) 

//definition des variables
int buttonState1 = 0;        
int buttonState2 = 0;

//definition des entree et sorties
void setup(){
  pinMode(ledPin1, OUTPUT);      
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop(){
if (buttonState1 == HIGH){ //determine le type de pression et sur quelle boutton
  action = monté_court;
}
else if (buttonState1 == HIGH){
  action = monté_long;
}
else if(buttonState2 == HIGH){
  action = descente_court;
}
else if (buttonState2 == HIGH){
  action = descent_long;
}
switch (action){
  case montécourt:
  digitalWrite(ledPin1, High);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);//le moteur s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat rest alumé

case monté_long:
digitalWrite(ledPin2, High);//le volet descent
Temporisation(); 
digitalWrite(ledPin2, LOW);//le volet s'arrete 
digitalWrite(ledPin3, LOW);//la led d'etat s'eteint 
default:
//si il est X heure 
digitalWrite(ledPin1, HIGH);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);  //le moteur s'arrete

//si il est X heure
digitalWrite(ledPin2, HIGH);//le volet descent
Temporisation();
digitalWrite(ledPin2, LOW);        //le moteur s'arrete
}
}
void Temporisation()
{
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }
}

j'ai une question, comme il n'y a qu'une boucle (void loop) puis-je demander au µc de faire 2 chose a la fois ??
je m'explique pour l'ouverture/fermeture a heure donné il me faut une horloge ou un compteur de temps mais peut-il compter le temps et tester l'etat des entrée en meme temps ???
j'ai encore du mal avec ce genre de programation
merci de votre patience

Yep!

Le loop est la partie du programme qui sera séquentiellement scruté par le controlleur. On ne peut pas vraiment appeler cela une boucle, par contre le sous-programme "Temporisation" est une boucle, rien d'autre ne peut s'effectuer tant que l'itération du for n'est pas terminée (25 secondes). A part cela, tu peux implémenter d'autres fonctions sans problème.
Il faudra cependant faire attention à la synthaxe, quelques erreurs ici et là.

@+

Zoroastre.

la boucle for pour faire une tempo est à proscrire: ton programme est figé pendant l'éxécution de la boucle. Et ton volet incontrôlable (comment l'arrêter en cours ?)

Ce que je te conseille:

  1. fais une routine qui te générera des impulsions tous les x millisecondes (ex: 100ms, 500ms, 1000s...) sous la forme de bit à 1 pour un cycle (utilises millis()).
  2. lorsque que le bit_100_ms sera à 1, exécute une routine qui lira l'état des entrées et décidera s'il faut faire quelquechose (ouvrir/fermer)
  3. lorsque que le bit_100_ms sera à 1, éxécute une routine qui contrôlera s'il est l'heure de faire quelquechose (ouvrir/fermer)
  4. à chaque cycle (loop), execute une routine qui actionnera tel ou tel relais en fonction des actions à réaliser.
  5. lorsque que le bit_500_ms sera à 1, exécute une routine qui contrôlera s'il faut allumer ou éteindre la led

etc.
ainsi, tu exécuteras des taches séquentiellement, en évitant de monopoliser le µC pour rien.

Gromain

Yep!

Quelle est l'impacte d'une telle modification en terme de sécurité, pour les enfants par exemple ?

On remplace les interrupteurs par des boutons poussoirs, et on pilote le moteur via l'arduino et des relais. Si un obstacle vient à gener la fermeture, quelle est la garantie ou le phénomène qui stoppera le moteur et le mettera en sécurité ?

@+

Zoroastre.

Si un obstacle vient à gener la fermeture, quelle est la garantie ou le phénomène qui stoppera le moteur et le mettera en sécurité ?

et bien si tu as bien programmé, tu n'as qu'à réappuyer sur un des boutons pour stopper la course du volet :wink:
Il n'y a pas plus ou moins de sécurité qu'avant.
Chez moi, l'appui sur un des boutons pendant le mouvement du volet le stoppe instantanément.

Gromain

salut tout le monde desolé de n'avoir pu repondre plus tôt (fort occuper)
j'ai lu pas mal de tuto mais j'ai tjs du mal

je ne vois pas comment je peux faire ce que tu decrit la quelle commande me conseille tu ??

Ce que je te conseille:

  1. fais une routine qui te générera des impulsions tous les x millisecondes (ex: 100ms, 500ms, 1000s...) sous la forme de bit à 1 pour un cycle (utilises millis()).
  2. lorsque que le bit_100_ms sera à 1, exécute une routine qui lira l'état des entrées et décidera s'il faut faire quelquechose (ouvrir/fermer)
  3. lorsque que le bit_100_ms sera à 1, éxécute une routine qui contrôlera s'il est l'heure de faire quelquechose (ouvrir/fermer)
  4. à chaque cycle (loop), execute une routine qui actionnera tel ou tel relais en fonction des actions à réaliser.
  5. lorsque que le bit_500_ms sera à 1, exécute une routine qui contrôlera s'il faut allumer ou éteindre la led

merci pour votre interet

Tu fais comme décris ici :

http://www.siteduzero.com/tutoriel-3-14136-maitrisez-le-temps.html

Mais avec la fonction millis()

aller, c'est mon soir de bontés ]:smiley:

ci-dessous un exemple de code qui t'aidera sans doute à bien structurer ton code. C'est la structure type que j'emploie dans mes projets domotiques.

/*
 * Gromain59
 * xPLDuino
 *
 * Structure type:
 * - bit de cadencement
 *
 * - pre (màj des entrées)
 * - calcul
 * - post (màj des sorties)
 * 
 */



//############################### GESTION PULSE ##################################
long prevMillis1000=0;
boolean pulse_1000=0;
long prevMillis100=0;
boolean pulse_100=0;
long prevMillis500=0;
boolean pulse_500=0;


void setup()
{
  // initialize the serial communication:
	Serial.begin(115200);

	Serial.println("exemple de gestion pulse");

}


// acquition de l'état des entrées, pre-calcul
void pre() {

	pulse(); // call pulse generation.

}


void scenario() {


	// ici les calculs à réaliser

}


// mis à jour des memoires de sorties
void post() {

	if(pulse_1000){
		Serial.println("déjà 1 seconde !");
	}

	if(pulse_500){
		Serial.println("plus vite !");
	}

	if(pulse_100){
		Serial.println("trop vite !");
	}

}

void loop() {

	pre(); // Call pre-traitement

	scenario();

	post();	// Call post-traitment


}

void pulse(){

  pulse_1000=0;

  if ((millis() - prevMillis1000) >= 1000 || (millis() - prevMillis1000) < 0){
    prevMillis1000 = millis();
    pulse_1000=1; 
  }

    pulse_100=0;

  if ((millis() - prevMillis100) >= 100 || (millis() - prevMillis100) < 0){
    prevMillis100 = millis();
    pulse_100=1; 
  }
  
    pulse_500=0;

  if ((millis() - prevMillis500) >= 500 || (millis() - prevMillis500) < 0){
    prevMillis500 = millis();
    pulse_500=1; 
  }
  
}

Gromain