La Caverne du néophyte | Arduino

La Caverne du néophyte | Arduino - Nano-ordinateur, microcontrôleurs, FPGA - Electronique, domotique, DIY

Marsh Posté le 27-12-2017 à 13:53:19    

Salut tout le monde  :hello:  
 
J'écris aujourd'hui ces quelques lignes car j'ai depuis quelques semaines développé un intérêt particulier pour les technologies "embarquées" type Arduino, Raspberry etc...
 
J'ai acheté il y a peu un starter kit Arduino composé d'une chié de capteurs en tout genre et autres composants électroniques !  
 
Grand amateur du faire sois même (DIY) et autre technologies numérique etc, je prends pas mal de plaisir a faire des petits montages vraiment bidons et je commence donc a me faire une liste non exhaustive de projets plutôt ambitieux ( a mes yeux)
 
 
 
La Fameuse liste de mes projets :
 
- Une lampe de chevet/bureau  
- Un Radio réveil intelligent  
- Domotique (Lumières, média, etc)
 
 
Si j'écris ce post c'est dans un premier temps pour partager mon expérience ! Il y a encore une semaine je ne souvenais même plus de certaines bases en électronique (pourtant acquises il y a pas si longtemps).
Je suis en pleine progression et je pars de zéro ce qui je pense permet de vraiment montrer aux débutants qu'avec un peu de détermination et d'ambition on peux accomplir de grandes choses :)  
 
Dans un second temps c'est bien évidement pour apprendre, demander conseil quand google ne parvient pas a m'aider.
(Je vais pas vous bombarder de questions rassurez vous ! ;) )
 
En ce qui concerne toute la partie réalisation j'ai comme je l'ai dit plus haut un kit Arduino acheté sur Amazon
Pour les intéressés : https://www.amazon.fr/gp/product/B0 [...] UTF8&psc=1
 
Je fait actuellement des études dans le milieu de l'informatique et j'ai des cours sur la programmation en C# ce qui fait que j'ai déjà des bonnes bases sur le fonctionnement du langage ainsi que sa syntaxe :)  
 
J'ai aussi tout le matériel nécessaire au bon déroulement de tout projet (Outillage, imprimante 3D etc)  
 
J'insiste sur le fait que je créer principalement ce topic dans un but de partager mon expérience (certes faibles pour le moment) et mes démarches aux autres personnes dans ma situation.
 
J'ai été surpris de la quantité d'informations que l'on trouve sur le web mais du peux de projet vraiment partagés et expliqués dans le détail !  
 
Je vais donc dans les prochains jours commencer par mon tout premier projet, et de loin le plus simple je pense, j'ai nommé :  La lampe de Chevet !
 
Je vous mettrais le plus régulièrement possible a jour ce topic de manière a ce que vous puissiez suivre mon avancement dans ma quête du savoir  :jap:  
 
Si vous avez des suggestions de projets ou quoi que ce soit que vous jugeriez intéressant de me partager ne vous en privez pas :) On est la pour ça avant tout je pense ;)  
 
 
@+


Message édité par Bad_57 le 27-12-2017 à 13:53:51
Reply

Marsh Posté le 27-12-2017 à 13:53:19   

Reply

Marsh Posté le 30-12-2017 à 17:23:36    

Salut  :hello:  
 
Bon aujourd'hui j'ai commencé un peu a bosser sur mon projet de lampe de chevet !  
 
J'ai donc commencer a réaliser des plans afin de mieux visualiser la forme que je veux lui donner !  
 
J'ai fais des plans sur papier et je compte les repasser au propre sur support numérique rapidement (Pour pouvoir vous les partager)
 
J'ai aussi réaliser le modèle .STL du "Haut" de ma lampe sur Fusion 360 (je vous passe le lien dans les prochains jours) !
 
J'ai également commander un bandeau de LED d'1m de long dont les LED sont adressables individuellement !  
 
Lien : https://www.amazon.fr/gp/product/B0 [...] UTF8&psc=1
 
En ce qui concerne les fonctionnalité j'aimerais partir sur :
 
