Contrôleur domestique intelligent Arduino Mega 2560 opensource avec prise en charge de MQTT, DMX-512, 1 fil, Modbus et Openhab

Aujourd'hui, j'ai décidé de présenter au public un projet sur lequel je travaillais depuis quelques années: LightHub . Ce qui s'est finalement avéré peut être appelé la solution la moins chère pour créer une maison intelligente, qui peut néanmoins:

  • Contrôler les dispositifs d'éclairage et d'alimentation (relais, gradateurs DMX-512 et Modbus RTU)
  • Gérer le chauffage au sol (une douzaine et demi de DS18B20 bon marché dilués dans l'appartement sont utilisés comme capteurs de température)
  • Actionner les vannes de ventilation / climatisation
  • Gérez un système de ventilation de fortune.
  • Beaucoup de choses auxquelles je n'avais pas pensé au début, simplement parce que le contrôleur s'est avéré être complètement ouvert, configurable de manière flexible et parfaitement complémentaire aux solutions OpenSource Openhab + Mosquitto + NodeRed

Les commutateurs, boutons, capteurs de contact, capteurs de fuite, etc. conventionnels, qui peuvent contrôler à la fois les charges locales et les appareils connectés à d'autres mêmes contrôleurs ou à tout ce qui comprend le protocole MQTT, sont connectés à l'entrée du contrôleur. Par exemple, j'ai un interrupteur à lames installé dans le boîtier de la porte avant. Lorsque je ferme la serrure de trois tours, les lumières s'éteignent, le chauffage au sol, les chaudières, le récepteur AV. À mon retour, l'état de ces appareils est rétabli tel qu'il était avant de partir.

À la sortie - par exemple, ces modules de relais , DMX, périphériques Modbus.

Les contrôleurs sont configurés à l'aide de fichiers JSON, qui sont chargés via http au démarrage du contrôleur (en outre, la configuration peut être enregistrée dans NVRAM via la Serial CLI). Et, bien sûr, tout cela est contrôlé par le système Openhab 2, via une application mobile régulière.
Les tâches de "petite automatisation" sont résolues à la fois à l'aide des règles normales d'Openhab (pas très pratiques) et à l'aide de NodeRed. (Concernant NodeRed, voici un article qui décrit parfaitement un exemple d'automatisation.)

Les sources, ainsi que des exemples de configurations, sont publiées sur GIThub , une petite partie de la description est publiée sur le site Web du projet. En conséquence, une histoire plus complète sous la coupe.

MISE À JOUR: Six mois se sont écoulés depuis la publication, et voici à quoi ressemble le prototype industriel de l'appareil lors de son installation dans une armoire électrique.

La carte Arduino DUE est installée sur la carte mère.

La carte est retirée, isolation optique visible, protection d'entrée, DMX, Modbus, pilotes 1 fil, un transistor puissant (par exemple) pour contrôler le relais.

Et voici à quoi ressemble le contrôleur sur un rail DIN (le couvercle est retiré), à côté d'un bloc de relais typique. (Comme je l'ai écrit, je ne mets délibérément pas d'éléments de puissance à l'intérieur du boîtier du contrôleur)

Tout a commencé par des réparations dans l'appartement, au cours desquelles j'ai décidé de rendre la maison décemment plus intelligente.
En même temps, franchement, je ne voulais pas dépenser de l'argent sérieux pour la solution «Marque» de la Smart House. De plus, de nombreuses solutions «sérieuses» utilisent des normes fermées et s'intègrent les unes aux autres à l'aide de béquilles.

En conséquence, je me suis fixé pour tâche d'assembler une maison intelligente à partir des composants les plus prêts à l'emploi et les moins chers.

En tant que matériel pour le contrôleur, j'ai choisi le blindage Ethernet Arduino Mega 2560 +.
Mise à jour: Après avoir écouté les commentaires ci-dessous, j'ai porté le projet sur Atmel SAM3X8E ARM Cortex-M3 (Arduino DUE), une carte qui, au même prix bon marché, a des performances supérieures d'un ordre de grandeur, et surtout, de la RAM. J'ai dû bricoler avec la bibliothèque DMX, mais maintenant les DMX-IN et DMX-OUT fonctionnent à l'aide d'un seul matériel USART, sans prendre les ressources du processeur. Le projet se trouve déjà sur github et est compilé automatiquement pour la plateforme souhaitée.

Un prix d'un centime, un grand nombre de ports d'entrée / sortie, 4 UART matériels, une taille décente de NVRAM, que j'ai réussi à occuper jusqu'à présent à seulement 30% du firmware et qui correspondent à l'ensemble de la configuration avec une marge, et directement au format JSON a confirmé le caractère raisonnable du choix.

Après avoir mis à jour le Bootloader et ajusté la bibliothèque Ethernet, j'ai pu utiliser avec succès le Watchdog matériel du processeur, ce qui a ajouté à la décision de "l'industrie" et j'ai toujours la tranquillité d'esprit, même si le firmware n'a pas été remarqué même sans lui.

L'absence de tout système d'exploitation sur le contrôleur nous permet de le considérer comme un «système en temps réel», ce qui permet, par exemple, de générer par programmation le même signal DMX.
Le goulot d'étranglement est la taille de la RAM. Et cela ne permet pas d'utiliser toute la vaste périphérie du contrôleur. Bien que, plus de 30 canaux différents (éléments, en termes de configuration) s'intègrent parfaitement dans la mémoire. Et se connecter autant que le permet la carte Arduino Mega est une tâche, néanmoins, non liée à la réalité.
(sur ARM - il n'y a plus de goulot d'étranglement)

De plus, l'évolutivité est obtenue en augmentant le nombre d'appareils. Par exemple, j'ai deux contrôleurs impliqués. Ils sont espacés autour de l'appartement (cela vous permet également de ne pas tirer tous les fils en un seul point). Pour l'interaction entre eux, ainsi qu'avec les systèmes Openhab et NodeRed, le courtier MQTT Mosquitto est utilisé.

En tant que pilote de bus à 1 fil, j'ai utilisé une puce ds2482-100 (pilote I2C) avec Aliexpress , qui au prix de 60 roubles garantit un fonctionnement stable avec un bus jusqu'à 100M.

Pour une configuration flexible de l'appareil, j'ai modifié la bibliothèque AJSON pour Arduino, afin qu'elle puisse à la fois charger un objet via http, lire et écrire un objet depuis / vers le contrôleur NVRAM. Fork est disponible sur Github .

CLI série lors de la création d'un nouveau contrôleur, vous devez enregistrer une adresse MAC unique dans la NVRAM. Ce MAC est la clé par laquelle la configuration du serveur http est initialement chargée.

En tant que logiciel de gestion, j'ai pris Openhab 2, qui possède toutes les fonctionnalités dont j'ai besoin, plus une application mobile, plus Cloud, dont le rôle, cependant, est seulement de fournir un accès à l'infrastructure domestique de l'extérieur, sans rediriger les ports sur le routeur et sans avoir IP fixe. De plus, Openhab a une intégration avec HomeKit d'Apple, qui vous permet de contrôler les appareils à la maison avec l'iPhone, sans installer d'application du tout. (L'occasion est intéressante, mais j'utilise principalement l'application "native").

Quelques captures d'écran d'Openhab




La présence d'un grand nombre d'éclairage LED dans le projet d'appartement a également nécessité une gestion raisonnable.

Détails d'éclairage LED
Les solutions trouvées sur le marché étaient soit des «choses en soi» fermées, soit un coût insuffisant, tout en prenant en charge peu de canaux. Souvent, les fabricants étaient limités à trois canaux (RVB), bien que l'option RGBW permette l'utilisation de bandes LED comme éclairage principal, et pas seulement pour l'éclairage couleur.

En pensant, j'ai commandé quelques cartes sur AliExpress, chacune pouvant contrôler 30 canaux LED avec un courant nominal allant jusqu'à 2A par canal.

