Création d'un timer lumineux sur un miroir

Bonjour à tous !

Je vous explique mon projet et mon besoin :
Je possède un miroir dans ma salle de bain avec une bande led intégrée tout autour

Vu que j'ai des enfants, je voulais pouvoir utiliser ce bandeau led pour faire clignoter le bandeau durant le temps de brossage des dents :smiley:
J'imaginais avoir un bouton situé sur le côté du miroir, et quand on appuie dessus, on lance un scénario qui va jouer sur le bandeau afin d'indiquer le temps correct pour se brosser les dents.
Puis j'ai poussé la réflexion un peu plus loin en me disant que je pourrais mettre un bandeau led adressable et programmer un genre de timer lumineux qui indiquerai le temps restant : Au début, toutes les diodes sont rouges et à chaque seconde passée, 1 (ou plusieurs) diode passe au vert jusqu’à ce que toutes les diodes soient vertes, et indiquent que le temps est écoulé.

J'ai des notions de développements et je ne suis fermé à rien tant que je trouve de l'aide ou des tutos pour apprendre.
En cherchant ce qu'il est possible sur Internet, j'imagine l'utilisation d'un Wemos D1 mini avec un strip led WS2812.

Pour le moment, j'ai acheté un Starter Kit "ELEGOO Arduino Carte UNO R3" histoire d'avoir tout ce qu'il faut pour apprendre. J'ai aussi un strip led adressable WS2812 de 5m et une alimentation 5V/10A pour alimenter le tout :slight_smile:
Grace à quelques tutos sur Internet, ainsi qu'au cours d'OpenClassRoom sur Arduino, je maitrise les bases et j'arrive à controler mes LED sur un Arduino UNO branché directement au PC via la bibliothèque Adafruit.

Pour la programmation, je ne m'inquiète pas :slight_smile:
C'est plutôt sur la partie électronique que j'aurai besoin d'aide car j'aimerais valider mon montage avant de tout assembler et ne pas cramer mes composants !
S'il y a des experts en électronique, pouvez-vous me dire ce que vous en pensez :

Voici les infos sur les résistances et condensateurs utilisés :

  • R1 10KΩ : résistance pull-down pour éviter le comportement ératique du wemos
  • R2 10KΩ : Une résistance entre D6 et GND garantit également que la LED de tête ne reçoit pas un signal incohérent alors que la broche du micro-contrôleur n’a pas encore été programmée en sortie
  • R3 470Ω : résistance pour empêcher le signal de se réfléchir et de perturber la transmission
  • condensateur : 1000µF pour absorber les pics de tension à la mise en route

J'ai récupéré les infos sur différents tutos sur Internet pour ce qui concerne les résistances nécessaires mais j'aimerais valider le tout par quelqu'un de plus compétent avant de faire mes branchements :slight_smile:

Je me ferais un plaisir d'indiquer toutes les étapes ici pour ceux qui serait intéressé par le projet !

Par curiosité - ça fonctionne ?? ne faut-il pas 5V sur la broche data (D0) de votre bande lumineuse ? (La sortie D6 du wemos est à 3.3V en HIGH - c’est suffisant pour un high en 5V généralement mais mon expérience avec des bandeaux chinois pas chers - surtout s’ils sont longs - c’est que parfois on a un comportement erratique, vu plus souvent sur des WS2812 que de l’APA 102)

Moi je sépare l’alim du bandeau de celle de mon arduino et j’alimente aux 2 bouts et au milieu

Bonjour,

En général la commande des WS2812 par un signal 3.3V fonctionne, mais pas du tout garanti car en dehors des spécifications (niveau haut: 0.7*VDD soit 3.5V).
Par contre pourquoi avoir mis une résistance de 10k au gnd qui non seulement ne sert à rien, mais qui en plus risque de faire baisser encore plus la tension de commande.

Alors pour le moment, je n'ai pas testé de contrôler les LED avec le Wemos. J'ai fait des tests uniquement avec un arduino UNO alimenté via le cable USB de l'ordinateur, et le bandeau LED alimenté par une alim 5V/2A.
J'ai suivi les indications de ce site : https://www.kzenjoy.net/2015/ws2812-et-la-lumiere-fut/

Sur son schéma, on voit bien que la borne DIN (DO sur mon dessin) est relié à une sortie numérique du contrôleur :

Je me suis aussi basé sur une vidéo d'Héliox où elle utilise un Wemos pour contrôler des LEDs :

La borne DIN du bandeau est bien reliée à une sortie numérique du Wemos

En fonction de la longueur du bandeau LED, il faudra surement alimenter le bandeau en plusieurs partie. Cf cette image trouvée sur un autre forum :

Ce que je me demande aussi, c'est si mon alimentation 5V peut alimenter mon Wemos avec le branchement que j'ai fait...

kamill:
Par contre pourquoi avoir mis une résistance de 10k au gnd qui non seulement ne sert à rien, mais qui en plus risque de faire baisser encore plus la tension de commande.

J'ai mis cette résistance d'après une info trouvée sur Internet. Voici la raison invoqué :

