Interrupteur trois état volets

Bonjour,
je souhaiterais gérer mes volets roulants avec un arduino.
Mon interrupteur est un 3 états relié pour l'instant au volet.
Le but serait de pouvoir gérer les volets avec l'interrupteur et avec l'arduino par l'envoie de commande via un nrf24l01.
Pour cela je pensais relier le volet à des relais qui serait commandé par l'arduino et l'interrupteur à l'arduino.
Mon problème est que je ne sais pas comment gérer la montée ou la descente du volet si l'interrupteur est dans la position opposée.

Salut,

Rien compris ... La comme ça au premier degrès j'ai envie de dire "bin inverse alors !", mais comme on sait pas si l'interrupteur est brancher au volet ou à l'arduino ou a autre chose ...

Bonjour
Idem B@tto
on ne sait rien de ce qu'est ton inter 3 etats et comment il est cablé actuellement.
un peu plus de precisions (-liens,photos,references,...) ne ferait pas de mal :grin:

Bonjour,
Comme B@tto, j'ai pas compris mais j’interprète. Les commandes des volets roulants sont raccordées à un bouton de commande 3 états (montée, arrêt et descente). Cela se traduit par un contact "montée" et un contact "descente".
La solution ne nécessitant pas de modification du câblage volet et de remplacer le bouton 3 états par 2 relais pilotés par la carte Arduino.
Attention : ne jamais faire montée et descente en même temps, il faut une sécurité par des contacts du relais.

Edit

ton contacteur reste en position haut/bas ou revient au centre apres relachement et/ou volet en butée ?

mon interrupteur reste toujours dans la position sur laquelle il a été mis lors de la dernière action. Aucun retour de position.

Les volets s’arrêtent automatiquement.

alb12:
mon interrupteur reste toujours dans la position sur laquelle il a été mis lors de la dernière action. Aucun retour de position.

Les volets s’arrêtent automatiquement.

Alors ça risque d'etre assez compliqué de conserver ton contacteur ET d'ajouter une autre commande .

Re,

Artouste:
Alors ça risque d'etre assez compliqué de conserver ton contacteur ET d'ajouter une autre commande .

Voila pourquoi, j'ai écris de remplacer le bouton de cde par des relais.

Ok, il n'y a donc pas de solution avec cette interrupteur.
Il faudrait changer pour un interrupteur qui fait un simple contact si je veux garder l'interrupteur et l'arduino ?

alb12:
Ok, il n'y a donc pas de solution avec cette interrupteur.
Il faudrait changer pour un interrupteur qui fait un simple contact si je veux garder l'interrupteur et l'arduino ?

Il faudrait que tu trouve dans la gamme un contacteur avec contact haut/bas qui revienne au neutre apres relachement.
tu a un seul volet à equiper ou plusieurs ?

oui pour l'instant ce serait pour un équiper un seul.

Ca doit être jouable avec cet interrupteur ... au moins pour commencer

l'inter est cablé sur l'arduino (une entrée pour la montée, et une pour la descente), le volet sur des relais (2 c'est mieux, un pour l'alim, un pour le sens) pilotés par l'arduino ...

quand le bouton change d'état ... c'est que quelqu'un actionne l'inter ... agir en conséquence sur les relais (avec une tempo pour les relâcher quand le mouvement est terminé)
quand un ordre via nrf24l01 est reçu ... l'arduino agit en conséquence sur les relais (quelle que soit la position de l'inter)

le seul hic c'est que le volet peut être en haut et que le bouton est en bas (si un ordre de montée a été reçu entre temps via nrf24l01) ... dans ce cas il faut mettre le bouton au milieu et appuyer vers le bas pour faire descendre le volet

B83s:
le seul hic c'est que le volet peut être en haut et que le bouton est en bas (si un ordre de montée a été reçu entre temps via nrf24l01) ... dans ce cas il faut mettre le bouton au milieu et appuyer vers le bas pour faire descendre le volet

Hé oui, et c'est justement là le gros HIC :grin: , si il faut déjà se deplacer pour positionner le bouton "au neutre" l'interet d'une telco perd beaucoup de son interet 8)

Dans la mesure où ce n'est là que pour un equipement , je regarderais si il n'est pas possible de modifier la mecanique du bouton pour qu'il ne soit plus en "maintenu" mais devienne en retour au centre .
A charge pour l'arduino derriere de gerer les actions sur ce bouton.

@Artouste : ça existe des interrupteurs comme ça?
Quel est le problème si c'est pour plusieurs équipement?

@B83s : Dans la function loop, l'arduino verra toujours l'état du bouton et voudra toujours faire l'action du bouton. Si tu as une autre solution je suis preneur.

B83s:
...
l'inter est cablé sur l'arduino ...

C'est pas bête, passer par l'arduino même pour une commande manuelle.

Artouste:
Hé oui, et c'est justement là le gros HIC :grin: , si il faut déjà se deplacer pour positionner le bouton "au neutre" l'interet d'une telco perd beaucoup de son interet 8)

