Veilleuse_de_nuit_esp8266_arduino_led_rgb

Veilleuse sur pile à base de ESP8266, Arduino et LED RGB

Et oui lorsque l’on a un enfant, on cherche toujours un moyen de le rassurer la nuit et surtout pour qu’il nous laisse dormir tranquillement :). La solution la plus répandue reste de mettre en place une veilleuse. Il en existe de toutes les formes, sur pile, sur secteur, avec une ou plusieurs couleurs, détection de luminosité, projection sur les murs ou les plafonds… bref il en existe des tonnes. voyez par vous même sur Amazon…

Vu que j’aime bien faire les choses par moi-même et que j’avais déjà une base pour réaliser ce projet, je me suis lancé sur ce thème.

Ma note :

Votre note :

Click to rate this post!
[Total: 8 Average: 4.1]

 

Conception de la veilleuse

Pour élaborer ma veilleuse, j’utilise la base de mon capteur de température/humidité WiFi sur pile. En effet, il a presque tout ce dont j’ai besoin comme :

  • Un microcontrôleur  (l’ESP8266 sur lequel je vais désactiver le WiFi)
  • Un Timer (le TPL5110) qui me permettra de jouer les scénarios de lumières pendant X temps
  • Un PCB tout fait avec un support de pile rechargeable (CR123A 3.6v)
  • Des IOs accessibles

Face avant du capteur temperature humidité version 2ESPIOT capteur T/H WiFi

Il ne me manque qu’une partie pour ce projet, c’est la LED. J’ai donc choisi d’intégrer une LED RGB classique.

LED RGBLED RGB

Dans cet article, c’est cette partie que je vais vous expliquer.

Ce projet est en soi relativement simple (4-5 composants max) à rajouter mais il va nécessiter de faire une schématique, un design et des modifications mécaniques pour l’adapter à l’ESPIOT.

En effet, pour réaliser ce projet, je vais devoir monter une carte fille qui viendra se « plugger » sur la carte mère (ESPIOT)

Face avant du capteur T/H version 2

Je vais utiliser :

  • La masse GDM
  • La patte Red sur GPIO12(MISO)
  • La patte Green sur GPIO13(MOSI)
  • La patte Blue sur GPIO4 (SDA)

Pour le timer TPL5110, je devrai le configurer en mode « ONE SHOT » (dessouder un pont). Sur l’appuie du bouton, le timer va :

  • Déclencher l’alimentation de l’objet.
  • Le scénario de lumière va être joué en boucle jusqu’à atteindre le temps voulu.
  • Le timer coupera l’alimentation.

Pour la partie boitier, je vais utiliser le même boitier que le capteur ESPIOT (mes fameuses boules… ;))

bulle-blanche-oplain-ballkit2Boitier de la veilleuse

Achats

Pour les achats, c’est assez simple puisqu’il faut acheter presque la même chose que le capteur ESPIOT sans le capteur de température/humidité, mais avec une LED RGB.

PrixPUAction
ESP12F1.92€1.92€
MOSFET Canal N1.15€ (les 10)0.12€
Timer TPL51110.858€0.858€
Support pile5.05€ (les 5)1.05€
LEDs RGB6.5€ (les 50)0.13€
Plaque de cuivre1.5€1.5€
Bulles blanches 5CM5.46€ (les 10)0.55€
Pile CR123A 3.7v recheargeable5.39€ (les 2)2.70€
TOTAL9€

Réalisation de la veilleuse

Pour utiliser une LED RGB, il y a quelques règles à respecter. En effet, il faut s’assurer de plusieurs points pour ne pas avoir de surprises:

La tension

Ça peut paraître étrange, mais sur ce type de LED, la tension appliquée à chaque couleur doit être différente. Pour des raisons physiques [voir explications], la production d’une longueur d’onde (la couleur) se fait par des composants différents. Du coup, l’alimentation est différente. Par exemple :

  • Le rouge nécessite souvent une alimentation de 1.8V
  • Le bleu nécessite une alimentation de 3.0 -3.3V
  • Le vert nécessite une alimentation de 2.4V

Pour le moment, ces tensions restent compatibles avec la tension délivrée par les GPIOs de l’ESP8266 qui délivre jusqu’à 3.3V.

Le courant

Le courant de fonctionnement pour ce type de diode est généralement autour de 10mA. (bien entendu, je généralise mais il faut quand même s’assurer de ce type d’informations en épluchant la datasheet du composant).

Cette fois-ci pas de distinction entre les couleurs, chaque patte accepte un courant max de 10mA.

Ce courant est aussi compatible avec les GPIOs de l’ESP8266 qui est capable de fournir jusqu’à 12mA.

