Virtualwire interférence

Bonjour à tous,

Afin de faciliter le démarrage de mon poêle à bois, j’ai mis en place un système arduino qui coupe la VMC de la maison pendant 30min lorsque la porte du poêle est ouverte. Donc un grand merci pour le tuto “Communiquer sans fil en 433MHz avec la bibliothèque VirtualWire” dont je me suis très largement inspiré :
Tuto VirtualWire sur Carnet du Maker

J’ai donc un arduino nano + émetteur dans le poêle, un contact détecte l’ouverture de la porte. Une chaîne de caractère “Ouverture porte” est envoyé vers l’arduino nano qui se trouve dans le garage. Celui-ci commande un relais qui coupe la VMC.

Le système fonctionne bien, la commande de coupure VMC s’active bien, mais elle s’active aussi si je “joue” avec les lumières de la maison par exemple ou activité de marche/arrêt d appareils électriques sur le réseau…

Comment éviter ces interférences ?

Émetteur :
Arduino nano
Emetteur Radio
Contact

/*
 * (émetteur)
 */
 
#include <VirtualWire.h>

/** Broches pour le contact */
const byte PIN_CONTACT_PORTE = 2;

/** message de commande */
const char* OUVERTURE_PORTE = "MUTE_VMC";

void setup() 
{
  Serial.begin(9600);
  
  pinMode(PIN_CONTACT_PORTE, INPUT_PULLUP);

  // Initialisation de la bibliothèque VirtualWire
  // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
  vw_set_tx_pin(12); // Cette fonction permet de définir la broche utilisée pour transmettre les données
  vw_setup(2000);
  
  Serial.println("SETUP TX OK");
}
 
void loop() 
{
  byte message[VW_MAX_MESSAGE_LEN]; 
  // N.B. La constante VW_MAX_MESSAGE_LEN est fournie par la lib VirtualWire
  
  /* Envoi la commande adéquate */
  if (digitalRead(PIN_CONTACT_PORTE) == LOW ) 
    {
    
    vw_send((byte*) OUVERTURE_PORTE, strlen(OUVERTURE_PORTE) + 1); // On envoie le message
    vw_wait_tx(); // On attend la fin de l'envoi
    
    delay(50); // Attend que le bouton soit relâché
    while(digitalRead(PIN_CONTACT_PORTE) == LOW);
    delay(50);
    
    } 
}

Récepteur :
Arduino nano
Recepteur Radio
Module 230Vac/5Vdc
Module 2 Relais (commande On à LOW)

/*
 * (récepteur)
 */

#include <VirtualWire.h>

/** Broches pour le relais */
const byte PIN_K1VMC = 2;

/** message de commande */
const char* OUVERTURE_PORTE = "MUTE_VMC";

void setup() 
{
  Serial.begin(9600);
  
  /* Met les broches de sortie et à HIGH pour état repos relais  */
  pinMode(PIN_K1VMC, OUTPUT);
  digitalWrite(PIN_K1VMC, HIGH);
  
  // Initialisation de la bibliothèque VirtualWire
  // Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
  vw_set_rx_pin(11); //Cette fonction permet de définir la broche utilisée pour recevoir les données
  vw_setup(2000);
  vw_rx_start(); // On peut maintenant recevoir des messages

  Serial.println("SETUP RX OK");
}

void loop() 
{
  byte message[VW_MAX_MESSAGE_LEN];
  byte taille_message = VW_MAX_MESSAGE_LEN;
  // N.B. La constante VW_MAX_MESSAGE_LEN est fournie par la lib VirtualWire

  /* 
   La variable "taille_message" doit impérativement être remise à 
   la taille du buffer avant de pouvoir recevoir un message. 
   Le plus simple est d'utiliser une variable locale pour ne pas
   avoir à réassigner la valeur à chaque début de loop().
   */

  // On attend de recevoir un message
  vw_wait_rx();

  if (vw_get_message(message, &taille_message)) 
  {
    // On copie le message, qu'il soit corrompu ou non

    if (strcmp((char*) message, OUVERTURE_PORTE) == 0) 
    {
      digitalWrite(PIN_K1VMC,LOW);
      Serial.println("TOGGLE K1");
      delay(1800000); // 30min
      digitalWrite(PIN_K1VMC, HIGH);
      
    } 
    else
    {
    digitalWrite(PIN_K1VMC, HIGH);
    }
  }
}

Le système fonctionne bien, la commande de coupure VMC s'active bien, mais elle s'active aussi si je "joue" avec les lumières de la maison par exemple ou activité de marche/arrêt d appareils électriques sur le réseau…

ça ne vient sans doute pas du code vu qu'il teste d'avoir reçu le message MUTE_VMC et ce serait étonnant qu'une perturbation électromagnétique génère exactement cette séquence sur 433 MHz... :slight_smile:

Avez vous vérifié si parfois votre arduino reboot?

le soucis provident sans doute plutôt de votre relais qui ne serait pas bien isolé ? ça aurait été pas mal de prendre un relais qui ne fait rien à l'état bas plutôt que d'avoir à maintenir la pin du relais HIGH - comme ça si l'arduino plante où n'est plus alimenté ça ne déclencherait pas.

Ok, je suis plutôt d’accord avec cette réflexion, mais ça ne colle pas puisque la VMC se coupe bien pendant 30min après ce déclenchement non désiré. Donc j’ai bien franchi l’étape de vérification du message non ?

Ha oui précision, j’utilise le contact NC du relais, donc si l’Arduino n’est pas alimenté la VMC est toujours en route.

ah dans ce cas oui... effectivement.

Comme votre programme ne fait pas grand chose il se peut qu'un ancien message reste sur la pile avec les bonnes valeurs si vous n'avez pas de bol...

Pour être "ceinture bretelles" - changez

 byte message[VW_MAX_MESSAGE_LEN];

en byte message[VW_MAX_MESSAGE_LEN] = "";pour mettre à NULL premier caractère sur la pile (les variables locales ne sont pas initialisées par défaut) et changez le test de réception

if (vw_get_message(message, &taille_message)) 
  {
    // On teste le message si on a reçu des caractères. 

    if ((taille_message > 0) && (strcmp((char*) message, OUVERTURE_PORTE) == 0))
    {

Merci pour votre aide, je vais tester ces modifications et je reviens vous informer du résultat bientôt
:slight_smile:

J'ai bien appliqué les modifications de code, le problème est toujours là... C'est fou ça !? :o

vous pouvez faire un Serial.print() quand vous déclenchez le capteur et afficher la trame reçue ?

sinon le soucis viendrait de l'émetteur qui pense que la trappe est ouverte... affichez aussi un message dans la console quand vous envoyez un message ainsi qu'au reboot et laissez un ordi branché pour voir ce qu'il se passe

Bonjour,

Je pense également que le problème se situe sur la détection 'porte ouverte', un bon 100nF en // sur le contact devrait éliminer le défaut.

Je viens de mettre un 100nF en // sur le contact et le défaut a disparu ! Merci à tous pour votre soutient :slight_smile: