Page 30 sur 31

Re: [TUTO] Application web dynamique

Posté : jeu. 16 sept. 2021 10:17
par Bud Spencer
NubiaNeko a écrit :
dim. 12 sept. 2021 09:21
...Et bien, tout fonctionne à merveille, c'est incroyable! ...
Bha voila, encore gagné \o/ :lol:

Re: [TUTO] Application web dynamique

Posté : dim. 9 janv. 2022 13:08
par Bud Spencer
Ça faisait un moment que je n’étais viendu par ici.

Je suis en train de développer un poulailler connecté (ouais … je sais …). En fait, ce n’est pas pour moi, mais pour un collègue de boulot qui a vu ça sur internet et qui veut faire pareil. Le souci, c’est qu’il a bien quelques bases en électronique mais ni connait quedal en programmation. Du coup, je lui ai proposé de bosser avec lui sur son projet.

On a prévu plusieurs options comme critère d’ouverture/fermeture de la porte. Au départ, l’idée, c’était d’utiliser un simple capteur jour/nuit. Inutile de dire que la précision de ces trucs-là n’est pas terrible. Temps couvert, pleine lune ou pas … Donc pour etre au plus fiable possible, on a décidé d’ajouter un autre critère en utilisant d heures d'ouverture/fermeture et comme on ne recule devant rien, on c'est dit que ca pouvait etre pas mal d'utiliser les ephémérides de sa géolocalisation pour définir ces heures en automatique.

J’ai donc écrit un petit objet qui permet d’avoir chaque jour ces 2 valeurs en interrogent l’api openwaethermap. Pour rendre l’objet autonome et ne pas le faire requêter l’api si ce n’est pas nécessaire, il fait une comparaison entre la date du jour et la date du dernier résultat. Ce contrôle est fait toutes les x minutes et si les dates sont différentes, il requête l’api jusqu’à avoir un résultat. Comme pour la plupart des trucs que j’ai écrit ici, j’ai utilisé une méthode évènementielle pour mettre à jour les valeurs du programme principale. Comme ça, si tout fonctionne normalement, l’appel de l’api et l’évènement ne se font qu’une seule fois par 24h00.
J’avais déjà écrit un truc ici pour interroger l’api openweathermap, mais j’avais utilisé le npm request qui est désormais déprécated. Du coup, cette fois ci, j’ai utilisé https.get qui fait nativement partie de NodeJS. Voilà un premier jet du code du truc :
owmjs.png
owmjs.png (79.43 Kio) Vu 3441 fois

Re: [TUTO] Application web dynamique

Posté : dim. 9 janv. 2022 13:09
par Bud Spencer
Dans le programme principal, il suffit d’importer le fichier, de créer une instance de l’objet ‘sun’ et de s’abonner aux évènements (j’en ais créer 2 pour séparer l’arrivé des données des erreurs éventuelles). Les parametre de l’objet sont : Latitude, longitude, apikey, minutes.
Pour les coordonnées vous pouvez facilement trouver les votre en utilisant googlemap. Pour l’apikey, il suffit d’en demander une gratos sur openwathermap et minute est le délais entre chaque contrôle de l’objet.
Les données sont reçues dans l’évènement sun.Events.on et sont contenu dans data (date , sunrise, sunset) . Elle peuvent ensuite etre utilisé dans la logique qui définira quand ouvrir et fermer la porte et etre poussée vers les clients sur un socketio.
owmjs2.png
owmjs2.png (23.69 Kio) Vu 3441 fois
Noter que pour le formatage des dates/heures, j’ai utilisé un nouveau npm (dayjs) qui semble pas mal.
Voila, c’est tout pour aujourd’hui

Re: [TUTO] Application web dynamique

Posté : lun. 10 janv. 2022 20:44
par Bud Spencer
La seconde ‘brique’ du projet poulailler, c’est le détecteur jour/nuit. Mon collègue à acheter un truc comme ça. Le machin est tout simple, et retourne un état haut ou bas sur sa sortie suivant la lumière sur la ldr et le seuil réglé par un petit potard. Electroniquement parlant, rien de bien révolutionnaire, je fabriquais déjà ce genre de bricole il y a bientôt 40 ans.

