Volets somfy - telecommande rts

Vous pouvez utiliser l'exemple d'etimou Demo_pair, il y a juste à changer le 0 jusqu'à 6 pour vos 7 volets
==> myRTS.sendSomfy(0, PROG);

il faudra les traiter en passant par PWM à 255

pour l'appairage avec mes huit canaux, je viens de faire un prg spécifique appairage

reste à tester tout ça

/*selon le travail d'Etimou
  SomfyRTS myRTS(emetteur, TSR_RFM69); //Tx pin number, transmitter type
  //pin number : pin connected to the transmitter DATA pin or to the DIO2 pin on RFM69
  //transmitter type can be TSR_RFM69 or TSR_AM (for a generic AM 433.42MHZ transmitter)
*/
#include <SomfyRTS.h>
#define emetteur            2
#define BP_select_volet     3
#define BP_montee           4
#define BP_descente         5
#define BP_stop             6
SomfyRTS myRTS(emetteur, TSR_RFM69);
int nb_volets             = 7;
int volet_choisi          = 0;
int compteur_flashs_leds  = 0;
//             0, 1, 2, 3, 4,  5,  6, 7, 8
// 10, 11, 12, 13 utilisés pour la com avec l'emetteur
int led [] = {19, 14, 16, 9, 8, 17, 15, 7};
unsigned long periode_led = 1000;//ici on regle la frequence de clignotement
unsigned long timer_led   = millis() + periode_led;
void setup() {
  Serial.begin(115200);
  for (int f = 3 ; f < 7; f++) {
    pinMode(f, INPUT_PULLUP);
  }
  for (int f = 1; f <= 8; f++) {
    pinMode(led [f], OUTPUT);
    digitalWrite(led [f], LOW);
  }
  //myRTS.configRTS(myEEPROM_address, myRTS_address); //uncomment and change values only if you don't want to use default configuration
  myRTS.setHighPower(true); //have to call it after initialize for RFM69HW

  Serial.println("selectionnez un volet avec BP_SELECT");
  Serial.println("puis validez la selection avec BP_STOP");
  Serial.println("puis, à l'invite du moniteur ");
  Serial.println("tapez une <touche + enter> ");
  Serial.println("dans la zone entree de texte du moniteur ");
  Serial.println("pour appairer votre telecommande ");
}

void loop()
{
  if (!digitalRead(BP_select_volet))
  {
    while (!digitalRead(BP_select_volet)) {
      delay(200);
    }
    digitalWrite(led[volet_choisi], LOW);
    if (volet_choisi == 0) {
      compteur_flashs_leds = 10;
      timer_leds();
    }
    compteur_flashs_leds = 0;
    volet_choisi++; digitalWrite(led[volet_choisi], HIGH);
    if (volet_choisi == (nb_volets + 1)) {
      volet_choisi = 0;
    }
    Serial.print("volet choisi : "); Serial.println(volet_choisi);
  }
  timer_leds();
  if (!digitalRead(BP_stop))
  {
    Serial.println("appairage demande...");
    compteur_flashs_leds = 10;  timer_leds();        //extinction des leds
    while (!Serial.available()) {;} //attendre tant que rien ne vienne du moniteur
    Serial.print("appairage en cours pour volet ... ");             //caractere reçu
    Serial.print(volet_choisi);
    myRTS.sendSomfy(volet_choisi, PROG);               //envoi d'une demande d'appairage
    Serial.println("termine");                         //terminé
    compteur_flashs_leds = 0;
    delay(1000);//delay pour anti pianotage
  }
}
void timer_leds()
{
  if (compteur_flashs_leds < 10)
  {
    if (millis() > timer_led)
    {
      compteur_flashs_leds++;
      timer_led = millis() + periode_led;
      if (volet_choisi == 0)
      {
        for (int c = 1; c <= nb_volets; c++)
        {
          digitalWrite(led[c], !digitalRead(led[c]));
        }
      }
      else
      {
        digitalWrite(led[volet_choisi], !digitalRead(led[volet_choisi]));
      }
      Serial.print("volet  "); Serial.print(volet_choisi); Serial.print("  ");
      Serial.print("led "); Serial.print(led[volet_choisi]); Serial.print(" ");
      Serial.println(digitalRead(led[volet_choisi]));
    }
  }
  else
  {
    for (int c = 1; c <= nb_volets; c++)
    {
      digitalWrite(led[c], LOW);
    }
  }
}