je n'ai pas dit ça :slight_smile: ...

le bouton peut très bien rester en position haute et l'arduino faire descendre le volet via teleco sans qu'il y ait conflit électrique ... quand l'arduino scrute l’état du bouton, il doit le comparer à l'état précédant pour voir si un ordre manuel a été donné ... pas de changement = pas d'ordre

@B83s : Dans la function loop, l'arduino verra toujours l'état du bouton et voudra toujours faire l'action du bouton. Si tu as une autre solution je suis preneur.

non, en commande manuelle via l'inter, tu devras programmer pour agir sur changement d'état (position) du bouton ...

par exemple ceci devrait convenir :

je suppose que l’inter a 3 bornes . une commune, une vers le fil montée, une vers le fil descente … et qu’en position neutre, les deux sorties sont ouvertes)

cablage des relais
relai_alim : commun sur le 230 V (attention les doigts), contact normalement ouvert vers le commun du relai direction
relai_direction : le commun vient du relai_alim, le contact normalement fermé sur le fil descente, l’autre sur le fil montée

#define relai_alim 3 //le relai_alim envoie (ou pas) le 230V sur le relai_direction
#define relai_dir 4  //le relai_dir oriente l'alim soit sur le fil montée, soit sur le fil descente

//interrupteur : branché sur le GND et ses deux sorties connectées sur la carte avec pullup activée
//en lecture si on a HIGH = inter ouvert, LOW = inter fermé
#define inter_montee 5   //sortie montée
#define inter_descente 6 //sortie descente

byte etat, last_etat ; //etats de l'inter 0=neutre 1=montee 2=descente
unsigned long tempo ;  //date du debut du mouvement, 0 si aucun mouvement en cours

void setup() {
  pinMode(relai_alim, OUTPUT);
  pinMode(relai_dir,  OUTPUT);
  pinMode(inter_montee,   INPUT); 
  digitalWrite(inter_montee, HIGH); // activation pullup
  pinMode(inter_descente, INPUT); 
  digitalWrite(inter_montee, HIGH); // activation pullup
  
  //initialisation de la position de l'inter
  if (digitalRead(inter_montee) == LOW) etat = last_etat = 1;        //inter sur montée
  else if (digitalRead(inter_descente) == LOW) etat = last_etat = 2; //inter sur descente
  else etat = last_etat = 0;                                         //inter sur neutre

}

void loop() {
  //lecture en boucle de la position de l'inter
  if (digitalRead(inter_montee) == LOW) etat = 1;
  else if (digitalRead(inter_descente) == LOW) etat = 2;
  else etat = 0;
  
  //action manuelle sur changement de l'etat de l'inter
  if (etat != last_etat) {
      last_etat = etat;                 //mémorise le nouvel etat
      if (etat == 1) {
        //action montée demandée
        digitalWrite(relai_dir, HIGH);  //orientation
        digitalWrite(relai_alim, HIGH); //alimentation
        tempo = millis();               //date du début du mouvement
      } else if (etat == 2) {
        //action descente demandée
        digitalWrite(relai_dir, LOW);   //orientation
        digitalWrite(relai_alim, HIGH); //alimentation
        tempo = millis();               //date du début du mouvement 
      } else {
        //bouton mis sur neutre = arret du mouvement
        digitalWrite(relai_dir, LOW);   //orientation
        digitalWrite(relai_alim, LOW);  //alimentation
        tempo = 0; //reset
      }
   }
   
   //si il y a un mouvement en cours, au bout de 30s le volet a fini son mouvement,
   //on coupe les relais pour les soulager
   if (tempo != 0 && millis() - tempo > 30000) {
      digitalWrite(relai_dir, LOW);   //orientation
      digitalWrite(relai_alim, LOW);  //alimentation
   }     
   
   //ordres recu par teleco (je ne sais pas comment tu vas decoder tes ordres ...
   //mais sur le principe la fontion lit_teleco() ecoute le récepteur et décode le message
   // et te renvoie 1 pour monter ou 2 pour descendre
   if (lit_teleco() == 1) {
      //action montée demandée âr teleco 
      digitalWrite(relai_dir, HIGH);  //orientation
      digitalWrite(relai_alim, HIGH); //alimentation
      tempo = millis();               //date du début du mouvement
    } else if (lit_teleco() == 2) {
      //action descente demandée
      digitalWrite(relai_dir, LOW);   //orientation
      digitalWrite(relai_alim, HIGH); //alimentation
      tempo = millis();               //date du début du mouvement 
    } 
    
    // a faire : arreter le volet avec la teleco (qd un mouvement est en cours et 
    // que l'on appui sur le bouton en sens inverse...)
}

byte lit_teleco() {
  //si ordre teleco = up then return(1);
  //si ordre teleco = down then return(2);
}

@B83s : Merci beaucoup, je vais regarder ça.