Pour le raccordement hardware, le bazar est raccordé au +5v du PI et je ponctionne l’état de la broche de sortie au centre d’un diviseur de tension 50/50 fait avec 2 résistances de 2.2 Ko. Coté programme, comme d’habitude avec NodeJs, je me suis fait un petit objet autonome qui va scruter l’état du capteur toutes les minutes. Je lui ais quand meme mis une petite subtilité pour confirmer les mesures. Pour ça, il ne fais le changement jour/nuit qu’après avoir eu au moins x résultats consécutifs dans le meme état. Le but est de limiter les mauvaises interprétations (exemple quelqu’un passe devant le capteur ou la lecture au moment ou un éclair d’orage en pleine nuit). Comme d’hab aussi, l’objet lève un évènement à chaque changement d’état que je pourrais récupérer dans le programme principal. Comme je vais avoir d’autre ‘interactions’ avec le port GPIO, j’ai mis ça dans un module que j’ai appelé Hardware que je compléterais plus tard avec le reste.
cjnjs.png
cjnjs.png (52.87 Kio) Vu 3415 fois
Pour utiliser l'objet Cjn dans le programme principal, rien de nouveau. import du module et création d'une instance de l'objet. Je passe rpio en paramètre ainsi le nombre de confirmation de lecture que je veux pour valider un changement d'état.

Code : Tout sélectionner

var hwr = require("./hardware");
var cjn = new hwr.Cjn(rpio, 3);
prochaine étape, peut etre le pilotage de la porte ... ou la détection du wifi ...

Re: [TUTO] Application web dynamique

Posté : mar. 11 janv. 2022 10:23
par Bud Spencer
La motorisation de la porte.

Pour la partie mécanique, il n’y a encore rien de défini. La seule chose que nous savons, c’est que cela fonctionnera avec un petit moteur à courant continu et ce seront les expérimentations qui décideront de la solution. Pour prévoir large, j’ai donc décidé de rendre indépendante la partie qui alimentera le moteur. Pour ça, j’ai prévu un montage à 2 relais. Le premier servant à commuté l’alimentation du moteur et le second monté en inverseur pour le sens de rotation. Les 2 relais sont chacun piloter par un pin gpio en sortie. Cette solution à l’intérêt de rester ‘électroniquement’ compatible avec les compétences de mon collègue et de n’importe quel débutant tout en garantissant de la flexibilité quand au choix du moteur et une parfaite isolation avec le PI. Le pilotage des relais utilise le + pris sur le port GPIO et utilise un transistor NPN mis en saturation pour commuter le – quand la gpio de commande est à l’état haut. Le montage prévoit aussi d’ajouter 2 contacteurs de fin de course (haut et bas) qui seront connecté a 2 autres GPIO en entrée.

Le choix de ne pas intégrer la gestion des fins de course dans la partie électronique est volontaire. Cela à pour but de favoriser le coté didactique de la programmation du système.

Voici la liste des composant utilisé pour le proto :
Relais 5v 2 RT : OMRON G5V2-5
Transistor NPN : BC337
Résistance de base : 2.2K
Diode free wheels : 1N4148
cmddoor.PNG
cmddoor.PNG (16.31 Kio) Vu 3408 fois
Dans la logique, l’activation du relais 1 ouvrira la porte si le relais 2 est désactivé et la fermera si le relais 2 est activé.
Si je ne rentre pas trop tard ce soir, j'écrirais le code qui va avec.

Re: [TUTO] Application web dynamique

Posté : mer. 12 janv. 2022 19:58
par Bud Spencer
Le pt’it bout de code à l’apéro. Bon, sur ce coup-là j’en ai bu 2 parce qu’il y a un petit détail qui me chiffonne, mais ce n’est pas grave, personne ne le remarquera :lol:

Alors, ça reprend le crobar que j’ai fait plus haut avec les 2 relais et j’ai ajouté 2 gpio en entrée pour des fins de course. Il y a 2 méthodes d’exposées pour piloter la porte (Open() et Close()), plus le status de l’objet et comme d’hab, un event qui envoi celui-ci aux abonnés. J'ai bien sur mis cet objet dans le module hardware.

