Volets roulants Somfy RTS - RFM69HCW

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.

Effectivement il semble y avoir un PB au niveau de la gestion des boutons pourtant j'avais essayé d'autres méthodes :

#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(0, DOWN); // remote 0, downloop
      delay(300);
      //redemarre_arduino();
    }
    
    if (digitalRead(8) == LOW)//si appui sur le BP "montée"
    {
      Serial.println("montée ");
      myRTS.sendSomfy(0, UP); // remote 0, up
      delay(300);
      //redemarre_arduino();
    }
}
void redemarre_arduino(){
  wdt_enable(WDTO_15MS);
  while(1){
  }
}

Je vais voir ce que je suis capable de faire :wink:

Avec ce code, on reste bloqué après avoir appuyé sur le BP 7, plus de loop ???

#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(0, DOWN); // remote 0, downloop
      delay(300);
      while (digitalRead(7) == LOW){;}    //si le BP à été appuyé
      //redemarre_arduino();
    }
    
    if (digitalRead(8) == LOW)//si appui sur le BP "montée"
    {
      Serial.println("montée ");
      myRTS.sendSomfy(0, UP); // remote 0, up
      delay(300);
      while (digitalRead(8) == LOW){;}
      //redemarre_arduino();
    }
}
void redemarre_arduino(){
  wdt_enable(WDTO_15MS);
  while(1){
  }
}

Je donne ma langue au chat :wink:

Le RFM69HCW utilise des niveaux logiques de 3.3v, il faut donc utiliser un convertisseur de niveau 5V ==> 3.3v pour que la communication soit bonne entre l'arduino et le module ?

Dans ce cas la nano s'impose pour faire des essais.