Pour conclure, cette mini étude permet de valider le matériel et de choisir une schématique simplifiée et adaptée. (Pas besoin d’utiliser des transfos ou d’alimentation externe).

Il ne reste plus qu’à calculer les valeurs des résistances pour monter le système. Voici la règle de calcul à suivre :

(Tension GPIO - Tension diode) / Courant de fonctionnement = Valeur de résistance

Couleur rouge :

(3.3-1.8) / 10 = 150 ohm

Couleur verte :

(3.3-2.4)/10 = 90 ohm

Couleur bleu :

(3.3-3)/10 = 30 ohm

Réalisation du circuit

schematique_veilleuseSchématique carte fille veilleuse

Comme on peut le voir, le schéma est enfantin. Attention, la LED que j’ai choisi est à cathode commune. C’est à dire que le pôle négatif est commun aux 3 couleurs. Cependant, il existe le même type de LED avec anode commune. Je ne le répèterai jamais assez, il faut toujours bien vérifier ce type de données en consultant la datasheet.

PCB_LED_RGBRéalisation du PCB selon schématique

Dernière étape, paramétrer le Timer en mode « ONE SHOT » et pendant 20 min.

Timer_veilleuse_config

Comme je le disais précédemment, il va falloir changer la configuration du timer TPL5110:

  • Pour le passer en mode « ONE SHOT », il faudra supprimer le pont (rond rouge 0)
  • Pour changer la durée à 20 min, il faudra remplacer les résistances en parallèle par les valeurs suivante (rond jaune 0) :
    • 100K
    • 330K

Modification faite, la veilleuse jouera ses scénarios de couleurs pendant 20 minutes puis coupera l’alimentation. seul un appuie sur le bouton poussoir relancera la veilleuse.

Sketch Arduino

[pastacode lang= »c » manual= »%23include%20%3CESP8266WiFi.h%3E%0Aextern%20%22C%22%20%7B%0A%23include%20%3Cuser_interface.h%3E%0A%7D%0A%23define%20FPM_SLEEP_MAX_TIME%200xFFFFFFF%0A%0Aint%20redPin%20%3D%204%3B%0Aint%20greenPin%20%3D%2013%3B%0Aint%20bluePin%20%3D%2012%3B%0A%0A%2F%2Funcomment%20this%20line%20if%20using%20a%20Common%20Anode%20LED%0A%2F%2F%23define%20COMMON_ANODE%0A%0Avoid%20setup()%0A%7B%0A%20%20pinMode(redPin%2C%20OUTPUT)%3B%0A%20%20pinMode(greenPin%2C%20OUTPUT)%3B%0A%20%20pinMode(bluePin%2C%20OUTPUT)%3B%20%20%0A%7D%0A%0Avoid%20early_init()%0A%7B%0A%20%20WiFi.persistent(false)%3B%0A%20%20WiFi.mode(WIFI_OFF)%3B%0A%20%20WiFi.forceSleepBegin()%3B%0A%20%20wifi_station_disconnect()%3B%0A%20%20wifi_set_opmode(NULL_MODE)%3B%0A%20%20wifi_set_sleep_type(MODEM_SLEEP_T)%3B%0A%20%20wifi_fpm_open()%3B%0A%20%20wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME)%3B%0A%7D%0A%0Avoid%20loop()%0A%7B%0A%20%20int%20i%3D0%3B%0A%20%20for%20(i%3D0%3Bi%3C255%3Bi%2B%2B)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(i%2C%200%2C%200)%3B%20%20%2F%2F%20red%0A%20%20%7D%0A%20%20for%20(i%3D255%3Bi%3D%3D0%3Bi–)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(i%2C%200%2C%200)%3B%20%20%0A%20%20%7D%0A%20%20delay(1000)%3B%0A%20%20for%20(i%3D0%3Bi%3C255%3Bi%2B%2B)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(0%2C%20i%2C%200)%3B%20%20%2F%2F%20green%0A%20%20%7D%0A%20%20for%20(i%3D255%3Bi%3D%3D0%3Bi–)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(0%2C%20i%2C%200)%3B%20%20%0A%20%20%7D%0A%20%20delay(1000)%3B%0A%20%20for%20(i%3D0%3Bi%3C255%3Bi%2B%2B)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(0%2C%200%2C%20i)%3B%20%20%2F%2F%20blue%0A%20%20%7D%0A%20%20for%20(i%3D255%3Bi%3D%3D0%3Bi–)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(0%2C%200%2C%20i)%3B%20%20%0A%20%20%7D%0A%20%20delay(1000)%3B%0A%20%20%20for%20(i%3D0%3Bi%3C255%3Bi%2B%2B)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(i%2C%20i%2C%200)%3B%20%20%0A%20%20%7D%0A%20%20for%20(i%3D255%3Bi%3D%3D0%3Bi–)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(i%2C%20i%2C%200)%3B%20%20%2F%2Fyellow%0A%20%20%7D%0A%20%20delay(1000)%3B%20%20%0A%20%20%20for%20(i%3D0%3Bi%3C255%3Bi%2B%2B)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(i%2C%200%2C%20i)%3B%20%20%0A%20%20%7D%0A%20%20for%20(i%3D255%3Bi%3D%3D0%3Bi–)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(i%2C%200%2C%20i)%3B%20%20%2F%2Fpurple%0A%20%20%7D%0A%20%20delay(1000)%3B%0A%20%20for%20(i%3D0%3Bi%3C255%3Bi%2B%2B)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(0%2C%20i%2C%20i)%3B%20%20%2F%2F%20blue%0A%20%20%7D%0A%20%20for%20(i%3D255%3Bi%3D%3D0%3Bi–)%0A%20%20%7B%0A%20%20%20%20delay(10)%3B%0A%20%20%20%20setColor(0%2C%20i%2C%20i)%3B%20%20%2F%2Faqua%0A%20%20%7D%0A%20%20delay(1000)%3B%0A%7D%0A%0Avoid%20setColor(int%20red%2C%20int%20green%2C%20int%20blue)%0A%7B%0A%20%20analogWrite(redPin%2C%20red)%3B%0A%20%20analogWrite(greenPin%2C%20green)%3B%0A%20%20analogWrite(bluePin%2C%20blue)%3B%20%20%0A%7D » message= » » highlight= » » provider= »manual »/]