Afin d'augmenter la puissance maximale d'un canal, je suis passé de bandes LED à des bandes 12V à 24V. Dans ce cas, illuminez complètement la pièce d'environ 16 à 18 mètres carrés. m était possible avec 4 touches. Les plus grands locaux devaient être zonés - dans le salon, je connectais indépendamment 4 bandes de 5 m chacune, en utilisant 16 canaux.

Pour un contrôle synchrone de toute la pièce, je devais trouver le type de canal "groupe"

Voici la description du salon dans la configuration JSON:

"kuh":[7,["kuhline","kuhfre","kuhwork","kuhwin"]], "kuhwin":[1,5], "kuhline":[1,13], "kuhfre":[1,25], "kuhwork":[1,1], 

Le premier élément du tableau est le type de canal, le second est le paramètre du canal, qui peut être un tableau.

Pour un élément de type 7 (groupe), l'argument est un tableau d'éléments dans le groupe.
La récursivité, bien sûr, est prise en charge.

Pour un élément de type 1 (bande RGBW), l'argument est l'adresse DMX de base du canal.

Avec la bibliothèque standard EasyDMX, les cartes ne fonctionnaient pas tout de suite. Il s'est avéré que le contrôleur LED chinois n'a pas digéré le délai de 2 ms entre les trames DMX (délai intertrame). Une simple modification du code de la bibliothèque (réduction de moitié du cycle) a aidé.

Bibliothèques Fork sur github
À la demande des lecteurs, ajout de photos sur le thème "L'éclairage LED en action"

Il s'agit d'un décodeur DMX alternatif de la catégorie «cher et riche»

De plus, une «séance photo», sur laquelle vous pouvez comprendre à quel point la pièce change lorsque l'éclairage change, ainsi que le fait qu'en utilisant uniquement la couleur blanche dans les rubans RGBW, vous pouvez obtenir un éclairage diffus qui est agréable à l'œil.
Je recommande les bandes exclusivement avec une lumière blanche chaude (2700K)

















Et puis, quelques exemples de la combinaison de projecteurs et de LED:









Éclairage AC 220V ordinaire, j'ai réussi à contrôler les gradateurs chinois avec Aliexpress qui prennent en charge Modbus RTU (protocole de contrôle industriel standard sur RS-485). Ces gradateurs sont parfaitement contrôlés localement (par des commutateurs sans verrouillage), en même temps, le contrôleur a la capacité de lire la luminosité et de les contrôler via Modbus (mis en œuvre jusqu'à présent pour un appareil à deux canaux).

Au moment de la publication de l'article, il manquait des gradateurs sur Aliexpress, mais j'ai trouvé un fabricant chinois par étiquette sur le circuit imprimé de l'appareil. Voici un lien vers leur site ascétique . Nous répondons avec impatience aux questions par e-mail, même envoyé une documentation limitée.

Une autre option pour contrôler l'éclairage 220V consiste à utiliser un gradateur AC DMX-512. Sur e-bay comme dans l'assortiment, tout facteur de forme - une carte ou sur un rail DIN. Un à huit canaux.
Au début, j'ai fait attention à cette option, car le contrôleur était encore dans une forme très expérimentale et, pour la fiabilité, je voulais garder un contrôle local autonome. Mais maintenant, j'utiliserais déjà cette option.

Ensuite - j'ai installé un climatiseur à canal, qui est capable de chauffer et de refroidir tout l'appartement. Afin de répartir le froid et la chaleur dans les chambres, j'ai installé des servos avec contrôle de signal 0-10V. L'angle d'ouverture de la vanne est automatiquement ajusté à l'aide de NodeRed, dans lequel un contrôleur PID pratique a été trouvé pour cela.

Détails sur la climatisation
Malheureusement, il n'était pas possible de trouver des entraînements de registre d'air avec un PWM ou une entrée numérique, donc 4 convertisseurs PWM en un signal analogique standard 0..10V ont été achetés sur le même AliExpress.

Malheureusement, je ne vois pas ces appareils sur Aliexpress, mais sur e-bay - s'il vous plaît

Les convertisseurs fonctionnaient très bien tout de suite, je devais juste reprogrammer la minuterie de sortie PWM afin de régler la fréquence appropriée.