ça à l'air bien :wink:

aie, lorsque je tape qq dans le moniteur, il m'affiche
"appairage en cours pour volet ... 1........termine"
mais je n'ai pas encore touché au reset de la télécommande d'origine.

je pensais que le volet répondais qqchose et qu'à ce moment là, on sortait de la fonction :
myRTS.sendSomfy(volet_choisi, PROG);

à voir, je n'ai plus le temps ce matin

Il faut tout d'abord appuyer sur prog de la télé d'origine et ensuite taper quelque chose dans le moniteur et laisser faire.
Lorsque vous appuyez sur prog de la télé le volet doit descendre puis monter rapidement

if (!digitalRead(BP_stop))
  {
    Serial.println("appairage demande...");
    compteur_flashs_leds = 10;  timer_leds();        //extinction des leds
    while (!Serial.available()) {;} //attendre tant que rien ne vienne du moniteur
    Serial.print("appairage en cours pour volet ... ");             //caractere reçu
    Serial.print(volet_choisi);
    myRTS.sendSomfy(volet_choisi, PROG);               //envoi d'une demande d'appairage
    Serial.println("termine");                         //terminé
    compteur_flashs_leds = 0;
    delay(1000);//delay pour anti pianotage
  }

Peut-être qu'en rajoutant du temps une seconde ou deux peut-être : delay(2000); ou delay(3000);

Il faut que la fonction myRTS.sendSomfy(volet_choisi, PROG); est le temps de faire son job jusqu'à ce que le volet descende et monte sans action de votre part ! il faut également (je présume) que la mini pro ne se consacre qu'à ça durant ce labs de temps...

Vous pouvez aussi vous contenter de l'exemple d'etimou dans le setup en programmant la première télécommande "0". Cela vous permettrez de savoir si le module fonctionne.

hello
j'ai 7 volets
2 groupes de 3 volets commandés par des télécommandes "telis 4 RTS pure"
et 1 volet commandé par une télécommande "smoove origin RS io"

j'ai commencé avec le volet seul, mais pas moyen de l'appairer. il est plus loin ( 10 mètres) que les autres(2 à 5 mètres).
je laisse tomber et passe aux autres volets.
appairage des 6 volets séparément ok. le 7ème est en attente.
canal 1, led 1 appairage ok
canal 2, led 1 appairage ok
canal 3, led 1 appairage ok
canal 4, led 1 appairage ok
canal 5, led 1 appairage ok
canal 6, led 1 appairage ok
test ensuite en mode normal ( prog utilisateur ) et tous les volets réagissent bien lorsque je sélectionne leur canal. ( 1,2,3,4,5,6, montée,descente,stop)
ai débranché et rebranché le proto et il a conservé ses appairages
je vais passer à l'appairage pour avoir les 6/7 volets ensemble sur le canal 0
il va falloir ( je pense ) que je passe les deux "télis" en mode "prog" et taper au moniteur, mais comment va réagir le prg ? va t'il considérer qu' à la première réponse c'est terminé et qu'ainsi je ne pourrai pas appairer la deuxième "télis" ?

Super,
Pour la distance, il ne doit pas y avoir de PB, ma TELIS 1 RTS pilote tous mes volets ensemble. Du coup je l'ai programmé sur mon "prototype", entre les deux volets les plus éloignés, il y a environ 18 mètres et ça fonctionne mais avec le reset !

Donc, vous avez réussi à programmer 6 "telis 4 RTS pure" canal 1 à 6.
Il est impossible de mettre plusieurs télécommandes sur un même canal mais je vois pas trop d'où sortent les deux "télis" à mettre sur le canal 0 ?
Je pense que vous avez donc deux autres telis qui chacune pilote 3 volets ensemble et que vous souhaitez les associer au canal 0 ? Malheureusement c'est impossible, par contre vous pouvez programmer une des 2 telis pour piloter les 6 volets ensemble puis la programmer sur le canal 0...

Est-ce que vos deux fois 3 volets sont les mêmes ?

