Nadine project using Asp.net Core 2.1 with SignalR, GPIO and Raspberry pi 3

This is a personal project. I wanted to discover Asp.net Core 2.1 and SignalR. I use a Raspberry pi 3 with an external board so I can easily plug cables and play with leds and buttons on GPIOs. Here is the goal : count on an input (Gpio 17) linked to a photo-electric cell the number of passage of a fake fabric bottle line, simulated here by one propal of an old usb fan. The signal is read on Gpio17 by the raspberry pi and sent via SignalR to a web client (which is also host on the same raspberry pi server, with asp.net core razor pages.) So I can read the counter on my web page in real time (almost). GIT source code : https://github.com/couscousbzh/Nadine Youtube Demo here : https://youtu.be/c3wAWcoAf0M What you need A Raspberry pi 3 + power A testing board + cables (https://www.amazon.fr/gp/product/B01I58Y766/ref=oh_aui_detailpage_o08_s00?ie=UTF8&psc=1) A case (optional https://www.amazon.fr/gp/product/B01KZ26LKA/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1) A SSH client (putty or mobaXTerm) A button (I use a little button on board and a eletric photo cell, but I guess you don’t have one…) Some cables How it works In Asp.net Core you can manage WebHost as usual (your web site) but you can add other host that can act like a service. This is what i’ve done. I create two services, webhost and a timehostedservice. If my english is not so bad, I understood that host and webhost services will be « Generic Host » in the future. So I guess this will change in the future. I notice some diffences when creating it. With webhost service you can configure it in one line (CreateDefaultBuilder) but there is no such thing for host. Anyway, all of this is coded in program.cs and startup.cs (this one is basically only used for webhost) Timehost is a loop, you set the frequence you’d like. I set a 1 ms loop. So every 1ms, I call a worker to do a job. Which is basically just to read Gpio 17 input state. I start the webhost first and then the timehost. Webhost takes time to launch. And if counting starts, it needs to connect to Hub and do a start connexion first. But if the webhost is not yet started, I have an error. So I delay the worker init to 10s. I know this is ugly, this is something I wanted to correct but I spent too much time. And by the way, i am not sure that running 2 services like that is the best solution. Maybe doing 2 separate projects with their own life is better. So I did not loose my time on this. Web Service (host) Basic project made with a « dotnet new webapp » cli command. Then I follow the microsoft guide line : https://docs.microsoft.com/fr-fr/aspnet/core/signalr/introduction?view=aspnetcore-2.1 this give me a little chat room exemple using SignalR. Then, I add a Counter Page. The goal of this is to simulate a counter (like a bottle counter sensor) and upload the value directly in client web page, using SignalR. Template Gentelella : https://github.com/puikinsh/gentelella npm init -y npm install @aspnet/signalr npm install gentelella –save dotnet build WARNING : all of my code use hard IP adresse 192.168.8.123, please change it to yours or add a dynamic system. GPIOs Service (host) Thanks to Jeremy Lindsay, I could use the GPIOs as I wanted. Here is some usefull links : https://jeremylindsayni.wordpress.com/2017/05/01/controlling-gpio-pins-using-a-net-core-2-webapi-on-a-raspberry-pi-using-windows-10-or-ubuntu/ https://jeremylindsayni.wordpress.com/2017/04/05/turning-gpio-pins-high-and-low-on-a-raspberry-pi-3-using-net-core-2-and-ubuntu/ https://jeremylindsayni.wordpress.com/2017/04/18/write-net-core-2-once-run-anywhere-hardware-access-on-raspberry-pi-3-with-ubuntu-and-windows-10-iot-core/ I copy some classes into /GpioManager folder. And my code is basically located into the worker class (/HostedServices/Worker.cs) Here is some usefull commands For Raspbian Debian 9 Jessie you need to do the following (only once): sudo apt-get update sudo apt-get install curl libunwind8 gettext apt-transport-https chmod 755 ./MyWebApp export ASPNETCORE_URLS= »http://*:5000″ export ASPNETCORE_URLS= »http://192.168.8.123:5000″ echo $ASPNETCORE_URLS ./MyWebApp WiringPi WiringPi is a lib for linux (not C#) this can be helpfull to check input status or manually set them. gpio readall gpio mode 0 in (0 match GPIO 17) gpio mode 2 in (2 match GPIO 27) gpio mode 5 out (5 match GPIO 24) Deploying Deploy Asp.net Core 2.1 https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md#linux On dev environnement : dotnet publish -c Release -r linux-arm copy publish folder content to RapsberryPi or I wrote some powershell script that can helps to deploy in one command line. .\ps-deploy-raspian.ps1 -ip 192.168.8.123 -destination « /home/pi/Dotnet/Nadine » -username pi sudo ./home/Dotnet/Nadine/Nadine