Une résistance de 10kΩ entre DI et GND garantit également que la LED de tête ne reçoit pas un signal incohérent alors que la broche du micro-contrôleur n’a pas encore été programmée en sortie

C'est apparemment une recommandation d'Adafruit...
Maintenant si cela vous semble inutile, je peux l'enlever. C'est pour ça que je viens poser mes questions :smiley:

Le UNO a ses sorties numériques en 5V alors que votre Wemos sera en 3.3V ce qui changera un peu la donne. Comme le dit Kamill, la spec du WS2812 c'est 3.5V pour un HIGH. Vous n'en êtes pas très loin donc ça peut fonctionner, comme ça peut générer des trucs bizarres parfois. Un petit adaptateur de tension vers 5V pourrait aider (mais à tester sans, si ça vous va)

La raison invoquée pour la résistance de 10k est plus que théorique. En admettant que les leds reçoivent un signal incohérent (ce qui reste à prouver) qu'est ce que ça peut faire puisque tu vas envoyer un signal cohérent dès que le programme aura démarré.
Je n'ai jamais vu cette recommandation dans une doc Adafruit (sauf erreur de ma part).
Je te conseille de ne pas mettre cette résistance, surtout avec un signal 3.3V.

Bonjour,

En cas de problème de communication entre le ruban de leds et le D1 mini, tu dois utilisé un adaptateur pour rendre les tensions compatibles.

Un lien sur un site chinois si tu n'es pas pressé (modèle différent de la photo mais même principe) .

D'accord avec kamill, la résistance n'est la que pour éviter de mettre un signal aléatoire sur la commande du ruban durant la transition de la mise sous tension du montage.
Si tu utilises un bouton poussoir pour lancer le timer, ton montage restera donc constamment alimenté (ou en veille). Donc elle n'est pas vraiment utile.

ticoq:
1- ... Vu que j'ai des enfants,

2- ... J'ai aussi un strip led adressable WS2812

Bonjour
:grin:

1- C'est une situation qui est aussi celle de beaucoup d'individus 8)

2- Cela arrive aussi ici à beaucoup :wink:

Je suppose que tu ne va pas oublier le prénom de chacun de tes enfants? :smiley: , mais est tu sûr et certain que ton strip/ruban soit basé sur de la "WS2812" et pas plutôt sur de la "WS2812B ?
Les circuits de protections interne ne sont pas les mêmes

Statistiquement , il y a plus de chances là que tu ai un "ruban" de WS2812B que de WS2812
Si c'est le cas comme je le pense et comme déjà répondu initialement par Kamill , oublie cette 10K surtout dans une config DIN (OUT ESP) 3.3V

En relisant tes posts où tu exposes ton besoin, je ne vois pas l'intérêt d'utiliser un Wemos D1 pour piloter le ruban de LED.
Si tout fonctionne avec la UNO quel est la raison d'utiliser un Wemos D1?

fdufnews:
En relisant tes posts où tu exposes ton besoin, je ne vois pas l'intérêt d'utiliser un Wemos D1 pour piloter le ruban de LED.
Si tout fonctionne avec la UNO quel est la raison d'utiliser un Wemos D1?

Bonne remarque fdufnews! :smiley:

Lancer le "top depart brossage " par internet/telephone Papa ? :grin:

kamill:
La raison invoquée pour la résistance de 10k est plus que théorique. En admettant que les leds reçoivent un signal incohérent (ce qui reste à prouver) qu'est ce que ça peut faire puisque tu vas envoyer un signal cohérent dès que le programme aura démarré.
Je n'ai jamais vu cette recommandation dans une doc Adafruit (sauf erreur de ma part).
Je te conseille de ne pas mettre cette résistance, surtout avec un signal 3.3V.

OK, on va essayer sans :slight_smile:

Zlika:
En cas de problème de communication entre le ruban de leds et le D1 mini, tu dois utilisé un adaptateur pour rendre les tensions compatibles.

Effectivement, je n'avais pas pensé à ça.
J'ai déjà acheté mes bandes LED sur des sites chinois, donc "attendre", je sais faire :smiley:

Artouste:
est tu sûr et certain que ton strip/ruban soit basé sur de la "WS2812" et pas plutôt sur de la "WS2812B ?

Ce sont effectivement des WS2812B (marque BTF-lightning)

fdufnews:
En relisant tes posts où tu exposes ton besoin, je ne vois pas l'intérêt d'utiliser un Wemos D1 pour piloter le ruban de LED.
Si tout fonctionne avec la UNO quel est la raison d'utiliser un Wemos D1?

Je pensais utiliser un Wemos car le Uno me semble un peu disproportionné pour l'utilisation que j'en ai :slight_smile:
Et puis le Uno a besoin d'une alimentation différente du bandeau Led (9V si je ne me trompe), donc ça m'obligerait a avoir une 2ème alim rien que pour lui. Déjà que je n'ai pas énormément de place derrière le miroir...
Et l'autre raison, c'est que j'ai un peu de domotique à la maison, donc ça m'intéressais de tester le Wemos :stuck_out_tongue:
Si je me rend compte que je n'ai pas besoin du Wifi, un Arduino nano suffirai selon vous ?

