Volets somfy - telecommande rts

hello pour cli() et sei(), oui, on interdit les interruptions puis on autorise les interruptions.
pour ton code: d'ou sort'il? tu l'as modifié?
ton code passe son temps à rebooter le micro 328
essaye cette version et regarde ton moniteur

#include <avr/wdt.h>
#include <SomfyRTS.h>

//SomfyRTS myRTS(3, 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)


void setup() {
 Serial.begin(115200);
 Serial.println("*****************************setup");Serial.flush();
  //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
   pinMode(7, INPUT_PULLUP);//BP pour descendre le volet 
   pinMode(8, INPUT_PULLUP);//BP pour monter le volet
   wdt_enable(WDTO_250MS);  //watchdog en service et initialisé à 250 milli
}

void loop() {

Serial.println("loop ");
if (digitalRead(7) == LOW)   //si appui sur le BP "descente"
    {Serial.println("descente ");
 //     myRTS.sendSomfy(3, DOWN); // remote 0, downloop
      delay(30000);
      //myRTS.setHighPower(false);
      wdt_reset();   
    }
    
    if (digitalRead(8) == LOW)//si appui sur le BP "montée"
    {
      Serial.println("montée ");
//      myRTS.sendSomfy(3, UP); // remote 0, up
      delay(30000);
     // myRTS.setHighPower(false);
      wdt_reset();
    }
}