- Base de la lampe en bois  
- Haut de la lampe en PLA Translucide (Impression 3D)
- Usage d'un Bandeau de LED 5V DC  
- 2 Boutons (ON/OFF) & (SELECT) pour la selection du mode d'éclairage
- 1 module IR pour permettre un control de la lampe a distance a l'aide d'une télécommande  
- ?? Un Module MB 102 Pour l'alimentation de la carte et des led ??  
 
Question :
 
L'usage d'un arduino nano est-il envisageable dans ce projet ?
Sachant qu'il devra assurer :  
 - Alimentation du bandeau de LED
 - Gestion des modes d'éclairage
 - Gestion des boutons
 - Gestion du module IR
 
J'ai a ma disposition un power supply de ce type : http://www.dx.com/fr/p/mb102-bread [...] ke8Vt_ibIU
 
Je pense qu'il doit être possible d'alimenter le bandeau a partir de cette alim et au passage alimenter l'arduino ?
 
En ce qui concerne le module IR j'ai essayé de faire fonctionner celui présent dans mon kit sans grand succès !
 
J'éditerais ce post prochainement pour les plans et modèles :)
 
@+ et bonnes fêtes  :jap:  :hello:


Message édité par Bad_57 le 30-12-2017 à 17:28:52
Reply

Marsh Posté le 30-12-2017 à 18:05:54    

Tu comptes faire comment pour alimenter ton bandeau qui doit bouffer facile 3A ou plus avec ce que tu nous montres là ? :heink:. A moins de réduire le bandeau à quelques cm y a un truc qui m'échappe...


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 30-12-2017 à 20:12:48    

Citation :

Tu comptes faire comment pour alimenter ton bandeau qui doit bouffer facile 3A ou plus avec ce que tu nous montres là ? :heink:. A moins de réduire le bandeau à quelques cm y a un truc qui m'échappe...


 
Disons que initialement c'était un peu ma question  :sarcastic:  
 

Citation :


- ?? Un Module MB 102 Pour l'alimentation de la carte et des led ??
 
Je pense qu'il doit être possible d'alimenter le bandeau a partir de cette alim et au passage alimenter l'arduino ?  
 


 
Et je pense que la taille du bandeau n’excédera pas les 10 cm ! J'ai prévu de faire une lampe de chevet, pas un phare côtier ;)


Message édité par Bad_57 le 30-12-2017 à 20:18:37
Reply

Marsh Posté le 30-12-2017 à 22:55:28    

- 10cm... Tu veux un truc qui puisse vraiment éclairer (genre pour lire en dessous) ou juste une loupiotte d'ambiance ? Tu as déjà vu ce que produisent ces bandeaux ?
 
- La description du bandeau est très moisie mais il me semble qu'il faut y ajouter un driver de led non ?
 
- Pour moi ton MB102 est loin du compte et ne fera quasiment rien de plus que le régulateur présent de base sur l'Arduino, mais bon pour 10cm pourquoi pas.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 31-12-2017 à 10:13:32    

Je te trouve un peu dur TotalRecall, Bad_57 débute.
 
Le MB102 n'est pas destiné à être utilisé dans un produit fini, c'est destiné à alimenter un breadboard comme ça :
 
http://reho.st/www.locoduino.org/local/cache-vignettes/L315xH457/breadboard-alim-db99e.png
 
Je ne pense pas qu'il y ai besoin de driver pour ce bandeau. D'après le descriptif, c'est du WS2812b, donc pilotable avec un Arduino avec la lib NeoPixel ou FastLED.
 
Par contre, c'est sûr que c'est pour de l'éclairage d'ambiance uniquement ; ne serait-ce que parce que lire sous une lumière violette, orange ou bleue, non merci :D
 
Il faut compter 50-60 mA par LED. Un Arduino seul ne pourra donc pas être utilisé pour alimenter le ruban (il sera même trop juste pour alimenter une seule de ces LEDs). 10cm d'un bandeau à 60 LEDs/m, ça sera donc 6 LEDs à alimenter. En se donnant une marge de sécurité, ça fait à peu près 400mA à débiter pour allumer tes 10cm de LEDs. Pourquoi ne pas alimenter tout ça avec une alimentation 5V / 500 mA ? N'importe quel chargeur de téléphone est capable de débiter ça, par exemple.
 