La librairie d'etimou fonctionne comme ceci :

1/ On ne peut émuler une télécommande sur l'arduino qu'avec une télécommande existante ;
2/ Une télécommande existante peut avoir été programmée pour plusieurs volets dans ce cas l'arduino va émuler le fonctionnement de ce groupe de volets.

une veranda installée il y a 15 ans environ. elle a 7 volets. et 2 télécommandes. 3 volets par télécommande ( ce qui fait 6 volets et 1 volet qui est en manuel pour des questions de sécurité ( en cas d'incendie et de coupure électrique ).
et tout récemment, j'ai coupé un garage en deux pour faire une petite chambre. donc baie vitrée et volet roulant avec télécommande "smoove origine RS io"
6 volets scindés en deux groupes commandés chacun par une "telis 4 RTS pure"
j'ai programmé:
volet 1 du canal 1 de la telis 1 sur le canal 1 de mon prototype.
volet 2 du canal 2 de la telis 1 sur le canal 2 de mon prototype.
pas de volet sur le canal 3 telis 1 (c'est un volet manuel)
volet 3 du canal 4 de la telis 1 sur le canal 3 de mon prototype.

volet 1 du canal 1 de la telis 2 sur le canal 4 de mon prototype.
volet 2 du canal 2 de la telis 2 sur le canal 5 de mon prototype.
volet 3 du canal 3 de la telis 2 sur le canal 6 de mon prototype.
pas de volet sur le canal 4 de la telis 2
le volet 7 de la smoove origine RS io sera sur le canal 7 de mon prototype

et j'aimerais tous les volets regroupés dans le canal 0 de mon prototype

sur les telis, actuellement, j'ai 3 canaux occupés par un volet chacun.
reste 1 canal libre sur chacune des telis.

lorsque je sélectionne les 4 canaux sur une télis ou sur l'autre, les 6 volets sont actionnés en meme temps.

edit, je viens de voir votre message ci dessus. il semblerait que ca va etre difficile...

j'essaie avec 1 telis selectionnée sur les 4 canaux pour le canal 0 de mon proto

Je commence à comprendre, il existe donc des telis avec plusieurs canaux.
Vous avez :

Moi une telis 1 RTS pure.

Sur la face avant des deux votre vous avez 4 ronds pour 4 canaux, moi j'en ai un.

Sur ma face arrière j'ai une touche de prog :

Et vous sur vos deux telis 4, vous avez 4 touches prog à l'arrière ?

c'est ok, avec la telis 1 sur le canal 7 de mon proto j'ai les 6 volets ensemble.
lorsque j'essaie la même manip sur le canal 0, l'appairage semble fonctionner, tous les volets acquittent l'appairage mais ensuite le canal 0 ne commande que le volet 1.

pas grave si c'est le canal 0 qui gene, j'en mettrai 8 sur la version finale et le canal 8 sera le général et sera activé par défaut.

:+1:c'est cool merci à tous ceux qui ont travaillé sur ce projet :+1:

edit: non 1 seule touche de prog, je sélectionne le canal avant de passer en prog
re edit: les telecommandes ne servant que le matin , le soir et parfois en après midi:
puisqu'il est possible de couper l'alim et de retrouver un fonctionnement normal, pourquoi ne pas envisager de mettre un inter sur l'alim?

Bravo à vous :wink:

On a pas les mêmes télécommandes télis. Pour moi un seul appui sur le bouton prog pour une télécommande télis et même chose pour mes smoove origin RTS (votre smoove c'est un autre model que le mien).

Moi je fais des essais mardi à la réception de mon matériel.

Bonne soirée à vous.

Maintenant, je comprends...

C'est exactement ce que j'ai fait... Avec une pile...

les leds du proto éclairent trop fort, lorsque les 7 clignotent en meme temps, ça fait mal aux yeux.
les resistances sont de 220 ohms, j'en mettrai de valeur plus importante( après essais visuels)

Pour une utilisation sur batterie effectivement, il vaut mieux qu'elles éclairent juste ce qu'il faut mais pas trop.

Vous pouvez me mettre le code final si il y a de gros changements ?
Je m'en servirai de référence.

Merci pour tout.

PS : vous êtes très fort !

avec plaisir

:grinning:ce sont etimou et ses aidants qu'il faut féliciter :+1:

pour l'appairage

/*selon le travail d'Etimou
  SomfyRTS myRTS(emetteur, TSR_RFM69); //Tx pin number, transmitter type
  //pin number : pin connected to the transmitter DATA pin or to the DIO2 pin on RFM69
  //transmitter type can be TSR_RFM69 or TSR_AM (for a generic AM 433.42MHZ transmitter)
*/
#include <SomfyRTS.h>
#define emetteur            2
#define BP_select_volet     3
#define BP_montee           4
#define BP_descente         5
#define BP_stop             6
SomfyRTS myRTS(emetteur, TSR_RFM69);
int nb_volets             = 7;
int volet_choisi          = 0;
int compteur_flashs_leds  = 0;
//             0, 1, 2, 3, 4,  5,  6, 7, 8
// 10, 11, 12, 13 utilisés pour la com avec l'emetteur
int led [] = {19, 14, 16, 9, 8, 17, 15, 7};
unsigned long periode_led = 1000;//ici on regle la frequence de clignotement
unsigned long timer_led   = millis() + periode_led;
void setup() {
  Serial.begin(115200);
  for (int f = 3 ; f < 7; f++) {
    pinMode(f, INPUT_PULLUP);
  }
  for (int f = 1; f <= 7; f++) {
    pinMode(led [f], OUTPUT);
    digitalWrite(led [f], LOW);
  }
  //myRTS.configRTS(myEEPROM_address, myRTS_address); //uncomment and change values only if you don't want to use default configuration
  myRTS.setHighPower(true); //have to call it after initialize for RFM69HW
  Serial.println("pour appairer votre telecommande ");
  Serial.println("selectionnez un volet avec BP_SELECT");
  Serial.println("puis validez la selection avec BP_STOP");
  Serial.println("puis, appuyer sur le touche PROG de la télécommande Somfy ");
  Serial.println(" à l'invite du moniteur ");
  Serial.println("tapez une <touche + enter> ");
  Serial.println("dans la zone entree de texte du moniteur ");
  Serial.println("et laissez faire le programme ");
}

void loop()
{
  if (!digitalRead(BP_select_volet))
  {
    while (!digitalRead(BP_select_volet)) {
      delay(200);
    }
    digitalWrite(led[volet_choisi], LOW);
    if (volet_choisi == 0) {
      compteur_flashs_leds = 10;
      timer_leds();
    }
    compteur_flashs_leds = 0;
    volet_choisi++; digitalWrite(led[volet_choisi], HIGH);
    if (volet_choisi == (nb_volets + 1)) {
      volet_choisi = 0;
    }
    //Serial.print("volet choisi : "); Serial.println(volet_choisi);
  }
  timer_leds();
  if (!digitalRead(BP_stop))
  {
    Serial.println("appairage demande...");
    compteur_flashs_leds = 10;  timer_leds();        //extinction des leds
    while (!Serial.available()) {;} //attendre tant que rien ne vienne du moniteur
    Serial.print("appairage en cours pour volet ... ");             //caractere reçu
    Serial.print(volet_choisi);
    myRTS.sendSomfy(volet_choisi, PROG);               //envoi d'une demande d'appairage
    Serial.println("........termine");                         //terminé
    compteur_flashs_leds = 0;
    delay(1000);//delay pour anti pianotage
  }
}
void timer_leds()
{
  if (compteur_flashs_leds < 10)
  {
    if (millis() > timer_led)
    {
      compteur_flashs_leds++;
      timer_led = millis() + periode_led;
 
      if (volet_choisi == 0)
      {
        for (int c = 1; c <= nb_volets; c++)
        {
          digitalWrite(led[c], !digitalRead(led[c]));
        }
      }
      else
      {
        digitalWrite(led[volet_choisi], !digitalRead(led[volet_choisi]));
      }
      //Serial.print("volet  "); Serial.print(volet_choisi); Serial.print("  ");
      //Serial.print("led "); Serial.print(led[volet_choisi]); Serial.print(" ");
      //Serial.println(digitalRead(led[volet_choisi]));
    }
  }
  else
  {
    for (int c = 1; c <= nb_volets; c++)
    {
      digitalWrite(led[c], LOW);
    }
  }
}

pour commander les volets

/*selon le travail d'Etimou
  SomfyRTS myRTS(emetteur, TSR_RFM69); //Tx pin number, transmitter type
  //pin number : pin connected to the transmitter DATA pin or to the DIO2 pin on RFM69
  //transmitter type can be TSR_RFM69 or TSR_AM (for a generic AM 433.42MHZ transmitter)
*/
#include <SomfyRTS.h>
#define emetteur            2
#define BP_select_volet     3
#define BP_montee           4
#define BP_descente         5
#define BP_stop             6
SomfyRTS myRTS(emetteur, TSR_RFM69);
int nb_volets             = 7;
int volet_choisi          = 0;
int compteur_flashs_leds  = 0;
//             0, 1, 2, 3, 4,  5,  6, 7, 8
// 10, 11, 12, 13 utilisés pour la com avec l'emetteur
int led [] = {19,14,16, 9, 8, 17, 15, 7};
unsigned long periode_led = 1000;//ici on regle la frequence de clignotement
unsigned long timer_led   = millis() + periode_led;
void setup() {
  Serial.begin(115200);
  for (int f = 3 ;f <7; f++) {
    pinMode(f, INPUT_PULLUP);
  }
  for (int f = 1; f <= 7; f++) {
    pinMode(led [f], OUTPUT);
    digitalWrite(led [f], LOW);
  }
  //myRTS.configRTS(myEEPROM_address, myRTS_address); //uncomment and change values only if you don't want to use default configuration
  myRTS.setHighPower(true); //have to call it after initialize for RFM69HW
}

void loop()
{
  if (!digitalRead(BP_select_volet))
  {
    while (!digitalRead(BP_select_volet)) {
      delay(200);
    }
    digitalWrite(led[volet_choisi], LOW); 
    if(volet_choisi==0){compteur_flashs_leds=10;timer_leds();}
    compteur_flashs_leds = 0;
    volet_choisi++; digitalWrite(led[volet_choisi], HIGH);
    if (volet_choisi == (nb_volets + 1)) {
      volet_choisi = 0;
    }
    Serial.print("volet choisi : "); Serial.println(volet_choisi);
  }
  timer_leds();
  if (!digitalRead(BP_montee))  {Serial.println("montee");
    compteur_flashs_leds = 10;  timer_leds();
    myRTS.sendSomfy(volet_choisi, UP);
    compteur_flashs_leds = 0;
    delay(1000);//delay pour anti pianotage
  }
  if (!digitalRead(BP_descente)) {Serial.println("descente");
    compteur_flashs_leds = 10;  timer_leds();
    myRTS.sendSomfy(volet_choisi, DOWN);
    compteur_flashs_leds = 0;
    delay(1000);//delay pour anti pianotage
  }
  if (!digitalRead(BP_stop))    {Serial.println("stop");
    compteur_flashs_leds = 10;  timer_leds();
    myRTS.sendSomfy(volet_choisi, STOP);
    compteur_flashs_leds = 0;
    delay(1000);//delay pour anti pianotage
  }
}
void timer_leds()
{
  if (compteur_flashs_leds < 10)
  {
    if (millis() > timer_led)
    {
      compteur_flashs_leds++;
      timer_led = millis() + periode_led;
      if (volet_choisi == 0)
      {
        for (int c = 1; c <= nb_volets; c++)
        {
          digitalWrite(led[c], !digitalRead(led[c]));
        }
      }
      else
      {
        digitalWrite(led[volet_choisi], !digitalRead(led[volet_choisi]));
      }
      Serial.print("volet  "); Serial.print(volet_choisi); Serial.print("  ");
      Serial.print("led "); Serial.print(led[volet_choisi]); Serial.print(" ");
      Serial.println(digitalRead(led[volet_choisi]));
    }
  }
  else
  {
    for (int c = 1; c <= nb_volets; c++)
        {
          digitalWrite(led[c], LOW);
        }
  }
}

Merci

hello
lorsque tu auras réalisé ta télécommande, fais nous un retour, cela permettra à d'autres de trouver des réponses aux questions qu'ils se posent..