en résumé: tu mets un watch dog de 250ms ( que tu ne remets à zéro par wdt_reset() (son compteur recommence à zéro) que si un BP est appuyé.
et lorsqu'un BP est appuyé, tu fais un délai de 30 secondes ( mouvement volet)
es tu sur d'avoir besoin de ces 30 secondes? normalement un appui furtif sur BP de la télécommande somfy enclenche la descente du volet ( par exemple) et pour stopper le volet, il faut appuyer sur "MY" ou laisser le volet aller en fin de course.
ensuite pourquoi mettre un watch dog ???

Tout d'abord merci,

J'aurai du penser à déboguer mon code avec le moniteur série. A l'avenir je le ferai systématiquement.

Effectivement je me doutais bien que c'était l'usine à gaz. Maintenant je vois clairement ce qu'il se passe. C'est n'importe quoi, pourtant mes volets fonctionnent correctement, ils montent et descendent à l'appui sur les BP correspondants mais ma UNO doit souffrir de mes incohérences !

Effectivement la durée de transmission d’une trame complète selon le protocole RTS est de l’ordre de 140 ms, en incluant la synchronisation hardware, la synchronisation software...

Je vous explique ma démarche :

J'utilise la librairie Somfy d'etimou https://github.com/etimou/SomfyRTS avec un module RFM69HCW 434MHZ qui est positionné à 433.42 Mhz dans le code.

Si j'utilise les exemples de la librairie, tout fonctionne parfaitement pour l'appairage du ou des volets, les 56 bits de la trame RTS avec une nouvelle adresse, le rolling code, la commande du volet... s'inscrivent bien dans l'EEPROM de ma UNO (si j'ai bien compris).

// This sketch will pair a Somfy device with a virtual remote controller 

#include <SomfyRTS.h>

SomfyRTS myRTS(3, 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)

void setup() {

  Serial.begin(115200);
  //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("Enter something in the terminal to pair your device");

  //wait until something is received on Serial
  while (!Serial.available()){}
  Serial.print("Pairing...");
  myRTS.sendSomfy(0, PROG);
  Serial.println("Done");

 
}

void loop() {


}

Je respecte le protocole pour appairé, tout va bien pour l'instant...

Ensuite le croquis de démo d'un cycle fonctionne également correctement :

// This sketch will cycle one window blind every minute

#include <SomfyRTS.h>

SomfyRTS myRTS(3, 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)

void setup() {

  //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() {

  myRTS.sendSomfy(0, DOWN); // remote 0, down
  delay(60000);
  myRTS.sendSomfy(0, UP); // remote 0, up
  delay(60000);

}

Le ou les volets montent et descendent sans interruption avec une pause delay(60000); entre chaque mouvement.

Là ou ça se complique c'est lorsque que je veux créer mon propre code avec deux BP, un pour monter tous les volets et un pour les descendre :

Si j'utilise ce code :

#include <SomfyRTS.h>

SomfyRTS myRTS(3, 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)


void setup() {

  //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
   pinMode(7, INPUT_PULLUP);
   pinMode(8, INPUT_PULLUP);
}

void loop() {


if (digitalRead(7) == LOW)
    {
      myRTS.sendSomfy(3, DOWN); // remote 0, downloop
      delay(30000);
     
          
    }
    
    if (digitalRead(8) == LOW)
    {
      
      myRTS.sendSomfy(3, UP); // remote 0, up
      delay(30000);
      
    }

  
  
}

ça ne fonctionne pas, tout plante...

Si j'utilise celeui-ci :

#include <SomfyRTS.h>

SomfyRTS myRTS(3, 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)


void setup() {

  //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
   pinMode(7, INPUT_PULLUP);
   pinMode(8, INPUT_PULLUP);
}

void loop() {


if (digitalRead(7) == LOW)
    {
      myRTS.sendSomfy(3, DOWN); // remote 0, downloop
      delay(30000);
      myRTS.setHighPower(false);
          
    }
    
    if (digitalRead(8) == LOW)
    {
      
      myRTS.sendSomfy(3, UP); // remote 0, up
      delay(30000);
      myRTS.setHighPower(false);
    }

  
  
}

J'ai ajouté myRTS.setHighPower(false);
ça fonctionne mais je dois faire un reset après chaque action sur un BP en appuyant sur le bouton adéquat de ma UNO d'où l'idée d'un reset automatique avec un watchdog. Je voulais un reset logiciel uniquement après l'appui sur un BP et j'ai fait n'importe quoi en prenant un exemple sur internet que j'ai mal utilisé. Malgré tout ce code bancal me permet d'effectuer ce que je veux.

Voilà.
Merci de vous intéresser à un neuneu comme moi.

Bonjour dfgh,

Voilà qui est bien plus cohérent je pense ?

#include <avr/wdt.h>
#include <SomfyRTS.h>

SomfyRTS myRTS(3, 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)


void setup() {

  //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
   pinMode(7, INPUT_PULLUP);
   pinMode(8, INPUT_PULLUP);
   
}

void loop() {


if (digitalRead(7) == LOW)
    {
      myRTS.sendSomfy(3, DOWN); // remote 0, down
      delay(300);
      //myRTS.setHighPower(false);
      redemarre_arduino();  
    }
    
    if (digitalRead(8) == LOW)
    {
      
      myRTS.sendSomfy(3, UP); // remote 0, up
      delay(300);
      //myRTS.setHighPower(false);
      redemarre_arduino();
    }
 } 
 void redemarre_arduino(){
  wdt_enable(WDTO_15MS);
  while(1){
  }
}

ça fonctionne.
Merci.

content que cela fonctionne.
peux tu me dire ce qu'il en est du rolling code?
tant que tu utilises ton montage, il est correct
mais qu'en est il si tu veux à nouveau utiliser ta/tes télécommandes d'origine.
je suppose que le rolling code n'y est pas à jour et que tu es obligé de recommencer une séquence d'appairage en passant par le BP "reset" de la télécommande.

ton projet pourrai m'interresser, je viens de taper ce code ( sans pouvoir l'essayer)
j'ai acheté un emetteur RFM69 il y a quelques temps, il faut que je le retrouve dans mes tiroirs....

/*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            3
#define BP_select_volet     4
#define BP_montee           5
#define BP_descente         6
#define BP_stop             7
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
int led [] = {8, 9, 10, 11, 12, 13, 14, 15, 16,};

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 = 4; f < 8; f++) {
    pinMode(f, INPUT_PULLUP);
  }
  for (int f = 8; f < 17; f++) {
    pinMode(f, OUTPUT);
    digitalWrite(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);
    }
    compteur_flashs_leds = 0;
    digitalWrite(led[volet_choisi], LOW); 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))  {
    compteur_flashs_leds = 0;  //delay pour anti pianotage
    myRTS.sendSomfy(0, UP);
    delay(1000);
  }
  if (!digitalRead(BP_descente)) {
    compteur_flashs_leds = 0;  //delay pour anti pianotage
    myRTS.sendSomfy(0, DOWN);
    delay(1000);
  }
  if (!digitalRead(BP_stop))    {
    compteur_flashs_leds = 0;  //delay pour anti pianotage
    myRTS.sendSomfy(0, STOP);
    delay(1000);
  }
}
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 = 0; 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]));
    }
  }
}

Bonjour dfgh,
Le rolling code est mémorisé dans l'EEPROM de l'arduino qui "émule"une télécommande. L'arduino est une nouvelle télécommande enregistrée et reconnue comme telle par le ou les moteurs SOMFY avec son propre rolling code. Il n'y a pas de conflits avec les autres télécommandes.

Ce n'est pas mon projet, c'est le fruit du travail formidable effectué par de nombreux intervenants dont certains membres de ce forum. Moi je cherche à comprendre ce qu'ils ont fait.

Je regarde votre code.

J'ai regardé votre code, le principe des leds et de la sélection d'un volet est sympa.

Il faudra juste remplacer 0 par volet_choisi ici :

 if (!digitalRead(BP_montee))  {
    compteur_flashs_leds = 0;  //delay pour anti pianotage
    myRTS.sendSomfy(volet_choisi, UP);
    delay(1000);
  }
  if (!digitalRead(BP_descente)) {
    compteur_flashs_leds = 0;  //delay pour anti pianotage
    myRTS.sendSomfy(volet_choisi, DOWN);
    delay(1000);
  }
  if (!digitalRead(BP_stop))    {
    compteur_flashs_leds = 0;  //delay pour anti pianotage
    myRTS.sendSomfy(volet_choisi, STOP);
    delay(1000);
  }

Mais avant tout :
1/ il faudra programmer les 7 volets dans l'arduino et ça c'est facile ;
2/ Il faudra aussi voir si ces instructions ne donnent pas lieu à des dysfonctionnement comme pour moi et ça c'est moins évident ;
3/ Pour les leds ne pas oublier que le module a besoin des pins suivants de l'arduino :

Je crois qu'il faut commencer par quelque chose de simple pour voir si ça fonctionne bien d'abord, mon programme par exemple, vous pouvez l'essayez sans le reset de la carte et voir si ça fonctionne.

Sinon, bravo pour le codage. J'ai le souvenir de votre code pour ma calculatrice qui m'a fait énormément progresser :wink:

Bonne soirée.

Ici, on parle de solutions pour reset un Arduino. En software il y a cette solution :

void(* reboot) (void) = 0;//déclarer une fonction reboot qui pointe vers l'adresse 0 de la flash
...
//plus loin dans le code
  reboot();

Merci lesept.

hello
j'ai quand meme un doute sur le fonctionnement de ton code:
puisqu'il fonctionne en boucle avec le prg d'Etimou, pourquoi as tu besoin de faire des reset après chaque commande ?
j'ai trouvé mon RFM69W.
j'ai opté pour un mini pro en 3.3V à 8MHz
j'ai fais un proto et testé le code de sélection et de cde des envois.
ai modifié des affectations en fonction de mon hard.
ai modifié le code pour éteindre les leds pendant les envois. pour tout donner à l'émetteur.
il est trop tard pour juer avec les volets.............demain sera un autre jour
pour les essais de télécommande, dès que j'en ai le temps............


Bonsoir dfgh,
C'est peut-être mon code, je ne sais pas.

J'ai cru voir sur internet que le RFM69 nécessitait une carte arduino en 3v3, certains même prônent les convertisseurs logiques sur toutes ses connections si on utilise un arduino en 5V.

Du coup, j'ai commandé ce matin une mini pro en 3.3V à 8MHz :

https://www.amazon.fr/gp/product/B01DUSDQQ8/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&th=1
Et un Module Convertisseur USB vers TTL 3.3V 5.5V Compatible avec Arduino :
https://www.amazon.fr/gp/product/B01N9RZK6I/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&th=1

J'espère ne pas m'être trompé sur le choix du module convertisseur et de la mini pro car il semble qu'il y ai plusieurs versions en 3V3 pour la mini pro. Vous utilisez quel matériel pour connecter votre mini au pc ?

J'ai hâte de savoir ce qu'il en sera demain. J'espère que ça va le faire pour vous et pour moi aussi...
Je reçois mon matériel mardi prochain.
Bravo pour le proto c'est bien mieux que moi avec la UNO :wink:
Bonne soirée.

hello
pour moi, ce que vous avez commandé est ok
chez moi, mini pro en 3.3 avec 1µ 328p à 8Mhz
et le FTDI est référencé CP2102 reglable 5/3.3 V ( je viens de l'entourer de ruban adhésif pour ne pas faire de CC en cas de contact avec du métal.)
je vous joint mon prg modifié et fonctionnel pour tout sauf l'émission de cde que je n'ai pas testée avec les volets
d'abord appairage qui s'il se fait, confirmera le fonctionnement de l'émetteur.
ensuite les cdes : montée, descente et stop

/*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
}

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);
        }
  }
}

Bonjour dfgh,
J'ai 11 volets donc si ça marche pour vous, dés mardi je me mets au travail, je crois avoir 4 boutons comme vous mais ils doivent être plus petits et il faut que je les retrouve parmi mon stock de composants très important :wink:

Concernant l'antenne, pour l'instant j'utilise un brin de cable électrique de 17.5 cms. J'ai commandé il y a longtemps ça :
https://www.amazon.fr/gp/product/B09HXKNRRS/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1
Mais il faut que j'attende le 19 novembre :wink:
Il me reste 5 modules donc j'ai de quoi faire des essais.
Voici mes télécommandes : 11 SOMFY SMOOVE ORIGIN RTS + la télécommande générale SOMFY TELIS 1 RTS

Pour votre appairage une fois le téléversement effectué :
1/ Le volet doit être en position haute (c'est la position que j'utilise pour la prog) ;
2/ le moniteur série affiche "Enter something in the terminal to pair your device" ;
3/ vous devez appuyer sur la touche prog derrière la télé jusqu'à ce que le volet descende un tout petit peu puis remonte ;
4/ vous entrez quelque chose (n'importe quoi) dans votre moniteur série ;
5/ le volet doit sans intervention descendre et monter comme au 3/.
6/ le volet est appairé et le moniteur série affiche "Done".

Chaque volet prend la valeur x ici ==> myRTS.sendSomfy(x, PROG);

Mais tout ça je pense que vous le savez mieux que moi, je vous le mets au cas où un élément du processus pourrait vous être utile.

Bonne journée.

Sur https://circuitdigest.com/microcontroller-projects/how-to-interface-rfm69hcw-rf-module-with-arduino
In this tutorial we are using Arduino nano which uses 5 volt logic but the RFM69HCW module uses 3.3 volt logic levels as you can clearly see in the above table so to properly communicate between two devices a logic level converter is mandatory, in the fritzing diagram below we have shown you how to hook up the Arduino nano to the RFM69 module.

La solution à mon PB est peut-être là...
Il faut travailler avec du 3.3V

Malheureusement, je n'ai plus de convertisseurs de niveau logique :wink:
Il faut donc que j'attende mardi.

hello
11 volets. avec mini pro, pas de soucis pour la sélection .
pour les leds , j'utilise int led = {19,14,16, 9, 8, 17, 15, 7};
reste 20,21,22,23 qui sont A4, A5, A6, A7.

pour A4 et A5, pas de problème on peut les traiter en Analogique ou en digital.
pour A6 et A7, je ne sais plus si on peux effectivement les utiliser en digital ou/et en analogique.
je vais faire un test .
mais pour l'instant, je vais faire une deuxième version du programme pour pouvoir faire les 8 appairages dont j'ai besoin.

A priori c'est comme sur une nano, A6 et A7 ne sont utilisables qu'en analogique...

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