Pour ma part, je partirai sur un prototype sur Arduino, puis une réalisation du produit fini avec un simple ATTiny qui prendra bien moins de place et qui ne proposera que le strict nécessaire. Avec 6 I/O, il serait amplement suffire pour ce que tu veux faire.


Message édité par MossieurPropre le 31-12-2017 à 10:14:39
Reply

Marsh Posté le 31-12-2017 à 11:55:18    

Merci pour ta réponse !  
 
 

Citation :

Par contre, c'est sûr que c'est pour de l'éclairage d'ambiance uniquement ; ne serait-ce que parce que lire sous une lumière violette, orange ou bleue, non merci :D  


 
Je ne suis pas amateur de lecture donc disons que c'est vraiment sur un principe d'éclairage d'ambiance que je réalise ce projet ! Apres si j'arrive a trouver une teinte de blanc qui tire un peu sur le jaune ça restera tout a fait possible de lire :) Dans la limite ou l'intensité de l'éclairage le permet !  
 

Citation :

Il faut compter 50-60 mA par LED. Un Arduino seul ne pourra donc pas être utilisé pour alimenter le ruban (il sera même trop juste pour alimenter une seule de ces LEDs). 10cm d'un bandeau à 60 LEDs/m, ça sera donc 6 LEDs à alimenter. En se donnant une marge de sécurité, ça fait à peu près 400mA à débiter pour allumer tes 10cm de LEDs. Pourquoi ne pas alimenter tout ça avec une alimentation 5V / 500 mA ? N'importe quel chargeur de téléphone est capable de débiter ça, par exemple.  


 
Je me suis pas mal documenter hier soir suite aux remarques interessantes de TotalRecall sur le fait de devoir alimenter tout ce petit monde et j'ai donc lu pas mal de docs et vu pas mal de videos ! Et je parvenais au meme résultat que toi ! En partant du principe que je ne garde que 10 cm du bandeau je tapperais comme tu las dit 400mA max et j'ai vu sur une vidéo que l'on pouvois pomper jusqua 500mA max sur un arduino uno ! ce qui me laisse croire que c'est faisable !  
 

Citation :

Pour ma part, je partirai sur un prototype sur Arduino, puis une réalisation du produit fini avec un simple ATTiny qui prendra bien moins de place et qui ne proposera que le strict nécessaire. Avec 6 I/O, il serait amplement suffire pour ce que tu veux faire.


 
J'ai aussi vu ce procédé sur une vidéo que je suivrais sans doute dans la phase finale du projet !
 
En ce qui concerne le pilotage des LED comme tu l'as dis il faut utiliser la lib FastLED ou NeoPixel (au passage simple d'utilisation) pour contrôler tout ça donc a priori pas de driver ou quoique ce soit d'autre !  
 
 
Merci beaucoup pour vos réponses et votre aide ! Je vais continuer a récupérer quelques petites infos ici et la pour peaufiner tout ça et avancer dans la partie matérielle du projet !  
 
A bientôt et bon réveillon  :jap:  
 

Reply

Marsh Posté le 31-12-2017 à 12:27:13    

Bad_57 a écrit :

Merci pour ta réponse !  
 
[...]
 
Je me suis pas mal documenter hier soir suite aux remarques interessantes de TotalRecall sur le fait de devoir alimenter tout ce petit monde et j'ai donc lu pas mal de docs et vu pas mal de videos ! Et je parvenais au meme résultat que toi ! En partant du principe que je ne garde que 10 cm du bandeau je tapperais comme tu las dit 400mA max et j'ai vu sur une vidéo que l'on pouvois pomper jusqua 500mA max sur un arduino uno ! ce qui me laisse croire que c'est faisable !  
 
[...]
 
A bientôt et bon réveillon  :jap:  
 


 
Tu peux tirer 40 mA par pin, après ça crame. A moins d'alimenter 1 LED par PIN (bon courage pour les soudures direct sur le bandeau), la solution de l'alim externe sera plus viable.
 