ticoq:
...
un Arduino nano suffirai selon vous ?

"nano" sous 5V et ws2812B
c'est... "fingers in the nose" 8)

ticoq:
Je pensais utiliser un Wemos car le Uno me semble un peu disproportionné pour l'utilisation que j'en ai :slight_smile:
Et puis le Uno a besoin d'une alimentation différente du bandeau Led (9V si je ne me trompe), donc ça m'obligerait a avoir une 2ème alim rien que pour lui.

S'agissant des proportions cela dépend de quoi on parle. Le Wemos est 10x plus puissant que l'arduino. Par contre l'arduino est plus volumineux.

Pour l'alimentation de la UNO. Tu peux l'alimenter directement en 5V sur son entrée 5V plutôt que par le "jack" qui effectivement demande une tension supérieur.

ticoq:
Et l'autre raison, c'est que j'ai un peu de domotique à la maison, donc ça m'intéressais de tester le Wemos :stuck_out_tongue:

Raison de plus pour garder le Wemos afin d'en faire un objet connecté.

ticoq:
un Arduino nano suffirai selon vous ?

La nano présente des performances identiques à la UNO.

Artouste:
"nano" sous 5V et ws2812B
c'est... "fingers in the nose" 8)

Ca c'est une bonne nouvelle. Je vais tester avec le wemos, en attendant de commander un nano sur AliExpress :slight_smile:

Autre question que je me pose :
Est-il possible d'alimenter mon contrôleur (Uno, nano, wemos) avec mon alimentation 5V/10A directement sur les bornes 5V/GND ?
Dans la plupart des projets, ils passent par le câble micro-usb pour les alimenter en 5V. Cela ne m'arrange pas car je n'ai pas envie d'avoir un transfo supplémentaire derrière mon miroir juste pour ça...
Ou alors si je coupe un cable micro-usb, je peux le relier à mon alim directement ?
Cette solution me semble viable, mais j'aimerais en être certain...

Hello à tous !

Le projet est terminé et en place :slight_smile:
Ça m'aura pris un peu de temps pour récupérer tout le matériel, tester diverses config et m'assurer qu'il n'y ai pas de bug dans le code.

J'ai un peu modifié le circuit électrique en partant sur un Arduino nano et en branchant le 5V/gnd sur 2 bornes du bandeau led. J’ai donc du rajouter un condensateur sur le chemin :

Je vous met aussi une petite vidéo de démo : - YouTube

Et pour le code source, c'est là :

#include <Adafruit_NeoPixel.h>

int pinBouton = 5;
int pinData = 7;
float nbLed = 205.0;
float nbSec = 60.0;
int laps = 3;
int currentLap = 1;
int brightness = 100;
int timer = 100;
long launchChrono = 0;
long endLap = nbSec*timer*10;
int color[3][3]={255,0,0,
                 0,0,255,
                 255,255,0};


Adafruit_NeoPixel strip = Adafruit_NeoPixel(nbLed, pinData, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  Serial.println("lancement du programme");
  pinMode(pinBouton,INPUT_PULLUP);
  setWhite();
}


void loop() {
  boolean etatBouton=digitalRead(pinBouton);
  if(!etatBouton)  {
    launchChrono = timer;
    currentLap = 1;
  }
  if(launchChrono) {scenario();}
  delay(timer);
}

void scenario(){
  if (launchChrono == timer && currentLap == 1){
      Serial.println("lancement du scénario");
      setWhite();
  }

  int ledToChange = round(launchChrono/((nbSec/nbLed)*timer*10));
  Serial.print(" | launchChrono : ");    
  Serial.print(launchChrono);
  Serial.print(" | ledToChange : ");    
  Serial.println(ledToChange);
  for(int i = 0; i <= ledToChange; i++ ) {
    int j = currentLap-1;
    int k = i+5;
    strip.setPixelColor(k, color[j][0], color[j][1], color[j][2]);
  }
  strip.setBrightness(brightness);
  strip.show(); // on affiche

  if (launchChrono == endLap && currentLap != laps){
    launchChrono = timer;
    currentLap++;
  } else {
    launchChrono += timer;
  }

  // FIN DU SCENARIO
  if (launchChrono > endLap && currentLap == laps) {
    launchChrono = 0;
    currentLap = 1;
    setWhite();
    Serial.println("Fin du scénario");
  }
}

void setWhite(){  
  strip.begin();
  for(int i = 0; i <= nbLed; i++ ) {
    int k = i+5;
    strip.setPixelColor(k, 255, 255, 255);
    //delay(10);
  }
    strip.setBrightness(brightness);
    strip.show();
}

Ce code peut bien sur être modifié, amélioré, personnalisé !
Il y a certains éléments qui dépendent de mon besoin, comme par exemple le fait de ne pas allumer les 5 premières led car elles sont derrière le miroir, et donc non visible.

C'est bien sympa ! Il y a une rubrique projet fini dans le forum, histoire qu'on retrouve plus facilement les projets qui fonctionnent :wink:

Belle réalisation - merci pour le partage ! +1 Karma

(et oui, éventuellement postez un tuto dans les projets finis)