DIY – Smartphone control RGB led strip with ESP8266

Voici un mini tuto qui va expliquer les quelques étapes pour réaliser un serveur web sur le board ESP8266, qui pilote une bande de led RGB. le tout contrôlé à distance via Wifi par une simple application windows phone (qui aurait pu être une app web directement hébergé par l’ESP, je viens seulement d’y penser…) L’idée, piloter à distance via son smartphone la couleur de la lumière d’une bande de led RGB. La démo : Outils / soft / materiel : 1 ESP 12 dev kit (ou avec un board moteur) 1 amplificateur (12V/24V) 4 fils de couleurs (blanc, rouge, vert, bleu) (connecteur male/femelle) 1 alimentation 12v ou 24v suivant votre bande led en sortie (optionnel un interrupteur) 1 ou plusieurs bandes led RGB (5050 pour moi) (exemple) 1 pince coupante ou a dénuder 1 tourne vis plat Node.js installé sur votre machine + le package esp8266 Lua Loader (windows) ou un autre soft de votre choix, ou en ligne de commande 1 smartphone (windows phone mais le code serait pas dur à réaliser sur iOS ou Android) Montage : Nous avons d’un coté l’application smartphone, autonome, connecté en wifi sur ma box. De l’autre le montage composé d’un module dev kit ESP 12 (ESP8266) relié par 4 fils (blanc pin 4, rouge pin 6, vert pin 7, bleu pin8) à l’amplificateur. Celui ci est alimenté en 12v et en sortie on a branché une bande led RGB avec 1 fil par couleur + un fil blanc (+12v). Vous n’êtes pas obligé d’avoir  un amplificateur. Vous pouvez à la place réaliser un montage supplémentaire avec 3 moftsets (ici pour plus d’info). Mais il faut impérativement isoler le circuit ESP (5v) de celui de vos leds (12v ou plus) Par mesure de sécurité, je vous conseille l’amplificateur + un transfo 12v, c’est simple et pas de risque de prendre du 230v. Faites attention quand même ! Fonctionnement : L’esp boot sur le fichier init.lua. Celui ci va se connecter en mode station (paramétrable en AP si besoin) et obtenir une adresse IP de ma box (DHCP). Celle ci s’affiche (notez la pour la suite). Ensuite le code lance un serveur web http très simple, écoutant le port 80. Le serveur va donc traiter des urls de ce type http://192.168.1.18/?r=125&g=30&b=240&on=1 Les paramètres r, g, b correspondent à la couleurs désiré. Le paramètre on sert pour allumer ou éteindre la bande led. A ce stade, le serveur attend un ordre que l’on enverra depuis un smartphone. Pour savoir que mon serveur est démarré, je lance une petite séquence de lumière Code ESP: J’avais l’habitude de séparer mon code en plusieurs fichiers, histoire d’uploader mon code plus facilement (car c’est long) sur l’esp. Ce code https://github.com/couscousbzh/ESP8266-RGBServer vous permet de jouer avec. Il fonctionne tant que vous êtes connecté par usb. Mais dès que vous rebootez, c’est la catastrophe. Et je ne sais pas pourquoi. Donc lors de mon dev, tout ce passe normalement. Mais dès que je passe en mode prod, c’est dire une alimentation simple par usb de l’esp, ca ne fonctionne plus. Si quelqu’un sait pourquoi, pourriez vous me laisser un commentaire svp ? J’ai donc tout réunit dans un seul fichier init.lua, et c’est un peu mieux (ou pas). Vous le trouverez ici : https://github.com/couscousbzh/ESP8266-RGBServer/blob/master/initallinone.lua (pensez à le renommer en init.lua) Explication du code : Pour afficher une couleur, par exemple le rouge, on balance un niveau haut sur le fil rouge. Donc 5 volts avant ampli puis 12v en sortie. On a du rouge si le vert et bleu n’éclaire pas du tout. Sinon on a de la lumière blanche si le rouge vert bleu éclairent tous. En informatique, on représente souvent la couleur par un integer sur 8 bits c’est à dire un chiffre entre 0 et 255. Ecrit comme cela RGB(255,0,0) signifiera que l’on veut du rouge seulement. Pour mieux vous familiariser avec une palette de couleur RGB je vous conseille un utilitaire de dessin comme paint.net, photoshop ou des extensions pratique comme la pipette sur Firefox (colorzilla) ou Chrome. Si on veut du marron on doit avoir une moitié de rouge, pas de vert ni de bleu. Ce qui donnerait RGB(127, 0, 0) Voila, maintenant que l’on comprend la couleur traduite en RGB il faut comprendre comment fonctionne une bande led. En faite pour afficher que du rouge c’est simple, on balance 12V dessus. Mais pour afficher une moitié de rouge ? Et bien nous allons mettre du 12v puis du 0v puis du 12v etc… Ceci se traduira par un signal dit « signal carré ». Pour obtenir un marron, il faut alterner du rouge et du noir. A haute fréquence, l’oeil ne pourra pas distinguer le rouge du noir, mais verra le marron. Si la fréquence est trop basse, 1Hz par exemple (1Hz = 1 période par seconde) donc 0.5s de noir et 0.5 rouge, ce sera perceptible par l’oeil. Mise en application dans l’esp : Pour réaliser ceci nous allons utiliser pwm (pulse width modulation ou modulation de longeur d’onde) qui est une fonction livré avec l’API NodeMCU. pwm.setup(redPin, 500, 512) : ici nous allons initialiser le pin ‘redPin’ (le 6 dans mon cas) à une sortie de type PWM avec une fréquence de 500 Hz et un duty de 512 (valeur entre 0 et 1023). Considérez le duty comme un pourcentage.  0 = 0% et 1023 = 100% il suffit de convertir le chiffre de tout à l’heure compris entre 0 et 255 en chiffre de 0 à 1023. Facile c’est un multiple de 4 ! Attention toutefois, ici 1023 correspond à lumière éteinte. Donc l’opération consiste à faire 1023 – 4 * r où r correspond au chiffre compris entre 0 et 255. Le reste du code (partie serveur) est expliqué dans mes précédents articles. Code partie smarphone : Comme je le disais précédemment, on peut très bien coder cette partie en app Web avec des appels ajax par exemple ou bien la coder sur Android ou iOS. Pour ma part je l’ai…