D'une manière générale, on considère que le régulateur de l'Arduino peut délivrer 200-250 mA avant de commencer à chauffer sérieusement.

Reply

Marsh Posté le 31-12-2017 à 14:10:15    

Citation :

D'une manière générale, on considère que le régulateur de l'Arduino peut délivrer 200-250 mA avant de commencer à chauffer sérieusement.
 


 
Ok c'est bon a savoir ! De toute manière l'arduino sera alimenté depuis un petit transfo de téléphone portable donc je devrais réussir a modifier le câble pour alimenter et les led et l'arduino :)


Message édité par Bad_57 le 31-12-2017 à 14:10:46
Reply

Marsh Posté le 31-12-2017 à 14:23:38    

MossieurPropre a écrit :

Tu peux tirer 40 mA par pin, après ça crame.

40mA c'est déjà le "absolute maximum", il vaut mieux rester bien en dessous pour ne pas endommager le AVR à long terme. :o Et il faut aussi penser que la somme des courants tirés sur les sorties passe par les broches d'alimentation du AVR qui ont un "absolute maximum" de 200mA.
(source doc du mega2560, je sais pas quelle variante est utilisée sur tel ou tel Arduino mais les valeurs limites doivent être partout pareil je pense.)

Message cité 1 fois
Message édité par rat de combat le 31-12-2017 à 14:24:03
Reply

Marsh Posté le 31-12-2017 à 14:23:38   

Reply

Marsh Posté le 31-12-2017 à 14:26:08    

rat de combat a écrit :

40mA c'est déjà le "absolute maximum", il vaut mieux rester bien en dessous pour ne pas endommager le AVR à long terme. :o Et il faut aussi penser que la somme des courants tirés sur les sorties passe par les broches d'alimentation du AVR qui ont un "absolute maximum" de 200mA.
(source doc du mega2560, je sais pas quelle variante est utilisée sur tel ou tel Arduino mais les valeurs limites doivent être partout pareil je pense.)


 
:jap:
 
D'une manière générale, si y'a plus q'une LED à alimenter, j'utilise une alim externe :D

Reply

Marsh Posté le 31-12-2017 à 15:13:39    

MossieurPropre a écrit :

D'une manière générale, si y'a plus q'une LED à alimenter, j'utilise une alim externe :D

Il faut distinguer deux choses ici:
Déjà le courant dont on a besoin doit être disponible quelque part, il faut donc une alim adaptée pour l'Arduino (qui peut-être un alim à brancher sur une prise, une pile, un port USB, ...). Il faut aussi penser au fait que le régulateur de tension de l'Arduino ne peut pas délivrer une quantité infinie de courant même si l'alim devant le permettrait, il faut regarder le courant maximal du régulateur et aussi/surtout la puissance dissipée (régulateur linéaire). (Ceci à condition d'utiliser ce régulateur, on peut aussi alimenter l'Arduino directement avec du 5V/3,3V, dans ce cas on n'a pas besoin du régulateur intégré.)
Ensuite si on veut commander une charge par l'Arduino il faut voir si on peut brancher la charge directement sur une sortie (avec tout le courant que tire la charge qui passe par la broche du µC) ou si il faut rajouter un transistor/MOSFET/relais.


Message édité par rat de combat le 31-12-2017 à 15:15:18
Reply

Marsh Posté le 08-01-2018 à 08:41:34    

Salut tout le monde  :hello:  
 
Je voulais faire un petit topo de ma progression vis a vis de mon projet de lampe de chevet !
 
J'ai reçu courant de semaine dernière le bandeau de LED et j'ai déjà pu réaliser plusieurs tests !  
Après mes tests j'ai réaliser que 10 cm de bandeau ne serais pas suffisant j'ai donc pour le moment décider de prendre 20 cm.
Forcement qui dit plus de longueur dit plus de LED et donc plus d'intensité nécessaire du coup j'ai refait mon calcul et j'ai trouvé 800 mA (12*60mA = 720mA)
 