Là ou j’ai un peu chiaddé le truc, c’est que j’ai ajouté un delais maxi de rotation du moteur. Cela va permettre d’utiliser l’objet avec ou sans fin de course et avec des durées de rotation différente pour la monté et la descente( timeoutup et timeoutdown dans le constructeur ) . Pourquoi différentes ? et bien tout simplement parce qu’il y a de fortes probabilités que la porte mette moins de temps à descendre qu’à monter (p@#\*n de gravité :o …). Sinon, j’ai verrouillé le truc de façon à ce que tous les appels inutiles soient ignorés ainsi que ceux fait pendant que la porte est en mouvement. Voilà, rien de bien compliqué, mais quand meme obligé de serrer le code pour que ça tienne dans une image
doorjs.png
doorjs.png (117.96 Kio) Vu 3379 fois
On a prévu 2 led sur le bazar. Une de pulsation qui va clignoter pour indiquer que le programme tourne et une autre qui indiquera si le wifi est bien connecté. Ce sera la prochaine brique que j'écrirais pitetre demain.

Re: [TUTO] Application web dynamique

Posté : jeu. 13 janv. 2022 20:14
par Bud Spencer
Et voilà le dernier objet qui nous manquait (en tous cas pour l’instant). C’est le panneau de commande (c’est pour ça que je l’ai appelé panel) que j'ai aussi mis dans le module hardware.

Là, c’est beaucoup plus simple que le tableau de bord d’un 747. Il y a juste 2 leds et un bouton inverseur avec point milieu. Une led clignotera à la seconde pour indiquer que le programme est bien vivant et l’autre s’allumera quand le reseau sera ok. Pour ce dernier test, je fais toute les 10 seconde un simple ping sur l’adresse du gateway (l’ip est passée en paramètre host dans le constructeur). L’inverseur à pour rôle de permettre de forcer la montée ou descente de la porte pour par exemple des opérations de maintenance. Il va de soi que ce bouton devra etre mis hors de portée de maitre renard :twisted:

pnljs.png
pnljs.png (77.83 Kio) Vu 3362 fois

Prochaine étape, voir comment on va utiliser tout ça dans le programme principal.

Re: [TUTO] Application web dynamique

Posté : ven. 14 janv. 2022 13:20
par Bud Spencer
Pour la partie hardware, on a essayé de faire propre. Perso, les montages autour de hat tout fait, hors de prix et souvent sous utilisés ainsi que les enchevêtrements de bout de fils soudés sur des plaque a trous, ce n’est pas mon truc. On a la chance aujourd’hui de pouvoir faire fabriquer des pcb de qualité pro pour 3 fois rien donc je trouve dommage de s’en priver. Coté logiciel, il en existe plusieurs en version free. François Moq a d’ailleurs fait sur le blog plusieurs très bon articles sur Kicad et JLPCB. Quand je suis en mode ‘perso’, j’utilise Diptrace PCB Layout en version freeware (jusqu'a 300 pasitlle)

Voilà donc à quoi ressemble notre montage : Fondamentalement, il y a juste 2 relais et 2 leds pilotés. Le reste n’est la que pour raccorder le PI, le sensor de luminosité et la connectique. Sur l’image le connecteur 40 pins est male. C’est le cas si l’on veut une liaison avec le PI en passant par une nappe 40 fils, sinon, on peut mettre un connecteur femelle et brocher le PI directement dessus. J’ai aussi sortie un connecteur 4 pins sur les broches de l’I2C en me disant que ça pouvait servir pour ajouter d’autre chose. Le connecteur 5v permet d’alimenter le PI par une alim extérieur ou à récupérer le 5v s’il est alimenté en usb. Comme d’hab, pas besoin de schéma de principe pour un truc aussi simple et ce dessin est suffisamment explicite.
pcb.png
pcb.png (70.06 Kio) Vu 3349 fois
Petit rappel des composants utilisés :
2 relais omron G5V2-5, 2 Transistor NPN BC337, 2 diode 1N4148, 4 résistances 2.2Ko, 2 résistances 180 ohms (pour les leds), 2 leds 10 mA, un connecteur HE10 40 pins (mâle ou femelle suivant l’usage), un connecteur 4 pins (facultatif) pour l’I2C, 3 borniers à vis 2 pins, 3 borniers à vis 3 pins. Les borniers sont au pas de 2.54 et peuvent être remplacé par un autre modèle de connectique ou tout simplement souder directement des fils sur le pcb.

Re: [TUTO] Application web dynamique

Posté : ven. 14 janv. 2022 13:28
par Bud Spencer
S'il vous prend de réaliser ce truc, vous pouvez télécharger le zip qui contient les fichiers gerber du pcb et le faire fabriquer chez JLPCB (de mémoire ~6€ ttc avec une livraison a 8-12 jours)
Vous pouvez visualiser le pcb en glissant simplement le fichier zip sur cette page : https://www.gerberviewer.io/view

Re: [TUTO] Application web dynamique

Posté : sam. 15 janv. 2022 10:57
par Bud Spencer
Voila ce que donne le montage dans la vraie vie. Pour pouvoir valider toutes les fonctionnalités du programme, j'ai câblé tous les 'periphériques'. Il y a les 2 fin de course, le bouton inverseur et le capteur jour/nuit. Pour simuler le moteur, j'ai monté 2 leds en inverse avec une résistance de 470 ohms et l'alimentation est reprise sur le 5v qui alimente le pi. Sur celui la, j'ai mis un connecteur 40 broches femelle ce qui permet d'enfiché directement le petit PI zero w au dos du montage.
ciproto.png
ciproto.png (566.98 Kio) Vu 3331 fois