Ci-dessous, un exemple de reprogrammation des temporisateurs 3 et 4 (responsables des broches 2, 3, 5, 6, 7, 8 Arduino Mega à une fréquence de 4000 Hz).

  pinMode(iaddr,OUTPUT); //timer 0 for pin 13 and 4 //timer 1 for pin 12 and 11 //timer 2 for pin 10 and 9 //timer 3 for pin 5 and 3 and 2 //timer 4 for pin 8 and 7 and 6 int tval = 7; // 111 in binary - used as an eraser TCCR4B &= ~tval; // set the three bits in TCCR2B to 0 TCCR3B &= ~tval; tval=2; //prescaler = 2 ---> PWM frequency is 4000 Hz TCCR4B|=tval; TCCR3B|=tval; analogWrite(iaddr,k=map(Value,0,100,0,255)); 


Ensuite, j'ai commencé à chercher des contrôleurs de chauffage par le sol WiFi. J'ai trouvé, en général, un bon appareil d'une valeur d'environ 6 000 roubles de Teplolux, mais il avait des inconvénients importants pour moi.

Malgré la présence d'une application mobile, le protocole de contrôle a été fermé. J'ai fait de l'ingénierie inverse, qui a montré que, théoriquement, le protocole peut être décrypté. J'aurais peut-être fait cela, mais j'ai constaté que sans réinstaller les sockets, ce périphérique n'est pas installé dans la même rangée avec les commutateurs. Cela a déterminé le sort de l'appareil: l'ayant vendu, j'ai implémenté la fonctionnalité d'un simple thermostat sur mon contrôleur, économisant près de 30 mille roubles sur 5 étages chauds.

Il s'est avéré ce qui suit:
  • Toute la gestion - localement sur le contrôleur et indépendamment de l'infrastructure informatique domestique
  • Les mesures des capteurs de température à 1 fil sont utilisées. Si le capteur ne peut pas être interrogé pendant une longue période, le chauffage s'éteint.
  • Grâce à MQTT, vous pouvez activer / désactiver le plancher chaud et régler sa température. En conséquence, les sols sont contrôlés via des interfaces et l'application mobile Openhab
  • Je n'ai pas implémenté de scripts et de plannings délicats sur le contrôleur. Si vous le souhaitez, cela est facilement implémenté par les règles Openhab ou Node-Red. Je me suis limité à éteindre les appareils lorsque les gens quittent la maison.

Voici un exemple de configuration pour un plancher chaud:

 "ow":{ "2807FFD503000036":{"emit":"t_bath1","item":"h_bath1"} }, "items":{ "h_bath1":[5,24,33], }, 

Lors de l'interrogation d'un thermomètre OneWire avec l'adresse spécifiée, il est transféré au bus MQTT dans la rubrique t_bath1, et également, à l'intérieur du contrôleur, à l'objet h_bath de type n ° 5 (thermostat), le relais est connecté à la broche # 24 du contrôleur, le réglage est de 33 degrés (peut être ajusté par MQTT )

Entrées de l'appareil

Dans la configuration de chaque entrée, vous pouvez spécifier comment la commande est envoyée à l'objet local et la commande est émise dans la rubrique MQTT. De plus, séparément pour le "pressage" conditionnel du bouton et le "relâchement".

Exemples:
 "in":{ "41":{"emit":"/myhome/in/all","scmd":"HALT","rcmd":"REST"}, "38":{"item":"spots_en"}, "37":{"emit":"/myhome/in/light","scmd":"ON","rcmd":"OFF"}, "40":{"emit":"/myhome/in/gstall","scmd":"TOGGLE","rcmd":"TOGGLE"}, "35":{"emit":"/myhome/s_out/water_leak"} } 

Broche 41: interrupteur Reed sur le verrou de la porte avant - lorsqu'il est verrouillé - émettez la commande HALT vers le sujet / myhome / in / all, lorsqu'il est déverrouillé - la commande REST.

