Go Down

Topic: Serveur relais interactif ( volets roulants + arrosage ) (Read 19482 times) previous topic - next topic

iznobe

Bonsoir , voila un serveur interactif de relais qui peut supporter jusqu ' a 200 relais commandé par internet en local ou de l' exterieur ( avec DNS ou IP fixe externe ) .

Je tiens a preciser que le code principal n ' est pas de moi , c ' est notre ami J-M-L qui l ' a gracieusement mis a disposition dans son tuto de serveur web interactif sur le forum .

Moi je n ' ai qu ' ajouter la partie pour gerer les relais et adapter le code principal pour arduino mega 2560 avec shield ethernet 2 a base de chipset wiznet 5500 autant dire pas grand chose  :smiley-mr-green:  puisque J-M-L avait deja pratiquement tout codé ^^ il m ' aurait fallu que 4 ou 5 ans pour arriver a refaire ce genre de chose ...
Le code est en Piece Jointe a la fin du post  mais il ne comprend pas la prise en charge des 74HC95 .( peut gerer avec quelques modifs 60 relais , sans modification 46 relais )

En tout cas un grand merci pour votre tuto qui va pouvoir me regaler et avec je vais pouvoir domotiser ma maison et epater la galerie  :smiley-lol:


EDIT et modifs :
  • ajout de la prise en compte de l' acces internet
  • possibilité de fonctionner en IP fixe / DHCP
  • ajout de la RTC DS1307
  • ajout capteur humidité du sol
  • ajout detecteur de pluie
  • ajout de la mise a l' heure automatique de la RTC par serveur NTP via UDP
  • ajout de gestion d ' ouverture fermeture portail coulissant a contact sec
  • ajout de la gestion de relais heures creuses
  • ajout de la gestion automatique de l ' arrosage a intervalles reguliers en fonction des saisons et des zones
  • modification de la gestion des Timers , suppression de MSTimer2 remplacer par la bibliotheque de @J-M-L => AsyncTask qui permet une gestion par ID plus fine
  • ajout dans le code d ' un debug et test desactivable pour faciliter les modifs possibles ulterieures
  • reorganisation du code par categorie de fonction
  • correction de bugs


capture du serveur :


mise a jour du code en PJ + ajout de la bibliotheque de @ J-M-L.


pour la bibliotheque simpleRTC de @bricoleau , se rendre sur le post dedié : https://forum.arduino.cc/index.php?topic=390979.0

J-M-L

Merci pour le partage

Je jetterais un œil un peu plus approfondi dessus mais je suggèrerai de

- ne pas mettre 2000 pour le nombre de relais dans le code de demo vu qu'il ne gère pas le contrôle des pins autres que celles existantes et que ça prend beaucoup de mémoire pour rien donc

- comme votre code n'écoutera que des requêtes pour les relais vous pouvez changer
Code: [Select]
const char * labelsOfInterest[] = {"LED", "V", "W", "R"}; par
Code: [Select]
const char * labelsOfInterest[] = {"R"}; puisque rien d'autre ne devrait être envoyé par la page web et donc pas la peine non plus d'avoir des variables long V = 0, W = 0; juste la variable R serait nécessaire sans doute et bien sûr enlever dans la page web V,W, et la led

- vous avez commenté
Code: [Select]
// cause erreur IDE    int commandLength = strlen(urlCommand); en effet c'est une variable que je n'utilise pas dans cette fonction, ce n'est pas une erreur dans l'IDE juste un warning qui dit que le compilateur en fait va virer cela pour vous :) mais effectivement autant le commenter
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

iznobe

#2
Aug 04, 2017, 10:05 am Last Edit: Aug 04, 2017, 12:45 pm by iznobe
Bonjour , j ' ai passé a 16 le nombre relais , uniformiser l ' ecriture des constantes en maj , et fais les corrections que vous avez demandés .

Il reste que j ' ai oublié la fonction de reset des relais ... que je ferais un peu plus tard .

