Volets somfy - telecommande rts

Ce fil de discussion est la continuité de :
https://forum.arduino.cc/t/volets-roulants-somfy-rts-rfm69hcw/910646

Bonjour,

Quelqu'un aurait-il la gentillesse d'expliquer simplement les fonctions de la librairie avr/wdt.h et donc les conséquences de leur utilisation dan un programme.

  • wdt_enable(WDT Reset Timer);

  • wdt_reset();

Merci par avance.

1 Like

hello
sans entrer dans les détails:
le watchdog est un timer. comme son nom l'indique, il est utilisé pour surveiller les temps d'exécution des progs ou de parties de prog
imagine une boucle qui serait sans fin, comment en sortir?
si à la conception du prg tu decides qu'une boucle ne doit ps excéder 15ms , tu regles le timer du watchdog sur 15ms et tu l'autorises à surveiller la boucle. si la boucle se termine avant 15ms, tu neutralises le watchdog. si la boucle dure trop longtemps, le watchdog exécutera un reset (ou une autre fonction) du micro afin de quitter la boucle infinie .
voilà en gros le watchdog:
pour exemple, voici un prg qui illustre ce que je viens de t'écrire.
tu vas l'exécuter en visualisant le moniteur
1/avec le f de la boucle égal à 5 : f=5
2/avec le f de la boucle égal à 50 : f=50

#include <avr/wdt.h>

void setup() {
  cli();
  wdt_enable(WDTO_15MS);
  sei();
  Serial.begin(115200);
  Serial.println ("*******************************reset");
}

void loop() {
  Serial.println(millis());

  for (long f = 0; f <= 50; f++)
  {
    Serial.print(millis());
    Serial.print("  ");
    Serial.println(f);
  }
  wdt_disable();//interdit les interruptions par le watchdog
}

nota:WDTO_15MS peut etre 30MS,60MS,120MS,250MS,500MS, ou 1S, 2S,4S,8S

Merci dfgh,
J'ai fait les tests et Je comprends très bien sauf l'instruction 'cli()' et sei();

Sans vouloir abuser, pourriez-vous me dire ce que vous pensez de l'utilisation du Watchdog Timer dans ce code ?
Quelle est son incidence dans ce Croquis?

https://forum.arduino.cc/t/volets-roulants-somfy-rts-rfm69hcw/910646/29

#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);
   wdt_enable(WDTO_250MS);
}

void loop() {


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

  
  
}

Merci beaucoup.

L’instruction wdt_reset(); permet-elle d'effectuer un reset après l’exécution des instructions myRTS.sendSomfy(3, DOWN); ou myRTS.sendSomfy(3, UP); et un délai de 250MS ?

Merci.

Ok pour cli(); et sei();

J'ai compris grâce à : https://www.locoduino.org/spip.php?article88

==> sei() permet d’autoriser les interruptions alors que la fonction cli() permet de les ignorer

  • chronologie du setup :

1/ on bloque les interruptions ;
2/ on règle le timer sur 15ms ;
3/ on autorise de nouveau les interruptions...

Merci

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...