Comme on peut le voir dans le code, je désactive le WiFi et je le fais dès le boot de l’ESP8266 avec la fonction early_init(). En effet, J’ai suivi un tutoriel où on désactive le WiFi dès l’initialisation du microcontrôleur (ce qui permet de ne pas avoir d’appel de courant important à l’initialisation du module). L’inconvénient est qu’il faut toucher au SDK de l’ESP8266 pour rajouter l’appel de la fonction early_init().

Le reste du code est assez classique. On joue avec les couleurs en appliquant une tension sur chaque patte de la LED. L’ESP8266 ayant un convertisseur ADC de 10 bits, les valeurs appliquées à chaque patte peuvent varier de 0 a 1023.

La fonction analogWrite permet d’utiliser le PWM. C’est une méthode permettant de « pulser » en fonction de la valeur (entre 0 et 1023) où 0 correspond à zéro pulse et 1023 une tension constante et non pulsé.

pwm_graph

Graphe de fonctionnement du PWM

L’intérêt du PWM est en quelque sorte de limiter la consommation d’énergie d’une LED sans avoir d’incidence sur le rendu. En effet, notre persistance rétinienne fait que vous ne pourrez pas voir les pulsations ou voir la LED clignotée. Vous ne persevrez qu’une baisse de luminosité.

Bon comme c’est une veilleuse et pas un phare, j’ai configuré la luminosité max à 1/4 (255). Concernant les boucles que j’ai appliqué avec un délai, c’est pour faire ce qu’on appelle un effet « wanadoo », pour que les changements de couleurs soient plus « smoothy ».

Consommations

La consommation de cette veilleuse n’excède pas les 18mA. La pile est une CR123A rechargeable de 800mAh.

Si on utilise la veilleuse tous les soirs pendant 20 min :

(18mA x  1200 ) / 3600 sec = 6mAh

800mAh / 6mAh = 134 utilisations

Le boitier

Pour le boitier on prend les mêmes et on recommence. J’utilise les boules du capteurs de température/humidité sans usiner les petits trous.

boitier_veilleuseBoitier de la veilleuse

Conclusion

Voilà encore un petit projet réalisé. Il ne m’a pris que très peu de temps et coûte presque rien à réaliser. En effet, lorsque l’on rebondi de projet en projet, on s’aperçoit que ce qui a été déjà fait peut être détourné ou réutilisé pour d’autres choses.

C’est pour cette raison que j’essaie au maximum de penser à d’autres utilités possibles lorsque que j’étudie un projet. Vous verrez dans beaucoup de mes articles que je réutilise constamment ce que j’ai déjà fait. D’ailleurs, je pense que le projet ESPIOT va être au menu très souvent…

Bref, je me suis amusé, ça ne m’a pratiquement rien coûté (temps et argent) et ma fille est contente parce qu’elle a un nouveau jouet.

Lien Github

One comment

  1. Beau projet. Il y a juste une petite erreur dans ton code Arduino qui explique que les couleurs ne s’éteignent pas progressivement mais d’un coup. Dans tes boucles for au moment de l’extinction, tu devrais avoir : for (i=255;i>0;i–).

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.