et du coup bien sur , j ' ai re-edité le fichier piece jointe .

Edit : pas trouvé mieux pour reset la configuration des relais ...

Mise a jour de la piece jointe .

Titof2375

#3
Aug 07, 2017, 06:15 pm Last Edit: Aug 07, 2017, 07:57 pm by Titof2375
Bonjour,
J'utiliserais votre programme pour conduire des volets roulants. Est-il possible avec une minuterie de varier la durée de la mise en service des relais?

bricoleau

Bonjour

Ne perds pas de vue que la principale difficulté technique d'un tel projet, réside dans la maîtrise des aspects purement électriques.

Arduino + relais = courants faibles + courants forts

Sur le plan purement logiciel, piloter n sorties de l'arduino n'est pas le plus dur.
Par contre, assurer derrière une parfaite isolation et indépendance des circuits, une alimentation des relais dont la puissance doit être correctement dimensionnée, sans parasites qui remontent depuis les circuits de puissance vers l'arduino, ça c'est le plus délicat.

Par ailleurs, il faut absolument rappeler en permanence que jouer avec des courants forts est potentiellement dangereux. Pas question d'avoir des montages approximatifs en aval de l'arduino.

Tu trouveras par exemple sur le forum des écrits très précis de _pepe_ sur ces sujets

iznobe

Bonjour,
J'utiliserais votre programme pour conduire des volets roulants. Est-il possible avec une minuterie de varier la durée de la mise en service des relais?
Bonjour oui bien sur , grace a la fonction millis () ou bien une biliotheque doit exister me semble t il .

Il est evident que le 220 Volts presente des risques importants , il faut faire ses branchements soigneusement , dans des boitiers electriques completements isolés et en ayant coupé le courant bien entendu .

J-M-L

Si vous utilisez millis pour attendre ou delay ça va empêcher d'écouter le web... faut une machine à état
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

iznobe

Bonjour ,

Depuis j ' ai amelioré le serveur , plus specialisé pour les volets roulants .

Gestion DHCP / IP fixe

j ' y ai ajouté une minuterie non bloquante et auto reinitialisée , mais  sans faire de machine a etat ( ou alors je ne suis pas au couant  :) )
j ' ai aussi ajouté une fonction qui permet d' arreter les volets quand on le desire pendant la montée ou la descente .
j ' ai ajouté quelques options de securité : une delai entre la montée et la descente et l' inverse .

une fonction qui empeche de commuter en meme temps la montée et la descente .

et deux 3 autres bricoles dont je ne me souviens plus .

Code amelioré en piece jointe .

lesept

Merci iznobe
J'aimerais en savoir plus sur la manière de brancher le relais sur le volet roulant. Et comment est gérée la fin de course en montée et en descente.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

iznobe

Salut ,

si on part avec 8 volets , il faut 16 relais . constante a modifier dans le code .

les 8 premiers relais sont pour la montée , et les 8 autres pour la descente .

il suffit de cabler les moteurs avec le fil de montée sur le relais avec la phase en NO .
le fil de descente sur le relais avec la phase en NO .

Chez moi la butée est gerée par le moteur en interne , y a un reglage .

le timer permet de s ' assurer d' arriver en butée , j' ai pris le temps que mettait le volet le plus long a se fermer et j ' ai rajouté 2 secondes , ce qui me fait 30 sec ( on peut facilement modifier dans le code , juste une variable )

le bouton stop , reset le timer en cours , et bien sur arrete le volet a l ' endroit desiré .

