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

Bonjours tout le monde
j'ai comme projet avec ma nouvelle(3 semaines) carte arduino uno de remplacer la comande du volet de mon salon
mais comme je n'aime pas me simplifier la vie , je voudrait que la commande se fasse de 3 façons
1manuel 2 ou 3 bouttons :
1 pour monter
1 pour descendre
1 pour arreter la montée/descente n'importe qd
2commande horaire : monte a X heure descent a X heure
3(photosensible): le volet descent si la lumiere du salon est allumer

je ne compte pas vous demander de faire le code a ma place mais plutot des conseille sur le choix du code
excuser moi d'avance car je suis un novice en programation pour l'electronique par contre je me defend

merci d'avence

je rajoute ici un petit descriptif de "comment je vois le code"
je commence par les com , je remplirai les blanc au fur et a mesure
je me suis clairement inspirer des examples trouver avec le soft mais j'ai des gros trous

//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
//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
      } 
//le moteur s'arrete
//la led d'etat rest alumé

//si bp2 est presser et que led d'etat est on
//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
      }   
//le volet s'arrete 
//la led d'etat s'eteint 

//si il est X heure 
//le volet monte

//si il est X heure
//le volet descent
}

alors j'ai un peu plus de code que sur le post plus haut mais j'esite deja et je me demande si je dois metre un bp3 stop pour arreter la montée/descente du volet a tout moment ou si il y a moyen de faire une difference entre appuis long appuis cour sur les bp pour qu'avec un appuis court il monte/descende completement
et avec un appuis long (+2sec) il s'arrete des qu'on relache le bp??
dans les 2 cas quelle type de "boucle" dois-je prendre ?? if...else, switch...case, ????

merci de votre aide de vos conseiles

Yep!

Alors pour la circonstance ton projet m'interesse :wink:

J'ai en vu quelque chose de similaire pour une gestion domotique avec entre autre, chauffage centrale et volet roulant pour l'essentielle.
Je ne sais pas de quelle manière tu gères tes signaux de commande, relais, thyristors, etc. Pour ma part, j'ai opté pour une carte relais 8 canaux piloté en rs485.
D'ailleurs, je suis dans l'inconnu quant à la manière dont s'arrête un volet roulant, tout en supposant que se soit mécanique genre un fin de course ou quelque chose dans le genre. Peut-être pourras-tu m'apporter des précisions sur cet aspect !!!

Pour ton code, j'opterais pour une série de case. C'est plus lisible.
Il faudrait donc dans un premier temps détecter le front montant correspondant à un appui et ensuite évaluer la durée de cet appui. Soit court, soit long. Une variable prendrait cette valeur et rentrerait dans la série des cas possibles (case).

Par contre, pour la sonde de lumière, je ne comprends pas trop pourquoi tu ne la mets pas à l'exterieure plutôt. Le but est me semble-t'il de fermer les volets roulants dés que la nuit tombe.
Je ne programmerais pas non plus de montée du volant automatisé...grasses matinées obliges :smiley:

@+

Zoroastre.

C'est cool ça ! étant moi aussi sur un projet domotique je suit ton post avec attention ... ca pourrais bien me servir dans peu de temps ^^

salut et merci de votre attention
alors toi zoroastre tu me dis de metre un switch...case dans le "void loop" c'est bien ca ??

ps: petite precision je compte integré ça (la carte + une petite alim + une plaque avec les bp et capteur de lumiere) dans un blochet deja presant a coté de la fenetre derriere un "cache trou" modifier
le fait que le volet s'ouvre a ex:8h du matin ne me derange pas vu que c'est uniquement ds mon salon,
et si je met un capteur de lumiere c'est pour ne pas que si j'allume qd il fait sombre on voit ce qu'il s'y passe depuis l'exterieur.
je pourait trouver un moyen plus sur que le capteur de lumiere mais je n'y suis pas encore (je pensse que c'est encore la partie la plus facile a coder)

merci

Salut,

avant tout, il faut que tu détermines comment est géré ton volet: arret par butée mécanique (-> la commande actuelle est faite par 2 boutons à accrochage) ou arret par détection de surcharge (cas des volets bubbendorf par exemple: impulsion sur des boutons poussoirs).
Seulement après tu sauras comment coder.
Pour les volets par détection de surcharge, c'est un peu plus compliqué, mais j'ai fait une bibliothèque qui gère ça.

Gromain

je ne connais pas les detailes mais la commande actuelle c'est un interrupteur a 3 boutton qd tu enfonce le boutton pour monte il monte et s'arete au max pareil pour le bas mais si j'appuie sur le boutton du milieu ça relache les 2 autres

ok, c'est le premier cas de figure, le plus simple: le 230V du moteur passe directement dans les contacts des BP.
Utilises donc des relais pour remplacer les BP
Moyennant de petites adaptations, la bibliothèque que j'ai écrit fonctionnera parfaitement.

Gromain


/O
/
Ph-------O{ cable volet

O_________________________________

N____________________________________________

désolé pour ce schéma rudimentaire

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.