En ce qui concerne la question de l'alimentation j'ai trouvé plusieurs transfos chez moi qui devrais faire l'affaire (5V/1.5A, 5V/1A, etc)
 
J'ai fini les différents modèles 3D pour la partie Boitier :
 
Haut : (Perdu pour le moment je l'ajoute plus tard ici !)
 
Base : https://www.thingiverse.com/thing:2741537
 
J'ai encore quelques modifications a apporter au modèle de la base du boitier (Emplacement Alimentation etc) mais la forme générale est la !  
 
Comme je l'avais dit dans mon tout premier post sur ce topic je voulais réaliser une base en bois, mais après deux essaies ratés de confection de ce dernier j'ai pris la décision de le réaliser en 3D.
Je referais un essaie avec le bois plus tard et procéderais a l'échange quand j'aurais obtenu un résultat satisfaisant :)  
 
A l'heure actuelle je pense que le projet a déjà pas mal avancer ! Il ne me reste plus qu'a écrire le programme pour la gestion de l'éclairage (différents modes avec sélection via bouton poussoir) et l'impression du boiter. Après cela il ne me restera plus qu'a procéder a l'assemblage final :)  
 
 
Je pense que je ferais un gros post récapitulatif quand j'aurais tout fini avec toutes les infos et des photos afin d'aider les autres débutants dans mon genre a s'en sortir :)  
 
Encore merci de votre aide et a bientôt  :jap:  

Reply

Marsh Posté le 08-01-2018 à 09:51:03    

:jap:
 
N'hésite pas à poster des photos de l'avancement ;)

Reply

Marsh Posté le 10-01-2018 à 15:22:48    

Yo  :hello:  
 
Bon j'ai encore avancé sur mon petit projet et je dois dire que je touche au but.
 
J'ai en parti terminé la partie programmation hier, bien que je ne sois pas parvenue a faire tout ce que je voulais !  
Mais ça fonctionne et c'est le principal  :D  
 
Voici le code commenté :)  
 

Code :
  1. // Librairies  
  2. #include "FastLED.h"
  3. // Déclaration Fast Led  
  4. #define NUM_LEDS 48 // Nombre de Leds
  5. #define DATA_PIN 6 // Pin commande du Bandeau
  6. // Variables  
  7. CRGB leds[NUM_LEDS]; // Tableau de Leds. Un Objet par Led
  8. const int Bouton = 2;  // Déclaration Pin Bouton  
  9. int compteur; // Compteur pour le choix du Mode d'éclairage  
  10. int Etat; // Etat du Bouton (HIGH ou LOW)  
  11. void setup() {
  12.   delay(2000);
  13.   FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS); // Definition du type de LED utilisées etc
  14.   pinMode(Bouton, INPUT_PULLUP);
  15.   Serial.begin(9600);
  16.   ledclear();
  17. }
  18. void loop() {
  19.   Etat = digitalRead(Bouton);
  20.   if(Etat == LOW) // Si le bouton est enfoncé  
  21.   {
  22.     Serial.println("0" );
  23.     compteur++; // Incrémentation du compteur
  24.     Serial.println("" );
  25.     Serial.println("Compteur = " ); // Affichage valeur compteur
  26.     Serial.println(compteur); // Affichage valeur compteur
  27.     delay(500);  //Delai pour eviter une incrémentation multiple  
  28.   }
  29.   switch(compteur)
  30.   {
  31.   case 1: // Eclairage Jaune Pâle  
  32.     for(int i; i < NUM_LEDS; i++) // Boucle permettant un allumage progressif du bandeau
  33.     {
  34.       leds[i] = CRGB(186,203,47);
  35.       FastLED.show();
  36.       delay(10);
  37.     }
  38.   break;
  39.   case 2: // Eclairage Bleu
  40.     for(int i; i < NUM_LEDS; i++)
  41.     {
  42.       leds[i] = CRGB::Blue;
  43.       FastLED.show();
  44.       delay(10);
  45.     }
  46.   break;
  47.  
  48.   case 3: // Eclairage mode Arc-En-Ciel
  49.     fill_rainbow(leds, NUM_LEDS, 0, 5); // Couleur type Arc-en-ciel  
  50.     FastLED.show();
  51.   break;
  52.  
  53.   case 4: // Extinction du bandeau  
  54.     ledclear();
  55.     compteur = 0;
  56.   break;
  57.   }
  58. }
  59. void ledclear () // Fonction permettant d'éteindre toutes les leds du bandeau.  
  60. {
  61.   for(int i; i <= NUM_LEDS; i++)
  62.   {
  63.     leds[i] = CRGB::Black;
  64.     FastLED.show();
  65.   }
  66. }


 