Pour moi, cela mène à «s'endormir» et à «se réveiller» à la maison. Soit dit en passant - les commandes ne sont pas incluses dans l'ensemble OpenHab standard, mais cela s'est avéré extrêmement pratique - HALT - éteint l'appareil, REST - restaure les paramètres de l'appareil à la dernière valeur (couleur, luminosité, température), mais uniquement pour l'appareil qui a été éteint par la commande HALT et non OFF Cela vous permet de ne pas inclure ce qui a été désactivé au moment de quitter la maison.

Broche 38: juste un interrupteur d'éclairage ordinaire. Lorsqu'il est fermé, il émet (par défaut) la commande ON, lorsqu'il est ouvert, la commande OFF. Ces valeurs sont transmises à l'objet spots_en. Il est clair que l'état d'un objet peut être modifié à partir d'une application mobile. Dans ce cas, l'interrupteur, pour ainsi dire, reste, par exemple, en position marche, mais le voyant est éteint.

Pour les amateurs de commutateurs classiques, la syntaxe de la broche 40 convient: à la fois lorsqu'elle est activée et désactivée, la commande TOGGLE est émise (également, accessoirement, une nouvelle, par rapport à OpenHab), qui modifie la position On-Off de l'appareil (dans cet exemple, la lampe n'est pas contrôlée localement, mais via MQTT un autre contrôleur).

Si ce n'est pas un interrupteur à bascule mais un bouton, ajustez simplement "rcmd": "" - il ne donnera une commande de commutateur que lorsque vous appuyez dessus.

Ah, eh bien, j'ai presque oublié de décrire DMX-IN - l'entrée pour laquelle, pourrait-on dire, j'ai commencé ce développement.

Il existe sur le marché de nombreux contrôleurs de bande DMX LED ergonomiques et réussis par les concepteurs.

J'ai acheté l' un d'entre eux (écran tactile) au tout début pour expérimenter le DMX. Tout va bien, mais l'architecture DMX ne fournit aucun contrôle depuis plus d'un endroit. Il y a un maître, qui se traduit constamment par le canal de luminosité des canaux. Mais dans ce projet, ce problème est résolu. Le contrôleur LightHub surveille les changements de canaux DMX à l'entrée connectée à l'écran tactile. S'ils changent, il traduit les changements dans la sortie (avec mappage sur les appareils configurés, y compris les groupes de bandes LED).

Jusqu'à présent, rien n'a changé - les appareils sont normalement contrôlés à distance. Il vaut la peine que l'écran tactile modifie les valeurs de luminosité des canaux - ces changements sont transmis aux sorties DMX.

Curieusement, cette béquille s'est avérée assez ergonomique. Bien que, comme l'expérience l'a montré, nous sommes de moins en moins susceptibles d'utiliser l'écran tactile et de plus en plus les smartphones pour contrôler les appareils.

Conclusion

Malheureusement, dans un article, il est impossible de décrire toutes les nuances inhérentes au développement.
Par exemple, le sujet de la connexion des appareils Modbus, leur extraction et synchronisation de l'état local de l'appareil avec le système Smart Home, l'intégration avec une simple installation d'alimentation sont restés complètement dans les coulisses. Eh bien, et peut-être une comparaison avec les systèmes existants de classes connexes, tels que, par exemple, MegaD-328, AMS et, même, WirenBoard. Peut-être qu'en cas d'intérêt, je continuerai.

De plus, en coulisses, en utilisant NodeRed, nous avons pu intégrer le système à Telegram. Bien que cela fonctionne pour recevoir des alertes, mais vous pouvez créer un bot complet.

En ce qui concerne le projet LightHub - malgré son bon marché, les contrôleurs se sont avérés être une solution complètement fonctionnelle. Honnêtement, je ne croyais pas moi-même que sur la base d'Arduino, vous pouvez créer un système de travail stable, mais, à mon avis, c'était possible.

Bien sûr, il reste encore beaucoup à faire: s'éloigner complètement du code dur (juste un peu à gauche), nettoyer et refactoriser un peu le code, documenter soigneusement le projet, ouvrir la carte de circuit imprimé (maintenant les Shields d'interface sont soudés simplement sur la base de maquettes et contiennent trois MAX-485 - (DMX-IN, DMX-OUT, Modbus) et 1-Wire bridge) - et cela deviendra, en fait, une solution clé en main très peu coûteuse.

