ash ray cure Life is a bitch | Zaib3k a écrit :
T'as le code qq part ? je suis intéressé par les détails sur l'esp
|
Oui, pas de soucis
J'ai fait un zip : http://www.mediafire.com/file/sitg [...] tuelle.zip
Avec :
*Dans le répertoire "stl", les fichiers 3D des 26 lettres de l'alphabet. Toutes ne servent pas sur la matrice que j'utilise, mais si jamais... Pour ne pas m'emmerder avec les lettres qui "ont des trous" (genre un "O" ) où l'intérieur de la lettre n'est pas relié à l'extérieur, j'ai choisi une police qui n'a pas ce problème (mais les lettres O, P, Q, R, D, etc... ne sont pas terribles). Sinon j'avais l'idée de coller un bout de papier calque sur le fond du cube, de façon à avoir un support sur lequel coller le centre de la lettre ... mais j'ai eu la flemme Je sais pas si je suis très clair là
*Dans le répertoire "code" .... le code de l'ESP8266
*Et dans le fichier letters.txt, la liste des lettres à imprimer + le nombre d'exemplaires
Au niveau de l'ESP, soit on peut le programmer en C via l'IDE Arduino, soit en LUA. C'est l'option que j'ai utilisé, mais du coup il faut installer le firmware NodeMcu.
On peut se générer son firmware perso avec seulement les bibliothèques utiles à son projet (et à jour) là : https://nodemcu-build.com/
De mon côté, en plus des librairies sélectionnées par défaut, j'ai rajouté : RTC Time (pour la synchro de l'horloge de l'ESP avec le temps internet), SNTP (pour la synchro avec un serveur NTP) et WS2812 (pour le contrôle du ruban de leds).
Après quelques minutes on reçoit un mail avec des liens pour télécharger notre firmware. 2 versions, l'une ne gère que les entiers, l'autre gère en plus les nombres flottants. Ici les entiers suffisent, on utilise cette version.
Pour flasher le firmware sur l'ESP : https://github.com/nodemcu/nodemcu-flasher
Reste plus qu'à le programmer. Pour ça il faut un IDE, j'utilise Esplorer : https://esp8266.ru/esplorer/ mais il y en a d'autres.
La partie gauche représente ce qui est en local sur le PC de dev, à droite l'ESP avec un retour console, et la liste des fichiers présents sur l'ESP.
Le principe c'est qu'on développe sur un fichier en local, et on clique sur "Send to ESP" pour l'uploader sur l'ESP et l'exécuter.
Au démarrage l'ESP exécute automatiquement le fichier "init.lua". Du coup je conseille fortement de le nommer différemment et l'exécuter manuellement le temps de faire les dev/test, et de ne le renommer en "init.lua" qu'une fois que tout fonctionne.
Si le fichier init.lua est buggé, plus moyen de se connecter à l'ESP, et il faut reflasher le firmware...
Au niveau des différents fichiers :
*Les 4 fichiers .txt servent à stocker les valeurs modifiables depuis l'interface web de façon à ce qu'elles soient récupérées en cas de reboot de l'ESP
*Le fichier init.lua contient le nom du réseau wifi + mot de passe (donc à mettre à jour si tu veux réutiliser le code), se connecte au wifi, au serveur ntp, lance le serveur web et exécute chaque seconde la fonction qui vérifie si l'heure a changé et met à jour si nécessaire.
*Le fichier wifi.lua contient le code pour se connecter au réseau wifi et attendre que la connexion ait été établie
*Le fichier ntp.lua se connecte à un serveur ntp (j'en ai mis plusieurs, au cas où l'un ne soit plus dispo), et active la synchro automatique (ça resynchronise l'heure toutes les 20min)
*Le fichier config.lua sert à gérer les fichiers de config (lecture/écriture des valeurs)
*Le fichier functions.lua contient les différentes fonctions, dont celle qui affiche l'heure
*ledarrays.lua contient les tableaux permettant de connaitre les indices des leds à afficher en fonction du mot que l'on souhaite afficher, ainsi que les couleurs associées aux 12 heures (pour le mode avec la couleur variable en fonction de l'heure)
*server.lua contient le code qui permet d'implémenter un petit serveur web pour gérer la config
Par contre attention, c'est super limité niveau ram (8Ko je crois), on se retrouve rapidement avec des erreurs "Out of memory", et faut feinter. Genre sur le serveur web je n'utilise pas la fonction de concaténation LUA ("texte 1" .. "texte 2" ) qui consomme trop de ram, mais plutôt des tableaux qu'on concatène à la fin. De même la page n'est pas générée en une fois, mais par petits paquets envoyés au fur et à mesure au navigateur pour éviter les dépassements mémoire...
Et donc suffit d'envoyer tous ces fichiers (en finissant par init.lua pour éviter de tout lancer alors qu'il manque des fichiers), rebooter l'ESP et normalement ça marche
En restant branché en USB à Esplorer on peut voir les retours console pour du debug.
Pour montrer rapidement comment ça marche sans avoir à télécharger le code :
Code :
- function main()
- dofile("ntp.lua" )
- print("Heap size : " .. node.heap())
- dofile("server.lua" )
- --Check time each second
- tmr.alarm (1, 1000, tmr.ALARM_AUTO, function ( )
- showTime()
- end)
- end
|
La fonction "main" est appelée une fois connecté au wifi, ça lance la synchro au serveur ntp, puis le serveur web, puis appelle la fonction "showTime" toutes les secondes.
Dans showTime, ça vérifie qu'il faut mettre à jour, et si c'est le cas
Code :
- [...]
- hideTime(false)
- [...]
- if(hours > 0 and hours ~= 12) then
- addWord(arrHours[tostring(hours)], COLOR_R, COLOR_G, COLOR_B)
- addWord(arrHours["heure"], COLOR_R, COLOR_G, COLOR_B)
-
- if(hours > 1) then
- addWord(arrHours["s"], COLOR_R, COLOR_G, COLOR_B)
- end
- elseif(morning == false) then
- addWord(arrHours["minuit"], COLOR_R, COLOR_G, COLOR_B)
- else --midi
- addWord(arrHours["midi"], COLOR_R, COLOR_G, COLOR_B)
- end
- --we send the led buffer
- ws2812.write(buffer)
|
Avec,
*hideTime:
Code :
- [...]buffer:fill(COLOR_OFF_G,COLOR_OFF_R,COLOR_OFF_B)[...]
|
"buffer" a été initialisé au boot (buffer = ws2812.newBuffer(NB_LED, 3), avec ici NB_LED = 182, et le 3 parce que nos leds prennent chacune 3 octets en entrée (R, G et B on les voit sur la dernière photo du post, mais certains rubans ont une led blanche supplémentaire et prennent 4 valeurs : RGBW)).
La fonction "fill" permet d'initialiser le buffer avec toutes les leds à la même valeur, ici la couleur des leds "éteintes". Pour le moment le buffer reste une variable, rien n'est envoyé au ruban.
*addWord:
Code :
- function addWord(arrWord, r, g, b)
- for k,v in pairs(arrWord) do
- buffer:set(v,g,r,b)
- end
- end
|
Ca prend le tableau arrWord en entrée, qui contient une liste d'indices correspondant aux leds à afficher.
Et ça modifie le buffer pour mettre la couleur des leds "allumées" à toutes les leds nécessaires. (vous noterez que cette fonction, ainsi que "fill" et toutes les autres de cette librairie prend les couleur dans l'ordre GRB, et pas RGB).
Un exemple de tableau contenant des indices de leds:
Code :
- arrHours={}
- arrHours["minuit"] = {8,9,10,11,12,13}
- arrHours["1"] = {24,25,26}
- arrHours["7"] = {20,21,22,23}
- arrHours["3"] = {16,17,18,19,20}
- arrHours["6"] = {14,15,16}
- arrHours["5"] = {27,28,29,30}
- arrHours["4"] = {30,31,32,33,34,35}
- arrHours["2"] = {36,37,38,39}
- arrHours["8"] = {49,50,51,52}
- arrHours["9"] = {45,46,47,48}
- arrHours["11"] = {40,41,42,43}
- arrHours["10"] = {53,54,55}
- arrHours["midi"] = {56,57,58,59}
- arrHours["heure"] = {60,61,62,63,64}
- arrHours["s"] = {65}
|
Attention, une ligne sur 2 le ruban de led commence par la droite, donc sa première led indexée est la dernière de la ligne...
*ws2812.write(buffer)
Pour envoyer le buffer qu'on vient de calculer au ruban de leds afin de l'afficher
Bref, c'est pas compliqué à utiliser. Ce qui l'est moins c'est tout l’environnement de dev : esplorer c'est pas terrible du tout. Y'a quasi aucun raccourci passé Ctrl+C et Ctrl+V, même un Ctrl+F marche pas...
Et la connexion à l'ESP n'est pas triviale, la technique c'est d'ouvrir le port de connexion vers l'ESP, appuyer sur le bouton reset de celui-ci, et là il devrait se connecter. Ensuite clic sur Reload (tout à droite, pour afficher les fichiers présents sur l'ESP, ou une autre commande vers l'ESP, ça doit le faire aussi), là systématiquement ça plante après un timeout de 3/4s. Reclicer sur reload, et à partir de là tout fonctionne correctement.... Vu qu'il faut régulièrement rebooter (genre après un Out of memory), c'est un peu lourd Heureusement que ça boot quasi instantanément
Et merci pour les compliments, ça fait plaisir
Pour la peine, une vidéo faite en faisant un petit timelapse sur l'horloge (mais les leds qui sont "éteintes" apparaissent trop brillantes sur les photos, en fait c'est plus contrasté) : https://youtu.be/cUF6X7y2qGI |