Je suis presque sur que mon code est loin d’être optimisé mais bon comme je l'ai dis tout fonctionne donc ça me va :)  
 
A l'heure actuelle je pars du principe que la phase "recherche & développement" du projet est terminée !  
Maintenant il ne me reste plus que la partie réalisation du boitier et le montage final a faire :)  
 
Je reviendrais surement sur mon code plus tard afin de le peaufiner et le rendre plus fonctionnel.
 
Je pense aussi commencer a réaliser de beaux schémas de câblage (que je posterais ici bien-sur !) d'ici fin de semaine pour bien illustrer tout le process :)  
 
Si vous avez des suggestion par rapport au code je suis preneur ;)
 
A Bientôt  :jap:

Reply

Marsh Posté le 10-01-2018 à 16:03:49    

Bad_57 a écrit :

Yo  :hello:  
 
Bon j'ai encore avancé sur mon petit projet et je dois dire que je touche au but.
 
J'ai en parti terminé la partie programmation hier, bien que je ne sois pas parvenue a faire tout ce que je voulais !  
Mais ça fonctionne et c'est le principal  :D  
 
Voici le code commenté :)  
 

Code :
  1. [...]


 
Je suis presque sur que mon code est loin d’être optimisé mais bon comme je l'ai dis tout fonctionne donc ça me va :)  
 
A l'heure actuelle je pars du principe que la phase "recherche & développement" du projet est terminée !  
Maintenant il ne me reste plus que la partie réalisation du boitier et le montage final a faire :)  
 
Je reviendrais surement sur mon code plus tard afin de le peaufiner et le rendre plus fonctionnel.
 
Je pense aussi commencer a réaliser de beaux schémas de câblage (que je posterais ici bien-sur !) d'ici fin de semaine pour bien illustrer tout le process :)  
 
Si vous avez des suggestion par rapport au code je suis preneur ;)
 
A Bientôt  :jap:


 
Niveau lisibilité :

  • Le français dans le code, c'est mal :D
  • Fais attention à la cohérence des formats de tes noms de variables. Y'en a en minuscule, y'en a qui commencent par une majuscule, ...
  • Les constantes devraient être en MAJUSCULE (la "variable" Bouton). D'ailleurs, si elle est constante, autant la déclarer avec un #define


Niveau fonctionnel :

  • Attention aux variable non initialisées ! Tous les "i" dans tes boucles for par exemple. il faut définir "int i = 0". Je suis même surpris que ça fonctionne sans problème, ça
  • Attention à l'utilisation de delay() qui a comme mauvais côté de bloquer le système tant que le délai n'est pas écoulé. (typiquement, quand je suis dans le cas "1" de ton switch, je vais devoir attendre que toutes les LEDs soient allumées avant qu'un appui sur le bouton soit possible. De la même manière, il doit y avoir une latence d'1/2 seconde après chaque appui sur le bouton)


Sinon, ça devrait aller ;)


Message édité par MossieurPropre le 10-01-2018 à 16:04:19
Reply

Marsh Posté le 10-01-2018 à 18:59:02    

Citation :


Niveau lisibilité :  
 
Le français dans le code, c'est mal :D
Fais attention à la cohérence des formats de tes noms de variables. Y'en a en minuscule, y'en a qui commencent par une majuscule, ...
Les constantes devraient être en MAJUSCULE (la "variable" Bouton). D'ailleurs, si elle est constante, autant la déclarer avec un #define
 
Niveau fonctionnel :  
 