ESP8266 – troisième pas

Dans cet article, nous allons voir comment passer du mode AP (Access Point) utilisé dans l’article précédent, en mode station, c’est à dire en client simple, comme votre smartphone ou pc portable. Le ESP 12e dev kit est livré avec le firmware NodeMCU. NodeMCU est une plateforme Iot open source qui permet l’utilisation du langage de script Lua.Etant un peu débutant, je préfère que vous alliez vous même lire les définitions officielles de toutes ces notions. Lua va vous permettre d’écrire facilement du code pour faire fonctionner votre ESP. Il est basé sur le langage C. Pensez à gérer votre mémoire. Il faut savoir que l’ESP boot sur un fichier : init.lua. L’extension .lua signifie que le fichier n’est pas compilé. L’extension .lc indique que le fichier est compilé. LuaLoader vous permet de compiler les fichiers que vous souhaitez. Mais j’ai remarqué que beaucoup de code init.lua se charge de compiler le code au démarrage, puis efface tous les fichiers Lua. Cela permet de garder un peu de mémoire. Mon fichier init.lua fait ceci puis exectue main.lc (la version compilée de main.lua). Voici les fichiers sur le repo git : https://github.com/couscousbzh/ESP8266-Proto2 init.lua (ajouté) webserver.lua (inchangé) header.htm (inchangé) main.lua (modifié) Les modifications se trouvent dans le fichier main.lua. La premiere est simple, au lieu de charger webserver.lua je charge la version compilée webserver.lc (car je rappelle que les .lua seront effacés par le init.lua, lui meme compilé en .lc et effacé ensuite) La deuxième modification concerne le mode station/ap. Pour switcher il suffit de modifier la variable local modeStation = true/false. Il faudra aussi renseigner le SSID de votre box wifi et sa clé. Dans le proto 1, le mode était AP (Access Point), c’est à dire que votre ESP se comporte comme votre box wifi maison et va gérer son propre réseau (192.168.2.x). Il faudra alors changer de wifi et passer sur le wifi de l’ESP. Je préfère rester sur le même réseau wifi que celui de ma box, car je suis fainéant et je ne souhaite pas modifier mon wifi à chaque fois que je veux utiliser l’ESP. Donc je dois passer le mode en station. Le code prévoit 5 tentatives de connexion, cela peut prendre quelques secondes. Ensuite votre box wifi va attribuer une adresse IP à votre ESP (si la box est configurée avec un server DHCP, ce qui doit être le cas par défaut). Normalement vous pouvez lire l’IP s’afficher sur LuaLoader apres un reboot. Vous pouvez vous connecter dessus depuis votre browser préféré. A plus qu’à !