rien de tres compliqué  :-[

Par contre , il faut finir de nettoyer le code , il ya des fonctions et des variables inutiles pour les volets roulants ..

j ' editerai plus propre des que j' ai un peu de temps .

iznobe

Re-salut ,

voici donc le code nettoyé en PJ j ' ai enlever certaines variables qui me servait a autre chose , capteurs etc .

je n' ai pas teste ce code car pas envie de demonter pour tester .

si il n ' est pas fonctionnel n ' hesiter pas a me le signaler .

toutes suggestions d' amelioration sont les bienvenues .


iznobe

Salut ,

@J-M-L , si vous passez par là , j ' aurais besoin d' aide sur un probleme au niveau du serveur en lui meme .

voici le probleme :

lorsque ma femme ouvre ou ferme les volets avec son telephone , bien sur elle ne ferme pas la page ni ne l' actualise .

Du coup lorsqu ' elle revient dessus pour fermer ou ouvrir , la " requete est deja lancé " j 'entends par là que l' adresse est par exemple : mon_ip/R=1 , et bien sur l ' arduino prend en compte la commande ...

quelle serait la solution la plus " propre " pour resoudre cette problematique .

j ' ai pensé a ajouter par exemple POST dans les boutons actions et verifier qu il y a bien POST avant de faire une action tout simplement , mais je ne suis pas certain que ca soit tres propre , ca fait penser a du PHP :D

mais du coup je n' aurais que quelques modifications mineures a apporter a 3 ou 4 fonctions dans le code en PJ .

Je ne suis meme pas certain que ca marchera , car l ' adresse sera encore certainement conservé dans la barre du navigateur ...

Note : le " refresh = xx " ne fonctionne pas chez moi .

bref toutes les idees a exploiter sur ce probleme sont bonnes a prendre , merci pour votre aide .

J-M-L

Quote
quelle serait la solution la plus " propre " pour resoudre cette problematique .
être galant et ne pas laisser votre femme fermer les volets et le faire vous même :)

Oui quand on utilise l'URL pour passer des commandes ça peut conduire à des soucis puisque le navigateur reste sur cette URL.

Un moyen à explorer serait de faire un HTTP redirect ou un  <meta> element avec son attribut http-equiv mis à Refresh dans le <head> de la page --> quand la page s'affiche le browser ira à l'URL indiquée
Code: [Select]
<head>
  <meta http-equiv="Refresh" content="0; URL=https://monAdresse/">
</head>
pour que le navigateur change son URL à la page d'accueil du site

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

iznobe

être galant et ne pas laisser votre femme fermer les volets et le faire vous même :)

:D , je suis galant ( enfin ca m ' arrive ) , mais parfois , simplement absent ^^ !

Oui quand on utilise l'URL pour passer des commandes ça peut conduire à des soucis puisque le navigateur reste sur cette URL.

Un moyen à explorer serait de faire un HTTP redirect ou un  <meta> element avec son attribut http-equiv mis à Refresh dans le <head> de la page --> quand la page s'affiche le browser ira à l'URL indiquée
Code: [Select]
<head>
  <meta http-equiv="Refresh" content="0; URL=https://monAdresse/">
</head>

pour que le navigateur change son URL à la page d'accueil du site
merci pour l ' info . j ' ai modifié mon code , mais pas encore teste .

iznobe

Salut ,
j ' ai teste , le code de refraichissement , firefox bloque le rafraichissement automatique .

mais bon le probleme n ' est pas la .

ca ne respecte pas le temps donné dans le code HTML et ca ne change pas l' adresse .

du coup ca ne correspond pas a ce que je cherche a faire .

j ' ai modifié le serveur de façon a gerer 6 zones d' arrosage distinctes .

le code n' est pas terminé , il faut encore que j ' ajoute un RTC de façon a pouvoir gerer cela hebdomadairement et par saison .

les commandes manuelles de l' arrosage du serveur sont fonctionnelles ainsi que le capteur de pluie et d' humidité du sol , afin de n ' arroser que quand c ' est necessaire . pour le moment la gestion automatique de l ' arrosage et hebdo ne sont pas implementés .

le code est en PJ pour ceux que ca interrresse  :)

PS : je ne sais pas qui a telecharge le fichier joint , mais il y avait une erreur ou 2 que j' ai corrigé avec le nouveau fichier .
desolé , j ' en ai profité pour simplifier l ' ecriture du code et ameliorer les fonctions de gestion des relais .

Go Up