Attention aux variable non initialisées ! Tous les "i" dans tes boucles for par exemple. il faut définir "int i = 0". Je suis même surpris que ça fonctionne sans problème, ça
Attention à l'utilisation de delay() qui a comme mauvais côté de bloquer le système tant que le délai n'est pas écoulé. (typiquement, quand je suis dans le cas "1" de ton switch, je vais devoir attendre que toutes les LEDs soient allumées avant qu'un appui sur le bouton soit possible. De la même manière, il doit y avoir une latence d'1/2 seconde après chaque appui sur le bouton)
 
Sinon, ça devrait aller ;)


 
Merci :)  
 
J'ai corrigé la ou je pouvais :)
 

Code :
  1. // Librairies  
  2. #include "FastLED.h"
  3. // Déclaration Fast Led  
  4. #define NUM_LEDS 48 // Nombre de Leds
  5. #define DATA_PIN 6 // Pin commande du Bandeau
  6. // Variables  
  7. CRGB leds[NUM_LEDS]; // Tableau de Leds. Un Objet par Led
  8. #define BUTTON  2  // Déclaration Pin Bouton  
  9. int count; // Compteur pour le choix du Mode d'éclairage  
  10. int buttonState; // Etat du Bouton (HIGH ou LOW)  
  11. void setup() {
  12.   delay(2000);
  13.   FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS); // Definition du type de LED utilisées etc
  14.   pinMode(BUTTON, INPUT_PULLUP);
  15.   Serial.begin(9600);
  16.   ledclear();
  17. }
  18. void loop() {
  19.   buttonState = digitalRead(BUTTON);
  20.   if(buttonState == LOW) // Si le bouton est enfoncé  
  21.   {
  22.     Serial.println("0" );
  23.     count++; // Incrémentation du compteur
  24.     Serial.println("" );
  25.     Serial.println("Compteur = " ); // Affichage valeur compteur
  26.     Serial.println(count); // Affichage valeur compteur
  27.     delay(500);  //Delai pour eviter une incrémentation multiple  
  28.   }
  29.   switch(count)
  30.   {
  31.   case 1: // Eclairage Jaune Pâle  
  32.     for(int i = 0; i < NUM_LEDS; i++) // Boucle permettant un allumage progressif du bandeau
  33.     {
  34.       leds[i] = CRGB(186,203,47);
  35.       FastLED.show();
  36.       delay(10);
  37.     }
  38.   break;
  39.   case 2: // Eclairage Bleu
  40.     for(int i = 0; i < NUM_LEDS; i++)
  41.     {
  42.       leds[i] = CRGB::Blue;
  43.       FastLED.show();
  44.       delay(10);
  45.     }
  46.   break;
  47.  
  48.   case 3: // Eclairage mode Arc-En-Ciel
  49.     fill_rainbow(leds, NUM_LEDS, 0, 5); // Couleur type Arc-en-ciel  
  50.     FastLED.show();
  51.   break;
  52.  
  53.   case 4: // Extinction du bandeau  
  54.     ledclear();
  55.     count = 0;
  56.   break;
  57.   }
  58. }
  59. void ledclear () // Fonction permettant d'éteindre toutes les leds du bandeau.  
  60. {
  61.   for(int i = 0; i <= NUM_LEDS; i++)
  62.   {
  63.     leds[i] = CRGB::Black;
  64.     FastLED.show();
  65.   }
  66. }


 

Citation :


Attention à l'utilisation de delay() qui a comme mauvais côté de bloquer le système tant que le délai n'est pas écoulé. (typiquement, quand je suis dans le cas "1" de ton switch, je vais devoir attendre que toutes les LEDs soient allumées avant qu'un appui sur le bouton soit possible. De la même manière, il doit y avoir une latence d'1/2 seconde après chaque appui sur le bouton)


 
Du coup comment faire pour éviter d'utiliser cette fonction ? Il y a une alternative ?

Reply

Marsh Posté le 11-01-2018 à 08:26:36    

Bad_57 a écrit :

Citation :


Niveau lisibilité :  
 