ESP8266 – deuxième pas

Dans le précédent article, je présentais un petit bout de code pour faire clignoter une led sur le board. Simple mais pas plus efficace que sur une arduino nano. Maintenant tâchons d’exploiter pleinement l’intérêt de cet appareil : le Wifi ! Jusque la il fallait pas mal bricoler pour obtenir un objet connecté, en général fallait rajouter un shield ou un modume ethernet ou wifi. Fini tout ca, avec l’ESP12 E Dev kit on a une puce ESP8266 pour le wifi sur un board équivalent à l’arduino nano en un peu plus gros. Nous allons voir ici comment créer un simple serveur web qui répondra à deux boutons web pour actionner deux leds sur le board. Nous allons avoir besoin d’un petit outil LuaLoader qui permet de gérer les scripts que l’on balance sur l’ESP. On va lui uploader 3 fichiers : main.lua (code principal) webserver.lua (code concernant le serveur web) header.htm (page web envoyé au client) Pour obtenir ces fichiers, voici le repo git : https://github.com/couscousbzh/ESP8266-Proto1 Petite explication : main.lua va charger le fichier webserver.lua. J’aurais pu tout mettre dans un seul fichier mais vous allez vite vous rendre compte qu’uploader un fichier prends du temps. Donc autant bien répartir son code. header.htm contient du code HTML CSS et JS. Il est incomplet volontairement. La fin du code est géré par webserver.lua pour rendre dynamique les boutons (état on et off). Il faut charger ces 3 fichiers sur l’ESP avec LuaLoader. Ensuite il faut faire un dofile sur main.lua. L’application va alors démarrer et votre serveur devrait être opérationnel. Connectez vous sur le réseau wifi (il s’appelle « DoitWifi » et le mot de passe est « 12345678 »). Ensuite charger une page web sur un browser avec l’url suivante : http://192.168.2.111. Si tout ce passe bien, vous obtenez une page web très simple avec deux boutons. Cliquez dessus et admirez le résultat sur l’ESP12e, les leds s’allument sur ordre des boutons web !              

ESP8266 – premier pas

J’ai récemment acheté une nouvelle petite bestiole : un Nodemcu lua esp8266 ESP -12e Mais c’est quoi ce truc ? L’ESP8266 est un module Wifi qui se branche d’habitude sur un microcontroleur, mais ici il est livré directement avec ! Ya en plus une prise USB donc pas besoin de bricoler une liaison série tout est sur la carte. J’ai acheté en plus un support, le tout pour 10$ sur Banggood. Après mon NetDuino et mon Arduino-Nano, j’avais besoin d’une carte relativement petite avec le Wifi et surtout pas cher. Car tout ce que j’ai besoin c’est un d’un « commutateur à distance ». J’ai bien les ondes radio comme option mais il m’aurait de toute façon fallut une carte pour le piloter et faire la liaison avec internet. Ici on a tout en un ! Pour l’utiliser, il suffit d’avoir node.js sur son PC. Vous installez un package qui vous permettra de lancer quelques lignes de commande pour copier des fichiers dessus. Ces fichiers contiendront votre code qui sera exécuté car l’ESP8266. Pour démarrer, le plus simple et de faire clignoter une led sur la carte. Dans un fichier blink.lua copier le code suivant : — Config local pin = 4 local value = gpio.LOW local duration = 1000    –> 1 second — Initialise the pin gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, value) — Create an interval tmr.alarm(0, duration, 1, function () if value == gpio.LOW then value = gpio.HIGH else value = gpio.LOW end gpio.write(pin, value) end) Ouvrez une invite de commande et copier ce fichier sur la mémoire du ESP8266 : >esp file write blink.lua Pour ensuite l’executer : >esp file execute blink.lua Ca y est la LED clignote ! Bien évidement ça ne va pas s’arrêter la. Le but étant de piloter quelque chose à distance via internet ou son réseau locale. J’ai plusieurs idées en tête : allumer une bande led derrière la télé depuis mon smartphone dans le canapé allumer automatiquement  les lampes extérieures (déjà installées et reliées à des relais Chacon 433MHz) en fonction de sa position GPS (quand on rentre du boulot par exemple) fermer une trappe à chien pendant 30 min sur l’appui d’un bouton de mon téléphone, histoire que mon chien sèche avant de le rentrer pour qu’il passe la soirée avec nous. Bref on peut vraiment penser à des trucs bien délire !