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