Le français dans le code, c'est mal :D
Fais attention à la cohérence des formats de tes noms de variables. Y'en a en minuscule, y'en a qui commencent par une majuscule, ...
Les constantes devraient être en MAJUSCULE (la "variable" Bouton). D'ailleurs, si elle est constante, autant la déclarer avec un #define
 
Niveau fonctionnel :  
 
Attention aux variable non initialisées ! Tous les "i" dans tes boucles for par exemple. il faut définir "int i = 0". Je suis même surpris que ça fonctionne sans problème, ça
Attention à l'utilisation de delay() qui a comme mauvais côté de bloquer le système tant que le délai n'est pas écoulé. (typiquement, quand je suis dans le cas "1" de ton switch, je vais devoir attendre que toutes les LEDs soient allumées avant qu'un appui sur le bouton soit possible. De la même manière, il doit y avoir une latence d'1/2 seconde après chaque appui sur le bouton)
 
Sinon, ça devrait aller ;)


 
Merci :)  
 
J'ai corrigé la ou je pouvais :)
 

Code :
  1. [...]


 

Citation :


Attention à l'utilisation de delay() qui a comme mauvais côté de bloquer le système tant que le délai n'est pas écoulé. (typiquement, quand je suis dans le cas "1" de ton switch, je vais devoir attendre que toutes les LEDs soient allumées avant qu'un appui sur le bouton soit possible. De la même manière, il doit y avoir une latence d'1/2 seconde après chaque appui sur le bouton)


 
Du coup comment faire pour éviter d'utiliser cette fonction ? Il y a une alternative ?


 
L'idée c'est d'utiliser millis() qui retourne un unsigned long qui contient le nombre de millisecondes depuis le démarrage de l'Arduino. A chaque tour de la main loop, tu compares le temps actuel avec le temps de début de ton compteur et tu déclenches ce que tu as à déclencher une fois que la différence entre les 2 atteint le nombre de millisecondes voulu. L'avantage c'est que tant que la durée voulue n'a pas été atteinte, la main loop peut continuer de tourner pour faire d'autres choses.
 
Après, tant que ça marche comme ça, tu n'est pas obligé de te prendre la tête avec ça (surtout que le but de ton delay(500) c'est justement, quelque part, de bloquer l'exécution :D ), mais tu peux le garder dans un coin de ta tête pour la suite.
 
Personnellement, pour gérer le cas de l'appui sur le bouton, plutôt que de vérifier que l'état du bouton passe à LOW, je vérifie plutôt si il y a eu un changement d'état depuis le dernier tour de boucle, et j'ajoute un timer de 200ms pour faire le debouncing :
 

Code :
  1. // Global
  2. #define DEBOUNCING 200
  3. int lastRead = 0;
  4. int lastState = HIGH;
  5. // Dans la runLoop
  6. if (lastRead + DEBOUNCING < millis() { //Je suis à plus de 200ms du dernier changement d'état
  7.     int shouldChangeMode = digitalRead(SW_PIN); // Je lis l'état du bouton
  8.     if (shouldChangeMode == LOW && lastState != shouldChangeMode) { // L'état a bien changé, et est passé à LOW : on a appuyé sur le bouton
  9.         // Ce qu'il faut faire pour changer de mode d'éclairage
  10.        
  11.         lastRead = millis();
  12.     }
  13.     lastState = shouldChangeMode;
  14. }


 
EDIT : et en relisant le code, je me rends compte que ça pourrait être optimisé en inversant les 2 if : pas besoin de tester pour le debouncing si il n'y a pas eu de changement d'état du bouton


Message édité par MossieurPropre le 11-01-2018 à 08:28:03
Reply

Marsh Posté le 11-01-2018 à 20:47:44    

Citation :

L'idée c'est d'utiliser millis() qui retourne un unsigned long qui contient le nombre de millisecondes depuis le démarrage de l'Arduino.


 
Super merci beaucoup ! Je vais me renseigner sur cette fonction et j'essaierais de la mettre en application :)
 
Merci de ton aide !  
 
Je reviens vers vous dans les prochains jours quand j'aurais vraiment des choses intéressantes a partager ;)  
 
Bonne soirée :)
 
A bientôt  :jap:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed