Niveau de difficulté: pour les débutants.
L'idĂ©e est nĂ©e lorsque la vieille guirlande s'est brisĂ©e la veille du nouvel an. Le fils a regardĂ© la bande LED RGB et a demandĂ© s'il Ă©tait possible d'en faire une guirlande. Vous pouvez - j'ai dit, et le fils a commencĂ© Ă dĂ©crire pendant longtemps exactement comment la guirlande devait clignoter. Je n'ai rien compris et j'ai dĂ©cidĂ© de m'assurer qu'il pouvait faire ce qu'il voulait de lui-mĂȘme. J'ai commencĂ© par analyser mes propres souhaits pour le projet:
- Environnement de développement de style scratch
- travail hors ligne - la possibilité de travailler avec l'appareil éteint
- Travaillez par avion, sans connecter de fil
- Fiabilité - aucun programme téléchargé ne doit "bloquer" l'appareil jusqu'à ce qu'un redémarrage soit nécessaire
Plateforme matérielle

Sur la base de la carte ESP8266 avec NodeMCU (
comme celle-ci ), quelques transistors et rĂ©sistances y ont Ă©tĂ© ajoutĂ©s. Les modules sĂ©lectionnĂ©s ont un rĂ©gulateur de tension de 3-20 volts, ce qui lui permet d'ĂȘtre alimentĂ© Ă partir de la mĂȘme source que la bande. Les sorties esp donnent une tension de 3 volts avec une limite de courant de 12mA, j'ai donc utilisĂ© des transistors bipolaires conventionnels pour contrĂŽler la bande.

Pour que la fumée blanche ne sorte pas du microcontrÎleur, j'ai mis une résistance de 220 Ohms entre la sortie et la base. Esp a un logiciel pwm, certaines broches ont un but particulier, j'ai sélectionné expérimentalement.
Firmware
Avant d'utiliser, esp8266 doit ĂȘtre flashĂ©, j'utilise NodeMCU avec lua, bien qu'il ait un peu moins de fonctionnalitĂ©s que Arduino avec C ++. Ainsi, la façon la plus simple de commencer est d'
utiliser un micrologiciel prĂȘt Ă l'emploi de
nodemcu-build.com . Pour notre projet, nous devrons ajouter le module pwm. AprĂšs un certain temps, un lien vers l'image tombera dans l'e-mail. Vous devez prendre celui avec flotteur.
Vous pouvez le flasher avec n'importe quel programmeur
d'ici , et j'utilise NodeMCU Flasher.
NodeMCU a un systÚme de fichiers, l'exécution commence avec le module init.lua, j'utilise
ESPlorer pour le téléchargement.
Diode clignotante
Le moment suivant m'a induit en erreur. La numérotation interne (GPIO0-16) est utilisée uniquement dans les programmes natifs (Arduino / C ++). De lua, la notation du tableau est utilisée. Par exemple, pour utiliser GPIO16 / D0 (LED intégrée). depuis Lua, vous devez écrire gpio.write (0, gpio.HIGH). Vous pouvez faire clignoter une diode directement depuis la console ESPlorer.

Contrairement Ă Arduino, nodemcu
ne peut pas utiliser le dĂ©lai et la boucle occupĂ©e, la console et le wifi utilisent le mĂȘme processeur pour fonctionner. Un chien de garde est Ă©galement intĂ©grĂ© Ă la carte, qui le redĂ©marrera si votre code s'exĂ©cute plus de 500 ms. Il est recommandĂ© de ne pas occuper le processeur plus de 2 ms. Pour rĂ©soudre le problĂšme, il existe des fonctions
node.task.post et
tmrChoisir un environnement de développement
Au début, je voulais utiliser Scratch, mais cela ne me convenait pas, car cela ne me permet pas de travailler hors ligne - le programme s'exécute sur un ordinateur dans un environnement de travail, et toutes les cartes pour cela fonctionnent passivement. AprÚs avoir fouillé sur Internet, je suis tombé sur
Google Blockly . Cela s'est avĂ©rĂ© ĂȘtre exactement ce dont vous avez besoin: il prend en charge la gĂ©nĂ©ration de code dans lua et la crĂ©ation de ses propres blocs. AprĂšs avoir expĂ©rimentĂ©, j'ai dĂ©cidĂ© de crĂ©er mon projet Web, j'ai choisi nodejs comme serveur et Blockly comme interface. Il Ă©tait absolument nĂ©cessaire de crĂ©er 2 blocs - en dĂ©finissant la couleur et le retard. Blockly a des fonctions intĂ©grĂ©es pour travailler avec des couleurs au format #ffffff, la crĂ©ation d'une fonction pour dĂ©finir la couleur n'Ă©tait pas un problĂšme.
En-tĂȘte de spoilerBlockly.Lua['set_color'] = function (block) { var parseColor = Blockly.Lua.provideFunction_( 'set_colour_rgb', ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(s)', ' local rs,gs,bs = s.match(s, "#(..)(..)(..)");', ' setColor(tonumber(rs, 16),tonumber(gs, 16),tonumber(bs, 16));', 'end']); var value_color = Blockly.Lua.valueToCode(block, 'Color', Blockly.Lua.ORDER_ATOMIC); var code = `set_colour_rgb(${value_color})\n`; return code; };
Ainsi, 2 exigences sur 3 ont été clÎturées.
Fonction Sleep ()
Ici, j'ai dû réfléchir spécifiquement à la façon de combiner le fonctionnement fiable d'OTA avec l'exécution de code personnalisé. Heureusement, lua a une bibliothÚque
coroutineAprĂšs avoir rĂ©flĂ©chi et lu attentivement la documentation, j'ai rĂ©alisĂ© que tout le code client devait ĂȘtre exĂ©cutĂ© dans coroutine, et utiliser yield au lieu de sleep pour que le module principal puisse rĂ©gler une minuterie.
Aussi, pour protéger la carte d'une boucle infinie, j'ai patché le code aprÚs le générateur en insérant yield (0) au début de chaque itération de chaque boucle
function MCUPostProcessLua(code) { return code.replace(/ do[ ]?\n/, ' do \ncoroutine.yield(0);\n'); }
Téléchargement OTA
J'ai dĂ©cidĂ© de mettre en Ćuvre la solution la plus simple pour le rĂ©seau local, la carte se connecte au wifi domestique, se connecte au serveur Ă une adresse fixe, envoie un identifiant unique (afin de traiter correctement les reconnexions), et attend les mises Ă jour du programme via cette socket.
Résultat
github.com/farafonoff/BlocklyESP8266Vous pouvez ajouter beaucoup, par exemple, une sorte d'option d'autorisation pour travailler à travers les réseaux publics, un configurateur convivial en mode hostap, améliorer la modularité init.lua et le support de sa mise à jour OTA (maintenant seul le module avec le programme chargé est mis à jour).