Attention: je vous rappelle que le projet est toujours au niveau de la maquette. En ouvrant le spoiler suivant, vous pouvez endommager vos sens esthétiques.
Quelques photos

Le premier contrôleur qui contrôle la LED (60 canaux DMX-512), Modbus (gradateurs, entrée), volets;


Il s'agit d'un décodeur DMX-512, qui est pratique à placer là où la bande LED vient aux transformateurs. J'ai - sous le faux plafond dans le garde-manger.



Et c'est le deuxième contrôleur desservant 1 fil, des interrupteurs / capteurs et un module relais. (Le module relais lui-même était situé juste dans la boîte de jonction, où il appartient aux trois phases. J'ai éradiqué le voisinage de 380V et des courants faibles dans la mesure du possible après un incident infructueux)


Il est clair qu'il est nécessaire d'étendre la fonctionnalité. Au minimum, vers des capteurs / appareils sans fil. (Bien que, par exemple, ZWave puisse désormais être utilisé via des classeurs Openhab standard).

La possibilité de connecter, par exemple, le budget NooLight est probablement une bonne idée. Je penserai peut-être à migrer vers l'ESP-8266 pour étendre la RAM, bien que je n'aime pas quitter le Wi-Fi à partir d'une connexion LAN filaire en termes de fiabilité. Oui, et ESP n'a pas une périphérie aussi riche que Arduino Mega. Je prévois également de faire la mesure de l'électricité à travers des capteurs de courant et de connecter le codeur rotatif à l'entrée.

En outre, il serait utile de rendre la configuration et le démarrage du contrôleur plus conviviaux (configurateurs visuels, etc.). En même temps, je ne veux pas délibérément transformer le contrôleur en serveur Web avec des fichiers / images, AJAX, etc. À mon avis, cela devrait déjà être la prérogative du serveur. Au moins basé sur la framboise.

Mais comme le projet est absolument open-source - différentes options sont possibles, rejoignez-nous.
Aussi, je me réjouis de vos commentaires.

MISE À JOUR:


Après la publication de l'article, après avoir uni nos forces avec l'un des habitants de Habr et dessiné un diagramme schématique du bouclier LighthHub, nous avons commencé à disposer le circuit imprimé, en tenant compte de toute l'expérience et des commentaires significatifs

  • La carte sera compatible avec Arduino Mega (5v) et Arduino DUE (ARM 3.3V)
  • Interface Ethernet intégrée basée sur Wiznet5500
  • 8 entrées TOR optocouplées, 8 entrées / sorties TOR avec protection tension / courant
  • 8 entrées analogiques avec protection tension / courant. À l'avenir, je propose d'utiliser des entrées analogiques pour contrôler la consommation d'énergie (capteurs de courant) et pour connecter des potentiomètres externes (gradateurs)
  • 8 sorties PWM, dont 4 avec touches de sortie puissantes (jusqu'à 500 mA / 50V) + 4 sorties puissantes discrètes. Ils vous permettront de vous connecter localement au contrôleur, par exemple, plusieurs démarreurs ou même une bande LED RGBW pas très longue.
  • Un connecteur au format UEXT, qui vous permettra par la suite de connecter un périphérique compatible au contrôleur - par exemple, des modules radio supplémentaires pour la connexion à des appareils sans fil.
  • Les entrées / sorties restantes seront sorties sans protection vers les connecteurs RJ45 pour connecter les appareils locaux (cartes relais, DAC, etc.)
  • Bien sûr, il reste des interfaces 1-Wire pour connecter des capteurs de température, une entrée et une sortie DMX-512 pour le contrôle de l'éclairage, Modbus RTU pour tout le reste


Vous pouvez laisser des commentaires sur la fonctionnalité, ainsi que le désir de rejoindre la commande du premier lot de planches, ici

Le prochain point du programme sera le développement d'une carte contrôleur avec un module ESP32 intégré (cela vous permettra de vous éloigner du facteur de forme Arduino)

Source: https://habr.com/ru/post/fr407975/


All Articles