Volets roulants Somfy RTS - RFM69HCW

Bonjour,

La bibliothèque d'etimou me semble instable sur une UNO R3 et le module que j'utilise.
Mes soudures sont bonnes sur le module, mes connexions sur la UNO R3 sont correctes.
J'ai malgré tout réussi à connecter un volet, ça a fonctionné un temps puis plus rien...

Bonjour à tous,

Je reviens vers vous car je progresse à petits pas avec mes volets roulants :
J'ai refais un montage cette fois-ci avec une Carte de Circuit Imprimé Universel :


j'ai appairé ma télécommande générale qui pilote 8 volets roulants somfy, ensuite j'ai téléversé 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
  
}

void loop() {

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

}

Le code s’exécute correctement et tous mes volets montent et descendent normalement.

Ensuite j'ai monté deux BP en INPUT_PULLUP sur les GPIO 7 et 8 pour utiliser le code suivant :

#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(200);
      while (digitalRead(7) == LOW){;}    //si le BP à été appuyé
    }
    
    if (digitalRead(8) == LOW)
    {
      myRTS.sendSomfy(3, UP); // remote 0, up
      delay(200);
      while (digitalRead(8) == LOW){;}    //si le BP à été appuyé
    }
  
}

Au téléversement l'ensemble des volets descendent si j'appuie sur le bouton relié au GPIO 7
Par contre si j'appuie sur celui relié au 8, rien ne se passe...
Par la suite si je fais remonter les volets avec la télécommande d’origine, je ne peux plus les descendre avec mon montage...

Si quelqu'un pouvait m'aider car ma femme n'est pas contente du tout de voir monter et descendre ses volets depuis ce matin :grinning:
De plus avec tout mes essais j'ai peur de bloquer le nombre d'appairage possible des moteurs :sleepy:

L'idée d'une UNO câblée sur une plaquette à pastilles avec des fils DUPONT me paraît complètement farfelue.
Autant utiliser une NANO ou une PRO MINI.
Ce n'est probablement pas la cause du problème, mais les fils DUPONT ne sont certainement pas un gage de fiabilité à long terme.

Les connexions données par etimou sont celles d'une Uno, j'ai essayé avec une nano avec moins de succès !
C'est juste un prototype pour faire des essais, des plaquettes à pastille j'en ai une dizaine, la UNO est récupérable car fixée sur du double face et utilisée avec des fils DUPONT (c'est pas le top au niveau connexion mais facile à enlever).
J'ai perdu un module RFM69HCW, deux BP et une plaquette à pastille, c'est pas ce qui manque dans mes tiroirs et vu le prix ...
Bien sûr, si j'arrive à faire fonctionner tout ça, la télécommande sera différente :wink:

Très cordialement.

PS : Il n'y a aucune agressivité dans mes propos, si j'étais en face de vous, je vous le dirai trés calmement et gentiment.

Et pourtant il n'y a aucune différence entre une UNO et une NANO, mis à part 2 entrées analogiques A6 et A7 bien sûr.

C'est vrai Henri, le montage doit fonctionner avec une nano ! Peut être que j'ai commis une erreur lors du montage.
Mais il le peut aussi avec une uno. Je suis certain de mes connexions de la carte avec le module. Mes soudures sur le module sont correctes.
Je me demandais si il y avait un problème dans le code ?

Bonjour,

Voilà, j'ai trouvé une solution, pas forcement la bonne :

  • l'instruction myRTS.setHighPower(true); doit activer (je pense) le module RFM69HCW en émission.
    J'ai remarqué que si il reste dans cet état, un dysfonctionnement apparaît avec le fonctionnement des autres télécommandes.
  • Si j'utilise l'instructionmyRTS.setHighPower(false); aprés myRTS.sendSomfy(3, DOWN); ou myRTS.sendSomfy(3, UP); il n'y a aucun dysfonctionnement.
  • Le problème c'est que je ne parviens pas à réactiver le module. En effet, l'instruction myRTS.setHighPower(true); ne semble pas fonctionner dans la boucle loop(). J'ai fait plusieurs essais sans résultat...

Bon par contre en utilisant ce code et en effectuant un reset de ma uno après appui sur un BP, tous mes volets montent ou descendent en fonction du BP utilisé :

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

  
  
} 

Merci par avance pour votre aide.

Sans ces ligne peut être ...

Non Henri,
Ces lignes sont indispensables !
J'ai vu un GPIO RST sur le module, il doit permettre sa réinitialisation. Il n'est pas pris en compte par la librairie d'Etimou.
Il y a peut-être aussi :

#include <avr/wdt.h>

void software_Reboot()
{
  wdt_enable(WDTO_250MS);

  while(1)
  {

  }
}

Ce code fonctionne parfaitement :


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

  
  
} 

Comme j'effectue un reset de la carte du coup myRTS.setHighPower(false); n'est plus necessaire.
Tout fonctionne parfaitement :wink:
Il y a peut-être une autre solution mais celle-ci fonctionne à merveille !
Ouf :sweat:

En fait le bon code c'est celui là :

#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){
  }
}

Bonjour,

Quelqu'un peut-il m'expliquer à quoi sert la fonction myRTS.setHighPower(true); ?
Quel est son impact sur le module RFM69HW ?

Merci.

https://github.com/LowPowerLab/RFM69/blob/master/RFM69.cpp
// for RFM69 HW/HCW only: you must call setHighPower(true) after initialize() or else transmission won't work
La question serait plutôt : pourquoi appeler myRTS.setHighPower(false); après avoir envoyé une commande ?

Je n'en suis pas certain, mais j'essaierais sans.

Il semble qu'une amélioration a été proposée pour passer en standby entre 2 émissions. Je n'ai plus les moyens de tester. Tu peux essayer, si ça marche je l'intégrerai dans la lib.
C'est plus propre que de redémarrer l'arduino.

https://github.com/mike-k68/SomfyRTS

Bonjour Henri,

etimou a compris où je voulais en venir.
Merci.

Bonjour Etimou,

Je vais essayer.
Merci pour l'info.

  1. Si le but est d'économiser l'énergie, il fallait le dire, plutôt que d'affirmer que ces commandes sont indispensables.
  2. économiser l'énergie pour quoi faire ? A moins d'alimenter le tout sur batterie, quel intérêt ?
  3. Un fonctionnement sur batterie avec une UNO ? :grimacing:

Henri,
Je n'affirme rien, j'essaye de comprendre :wink:

ça ne marche pas...

Est-ce que le programme d'origine fonctionne? Celui qui fait ouvrir et fermer toutes les minutes

1 Like

oui.

dans ce cas, il faut peut-être revoir ta gestion des boutons. Vérifie que tu n'exécutes les commandes qu'une seule fois par exemple.