Arduino Uno + Bluetooth HC-05/ZS-040 + RF 433

Bonjour à tous !

C'est mon premier post ici donc pardonnez-moi si c'est mal fait. :slight_smile:
Désolé, il est un peu long, car j'essaie d'être le plus complet possible... :slight_smile:

Bon alors,
Je me suis remis depuis peu à l'électronique et pour cela quoi de mieux qu'utiliser Arduino :slight_smile:

Le contexte :
Je dispose dans mon appartement d'une prise commandée par un interrupteur, vous savez les prises électrique qui laissent passer le courant 220V lorsque vous appuyez sur l'interrupteur mural, qui sont destinées la plupart du temps à brancher une lampe avec son propre interrupteur toujours activé. Ce qui fait que lorsque vous appuyez sur l'interrupteur mural, le lampadaire s'allume.

Mon objectif :
Ce que j'essaie de faire, c'est lorsque j'appuie sur mon interrupteur mural, que cela allume bien mon lampadaire actuel mais aussi un second lampadaire situé dans la même pièce, qui lui, est branché sur une prise "normale". Comme cela, j'ai 2 lampadaires qui s'allument via ce seul interrupteur mural.

Mon idée :
J'ai choisi de prendre 2 Arduino, 1 qualifié d'"émetteur" qui sera branché sur la prise commandée par l'interrupteur mural, et 1 autre Arduino "récepteur" branché ailleurs dans la pièce sur une prise "normale". Le but est que lorsque j'alimente l'Arduino émetteur (autrement dit, lorsque j'allume le premier lampadaire via la prise commandée), celui-ci va envoyer un signal à l'Arduino récepteur afin que ce dernier active une smartplug où est connecté mon second lampadaire (je souhaite éviter de travailler directement avec du 220V...).

Les contraintes :
Le plus gros souci est pour détecter la mise hors tension du premier lampadaire. Cela implique que l'Arduino récepteur doit détecter que l'Arduino émetteur est hors tension. Il faut donc réaliser une attente "active" sur le "récepteur" et que donc cet Arduino doit attendre les ordres de l'émetteur, et notamment lorsque l'émetteur est "coupé". Pour cela, j'ai choisi le protocole Bluetooth car il est peu perturbant pour les autres appareils, contrairement au protocole RF (si j'avais fait cela avec, j'aurais saturé la bande RF 433 et ça, c'est pas cool). J'ai donc acheté 2 modules HC-05/ZS-040 (ceux avec les pins EN et STATE).

Le matériel utilisé :

  • Arduino Uno.
  • Modules Bluetooth HC-05/ZS-040 avec les pins EN et STATE.
  • Modules émetteurs/récepteurs RF 433 génériques.
  • Une smartplug RF 433 MHz de marque Brennenstuhl pour le lampadaire cible.

Le statut :
Lorsque le premier Arduino, relié à la prise murale commandée, est mis sous tension, il envoie un signal via Bluetooth au second Arduino qui lui est branché normalement et qui attend donc l'évènement déclencheur. Une fois que ce second Arduino reçoit le signal Bluetooth du premier, il utilise ensuite son propre module émetteur RF pour allumer mon lampadaire cible via une smartplug RF Brennenstuhl. Tout cela marche nickel.

Le problème que j'ai :
J'ai plus ou moins réussi à faire ce que je voulais donc, le petit souci que j'ai est lié au "temps de latence" de la connexion Bluetooth. En effet, lorsque j'active l'interrupteur mural, le temps que les 2 modules Bluetooth se synchronise, il se passe environ 5 secondes. Ce qui fait que mon deuxième lampadaire s'allume 5 secondes après le premier. C'est plutôt bof...

Ce que j'ai essayé de faire pour résoudre ce problème :
J'ai alors essayé de faire quelque chose d'autre avec les modules RF que j'avais en stock : Puisque le protocole RF est simple et rapide, j'ai branché en parallèle, sur mon Arduino émetteur, un émetteur RF. Celui-ci envoie donc un signal au second Arduino dès l'allumage afin de gagner en "rapidité". Ce qui fait que dès que l'Arduino émetteur est mis sous tension, il envoie donc un signal RF au second qui ensuite envoie lui-même un signal RF à la smartplug. La raison pour laquelle je suis obligé de passer par l'Arduino récepteur à la place d'allumer la prise directement, c'est le fait que je dois stocker un "flag" sur l'Arduino récepteur pour savoir si la smartplug est activée ou non. Car malheuresement le protocole RF ne permet pas de "lire" l'état à distance. Sauf si je me trompe ?

Je pense que ma piste est bonne, mais je bloque sur un second problème :
L'Arduino récepteur, où est donc branché le module récepteur RF, ne reçoit jamais rien tant que les 2 modules Bluetooth ne sont pas appareillés (LED qui clignotent vite sur les cartes HC-05/ZS-040). Une fois qu'ils le sont, la connexion RF devient possible. Ce qui ne me va pas, car j'essaie justement de "contourner" la latence du Bluetooth...

J'ai remarqué que les modules Bluetooth HC-05/ZS-040 ont un pin EN qui d'après Martyn Currey permet de désactiver le module lorsque ce pin est mis à LOW, enfin c'est ce que je comprends ici :

EN Pin
Pulling the EN pin on the HC-05 LOW disables the module.

Je me suis donc dit qu'il fallait que j'allume le module Bluetooth qu'une fois la connexion RF "utilisée" au démarrage.
J'ai donc branché le pin EN du module Bluetooth sur le pin 12 de l'Arduino, défini ce pin comme étant OUTPUT puis j'envoie LOW sur celui-ci. Mais mon module Bluetooth ne se "coupe" pas.

Je pense donc utiliser un transistor PNP branché sur le pin VCC du module Bluetooth pour l'allumer quand j'aurais décidé. Toujours d'après Martyn Currey, il propose de faire un montage à base d'un transistor 2N3906 PNP et un resistor de 2.2K, comme ci-dessous :

Cela me convient, mais sa board est un Arduino Nano. Dois-je adapter quelque chose pour faire la même chose sur le Uno ? Je pense notamment à la valeur du resistor ?

Le schéma complet de ce que je veux faire, à ce stade :

Je ne sais pas si c'est super clair... N'hésitez pas sinon ! :slight_smile:

Merci d'avance pour vos réponses et désolé pour ce très long message !

Bonjour

C'est très clair avec un challenge intéressant si vous prenez cette voie - mais faut avouer que c'est un peu l'usine gaz :slight_smile:

avez vous pensé à une petite réserve d'énergie sur l'Arduino maître (qui perd son alim quand on appuie sur l'interrupteur) pour qu'il ait le temps d'envoyer un ordre RF directement la prise pilotée - comme cela vous éliminez entièrement Le besoin du second arduino et de sa consommation constante pour faire une attente active ?

Il faudrait voir votre code pour comprendre pourquoi vous avez besoin d'attendre l'appairage BT

Bonjour J-M-L,

Et merci pour votre intérêt ! :slight_smile:

Oui effectivement, ce projet est non seulement quelque chose que j'ai vraiment besoin, mais je l'avoue, c'était aussi un challenge afin d'avoir un cas d'application de Bluetooth, en tout cas, à l'origine. :slight_smile:

Cependant, comme j'aurais quand même besoin de ce montage en "production", votre solution d'utiliser un seul Arduino serait encore mieux ! Mon souci c'était justement de détecter la perte d'alimentation sur l'Arduino "master", je n'arrivais pas à voir comment faire, d'où mon idée d'avoir un Arduino "slave" qui ferait de l'attente active - via Bluetooth - ce qui me permettait de détecter, via cet Arduino slave, la coupure du "master".

Donc ce que je comprend, il faudrait que j'utilise un capacitor (condensateur) pour que l'Arduino ait suffisamment de temps à envoyer un order RF à la prise pilotée ? :slight_smile:

Le souci, c'est que je n'ai aucune idée de comment faire cela :frowning:
Comment détecter la coupure de l'alimentation et donc l'envoi d'un ordre RF à une prise pilotée ? :slight_smile:

Merci d'avance !

Si vous faites une recherche google sur "Power Off Delay Circuit" ou "Power fail delay circuit" vous verrez des petits montages pas très compliqués à réaliser - par exemple celui ci

bonjour,
petit projet intéressant.
Pour ma part, au lieu d'utiliser le BT (à moins que tu ne veuille faire autre chose avec) j'aurais utilisé un seul arduino avec comme le suggère J-M-L une réserve de courant.
un prise RF chicon par exemple sur le slave.

on allume le lampadaire, l'arduino se met en route et envoie le code à la prise slave pour allumer l'autre lampadaire.
une trame ou deux pour confirmer l'ordre.
on éteind, le maitre envoie l'ordre extinction au slave avant de tomber en sommeil profond.

Au pire, tu ajoute sur le slave un BT pour communiquer avec ton smartphone pour envoyer des ordres à d'autres prises chicon via d'autres trames.

Merci beaucoup à tous les 2 ! :slight_smile:

Effectivement, j'ai utilisé BT pour deux raisons :

  • Parce que j'avais envie d'utiliser BT, j'étais curieux de voir comment cela fonctionne ;
  • Et surtout parce que je ne voyais pas comment faire un Power Off Delay Circuit. :slight_smile:
    En clair je suis très à l'aise avec la programmation de l'Arduino (puisque je suis informaticien de métier) mais beaucoup moins en ce qui concerne l'électronique, c'était ma formation pour passer le Bac en France mais ça remonte à trop loin :frowning:

Ce qui veut dire que j'arrive à lire le schéma qui m'a été donné par J-M-T, mais pas à l'adapter à mes besoins : de ce que je vois ce schéma prend 12 V de tension en entrée, or l'Arduino est alimenté par 5 V, ce qui veut dire que les valeurs des composants doivent être ajustés ?

De plus, le PIN "OUT" marqué sur le schéma indique que c'est cet endroit qui doit être connecté à un PIN en entrée de l'Arduino et que je dois faire un digitalRead sur ce PIN ? :frowning:

Et de ce que je comprends, le delay de ce schéma est de 47 secondes, ce qui me semble beaucoup trop, je pense que 5 secondes max suffirait, ce qui veut dire que je dois prendre un resistor R4 plus petit ? Donc si je comprends (désolé je me trompe...) je devrais prendre R4 = 50 K-Ohm et laisser le capacitor à 100µF, ce qui fait 50K * 0,0001 = 5 secondes ? :frowning:

Désolé j'atteins déjà mes limites car mes cours remontent vraiment à trop loin :frowning: