
Rien d'extraordinaire, juste un autre contrôleur Arduino. Avec des capteurs, des bobines et une page Web. Mais avec ses propres caractéristiques et une application pratique très spécifique, bien que tout à fait banale - l'inclusion à distance du chauffage électrique dans le pays. Les citations dans l'en-tête ne sont pas aléatoires, le contrôleur n'est pas une maison intelligente dans la version actuelle, mais sert de bonne base pour cela.
(note - cette phrase a été ajoutée le 04/12/18 sur la base des commentaires).Caractéristiques clés:
- Capteur de paramètres de réseau électrique - compteur électrique «Neva» selon RS-485;
- Modification Ă distance de la page Web de contrĂ´le se trouvant sur la carte SD;
- Inclusion fiable d'un groupe de capteurs de température de Dallas sur de longues lignes;
- Graphiques des changements de paramètres sans impliquer les services cloud;
- Solutions de sécurité (chien de garde externe, UPS, redémarrage automatique du routeur);
- Protection du bouclier Internet contre le gel pendant les interférences des relais de puissance;
- Conception complète dans un boîtier sur rail DIN.
J'ai fait ce système lentement, à titre de divertissement, de temps en temps en lançant le projet pendant des mois ... Cela a pris environ un an et demi de l'idée à la mise en œuvre :)
Depuis avant que je n'avais pas affaire aux microcontrôleurs, j'ai commencé avec le kit de démarrage avec aliexpress, joué avec des LED, des boutons et des capteurs, j'ai compris quelque chose et j'ai commencé à construire un contrôleur pour la télécommande et la surveillance. Eh bien, la «maison intelligente» n'est pas directe, bien sûr, mais quelque chose comme ça.
L'objectif pratique a d'abord été fixé un - allumer à distance le chauffage dans le pays. Je n’ai pas encore réussi à construire une maison (mes mains n’ont pas atteint, hein), mais j’ai un magnifique
chalet d’été confortable en viande hachée chauffée par des convecteurs électriques. Réchauffez un vestiaire qui s'est refroidi pendant la semaine vendredi soir - une opportunité très tentante pendant la saison froide.
Cependant, la tâche de contrôle à distance de la charge s'est avérée assez banale. Arduino plus le bouclier Internet, un croquis prêt à l'emploi d'Internet et les bobines cliquent déjà à partir des coches sur la page Web. L'objectif pratique a en quelque sorte été atteint très rapidement et simplement. Et c'était ennuyeux. Je voulais quelque chose de plus intéressant.
Je me suis fixé un deuxième objectif pratique: surveiller la consommation actuelle du réseau de chalets d'été. J'ai eu des capteurs de courant sans prétention pour les tests, j'ai joué. Tout fonctionnait bien, mais cette option n'était pas adaptée au travail de combat. Je ne pouvais pas trouver de capteurs plus puissants que sur 5A, mais j'avais besoin d'au moins 25A.
Et j'ai eu l'idée d'utiliser un compteur d'électricité comme capteur de puissance. Et c'était une grande pensée! Et j'ai créé un tel appareil, et j'ai vu que c'était bon! Non sans difficultés, mais j'ai parfaitement accompli cette tâche, avec pour résultat un sentiment de profonde satisfaction, et je vous le dirai ci-dessous :).
FonctionnelLa première (et jusqu'à présent la dernière) version de combat du contrôleur "maison intelligente" a cette fonctionnalité:
- Contrôle manuel à distance de l'activation du relais de puissance via un navigateur et surveillance de leur état actuel;
- Surveillance à distance des paramètres d'un réseau d'alimentation triphasé (tension, courant, fréquence et bien d'autres déchets inutiles, que j'ai ensuite éteints);
- Surveillance à distance des relevés d'un compteur d'électricité à deux tarifs;
- Surveillance à distance d'un groupe de capteurs de température;
- Enregistrement des données et enregistrement des événements sur une carte mémoire;
- Affichage dans le navigateur des données de tous les capteurs du jour sélectionné sous forme de graphiques.
IdéologieLe principe de la construction de l'ensemble du système - sans utiliser de services cloud tiers et de serveurs de collecte et d'affichage de données. Ce n'est ni bon ni mauvais. Au stade initial de la «construction intelligente», un tel schéma est suffisant et simple. Bien qu'il impose certaines restrictions d'utilisation.
Arduino avec un bouclier Internet est le seul serveur Web du système. La page Web avec l'interface de gestion est stockée sur la carte mémoire Internet et transmise au navigateur lorsqu'elle est accessible par l'adresse IP spécifiée. L'interaction de l'interface utilisateur avec Arduino se poursuit via des scripts java, dont les corps ne sont pas intégrés dans la page Web, mais sont stockés sur mon stockage de fichiers personnels avec accès à Internet. Cette approche réduit le poids de la page Web, ce qui accélère sa lecture depuis la carte SD et vous permet de modifier plus rapidement et facilement le code du script.
La lecture du journal de données pour l'affichage des graphiques est effectuée à partir de la carte mémoire sur demande (en appuyant sur un bouton dans un navigateur). Les données sont affichées uniquement dans la session en cours de la page du navigateur, elles ne sont enregistrées nulle part et lorsque vous rechargez la page, vous devez la relire. C'est un inconvénient de l'idéologie, car la lecture à partir d'une carte mémoire est assez lente, et l'obtention d'une quantité quotidienne de données peut prendre une minute ou deux (il y avait une idée de retravailler le format de stockage des données pour réduire sa taille et accélérer la lecture).
Les valeurs actuelles des capteurs sont affichées sur la page et mises à jour en temps réel avec la fréquence du cycle de boucle, que j'ai est d'environ 1 Hz.
Il n'y a plus de «smartness» dans l'algorithme maintenant. Si je vais admonester l'algorithme à l'avenir - je ne sais pas, pour l'instant la version actuelle me satisfait complètement.
Topologie du réseauAu chalet, Internet mobile Yota (modem usb + routeur wifi). Il n'y a pas d'adresse IP fixe et il n'y a aucun moyen de l'obtenir non plus, même pour de l'argent. Et même s'il n'y a pas d'adresse IP blanche dynamique, DynDNS n'est pas applicable. Seule l'adresse IP grise du réseau interne Yota. IPota Yota ne prend pas en charge (au moins pour 2017, c'est le cas). Par conséquent, je n'ai trouvé qu'un seul moyen d'accéder au routeur du pays de l'extérieur - VPN.
À la maison (dans la ville) Internet filaire avec une adresse IP fixe blanche. Routeur, suivi du stockage réseau. Un serveur VPN a été créé sur ce routeur domestique. Le routeur de pays est configuré pour élever le tunnel VPN PPTP vers le routeur domestique.
Le contrôleur sur Arduino est connecté au port LAN du routeur national et se trouve derrière NAT, le 80e port lui est transmis. Ainsi, je ne peux accéder à Arduino qu'à partir de mon VPN. En conséquence, le LAN domestique et le VPN que j'ai sont deux segments du même sous-réseau, l'accès y est direct. Sur son ordinateur de bureau et sur un smartphone, il a mis en place une connexion VPN et a également accédé à Arduino. Pas très pratique à utiliser, mais ça marche. Oui, et une sécurité relative est fournie - sans autorisation dans mon VPN, personne d'autre ne peut accéder à la page de gestion du contrôleur.
Le goulot d'étranglement est le tunnel VPN vers le routeur du pays. Chute périodiquement. De plus, c'est la connexion PPTP qui est en train d'être détruite, l'accès à Internet reste. Et le plus méchant, c'est que lorsque la connexion PPTP est rompue, elle ne monte plus d'elle-même. Même le redémarrage du routeur ne sauvegarde pas. Seul un redémarrage complet de son alimentation avec un modem USB, puis pas immédiatement. Vous devez l'éteindre, attendre 10 minutes, le rallumer. Heureusement - bien, non - la prochaine itération. La raison, selon le support technique de Zyxel, est que l'opérateur cellulaire bloque les paquets PPTP, car un côté envoie correctement, l'autre écoute correctement, mais les données n'atteignent pas (j'ai des routeurs Zyxel aux deux extrémités du tunnel VPN). Yota semble être à blâmer, mais réaliser quelque chose d'intelligible d'eux est impossible. Ou peut-être pas Yota.
Chien de gardePour assurer un fonctionnement relativement fluide du VPN, j'utilise un chien de garde du programme de
béquille - le routeur du pays est alimenté par un relais de puissance contrôlé par Arduina, et dès que le serveur VPN cesse de cingler (également ping Arduina), puis après 10 minutes, l'alimentation est coupée du routeur pendant 10 minutes, puis le routeur à nouveau Il s'allume et devrait établir une connexion PPTP dans les 5 minutes. S'il n'y a pas de connexion, l'itération suivante. Parfois, ce composé fonctionne de manière stable pendant des semaines, voire des mois, et parfois il commence à se briser presque quotidiennement. Aucun autre moyen de résoudre le problème n'a encore été identifié. Comme je l'ai déjà dit, Yota ne prend pas en charge IPv6, il ne donne pas et ne vend pas d'IP blanche aux physiciens, il n'y a pas d'autre fournisseur avec des tarifs normaux et, bien sûr, un trafic illimité. Cependant, cette décision, bien qu'une béquille, mais remplit très bien sa tâche. Maintenant, j'ai toujours une connexion, à quelques exceptions près, quand j'arrive au moment du redémarrage.
En plus du logiciel, j'ai également implémenté un chien de garde matériel. Juste au cas où. Le contrôleur devrait fonctionner pendant des semaines et parfois même des mois en mon absence, et ne pas se bloquer. Je ne savais pas comment toute cette économie se comporterait en gros inconvénients, donc j'étais en sécurité. Le chien de garde intégré à Atmega ne fonctionnait pas pour moi parce que je ne travaillais pas du tout chez Arduino Mega «out of the box», et pour le faire fonctionner, je devais m'amuser beaucoup. Ce problème est bien décrit
ici . De plus, il dispose d'un intervalle maximum de 8 secondes, ce qui m'a semblé insuffisant. Par conséquent, j'ai appliqué une puce de surveillance spécialisée TPL5000DGST, dont l'intervalle est défini par une combinaison de trois broches et peut atteindre 64 secondes, ce qui me convient parfaitement. Pour cette puce, j'ai acheté une petite planche à pain, je l'ai soudée et fixée sur le connecteur avec les ports IO d'Arduina (la photo sera plus basse dans la section d'assemblage). Les tests ont montré le fonctionnement fiable de ce chien de garde et je me demandais à quelle fréquence il fonctionnerait en réalité. Pour ce faire, j'ai ajouté une variable au code de programme où l'heure et la date de lancement du programme sont stockées et ces informations sont affichées sur la page Web de contrôle. La pratique a montré que, contrairement à un VPN, le contrôleur fonctionne bien pendant longtemps et le chronomètre de surveillance n'a jamais été utile (lors de la rédaction de l'article, il a fonctionné pour la première fois, ce n'était pas en vain). Le temps de fonctionnement continu a atteint plus de 3 mois et aurait pu être plus long si je n'avais pas besoin de corriger de temps en temps quelque chose dans le code et de reflasher le contrôleur.
Le capteur des paramètres du réseau d'alimentation - le compteur électrique Neva
Comme je l'ai mentionné ci-dessus, à mon avis, rien de mieux et de plus précis qu'un compteur électrique numérique moderne avec une interface d'accès aux données externe ne peut être trouvé comme capteur de paramètres d'alimentation. J'ai choisi le comptoir Neva de la société de Saint-Pétersbourg Taypit avec l'interface RS-485.
Je souligne qu'un compteur électrique avec des fils de la 485e interface connectés en permanence à celui-ci n'est pas officiellement autorisé à être utilisé comme compteur (
mise Ă jour : dans les
commentaires, ils ont suggéré qu'il était autorisé). Par conséquent, dans le réseau électrique du chalet, j'ai mis deux compteurs en série. Le premier est un compteur d'électricité officiel, scellé et enregistré, situé dans le panneau d'entrée de la rue. Le deuxième est mon capteur d'alimentation, non scellé et non comptabilisé, dont la société de vente d'énergie ne se soucie pas, car elle ne se soucie pas de tout ce qui est installé après le dispositif de mesure. Ce compteur électrique est déjà situé dans le panneau à l'intérieur du vestiaire, et dans le même panneau, il y a aussi un contrôleur sur Arduino, mais plus à ce sujet plus tard.
Au chalet, j'ai un réseau d'alimentation triphasé. En ville, je ne peux déboguer que sur une seule phase. J'ai donc acquis deux mètres, un Neva MT-324 triphasé et un Neva MT-124 monophasé. Le débogage initial du contrôleur a été effectué sur la table sur un compteur triphasé avec une seule phase connectée, puis installé régulièrement dans le bouclier de la datcha en mode de fonctionnement de combat. Le débogage des modifications logicielles ultérieures a déjà été effectué sur un compteur monophasé moins cher sur la table:

Pour connecter le compteur Ă Arduino, un convertisseur de niveau RS-485 en TTL est requis:

De plus, pour travailler avec le compteur, vous avez besoin d'un port série gratuit sur Arduino. Malheureusement, Arduino Uno n'a qu'un seul port série, si vous le preniez sous le compteur, vous auriez à perdre la sortie de débogage des informations textuelles (moniteur de port), et sans cela, il serait impossible d'écrire un croquis. Par conséquent, j'utilise Arduino Mega, qui possède plusieurs ports série. Il serait possible d'implémenter le deuxième port série softovo via les ports numériques d'Arduino, mais je n'ai pas trouvé de bibliothèque appropriée avec la possibilité de modifier d'autres paramètres de port, à l'exception de la vitesse. Et les paramètres du port de compteur sont différents de ceux par défaut: débit 9600 bits, 7 bits de données, 1 bit d'arrêt, contrôle de parité - même. L'objet série standard dans Arduino, heureusement, vous permet de faire ces réglages.
Il était relativement facile d'obtenir le protocole d'échange avec le compteur - le fabricant du compteur
dans le domaine public a un programme pour lire les paramètres sous Windows, qui a également un moniteur de port. Pour connecter le lecteur à un ordinateur, j'ai utilisé le convertisseur d'interface MOXA 232/432 / 485USB. Un peu de temps pour l'analyse visuelle des packages - et j'ai distingué les commandes principales.
Cependant, cela ne me semblait pas suffisant et j'ai contacté le fabricant par e-mail. Après un mois de correspondance avec Typit, j'ai finalement réussi à obtenir une liste complète des commandes avec interprétation:
Codage des paramètres MT3XX E4SCodage des paramètres NEVA MT124 AS OP (E4P)mise à jour 10.28.2019 : Explications des commandes. Les commandes du tableau sont représentées sous forme de caractères de texte. Autrement dit, où il en coûte 0 (zéro), vous devez envoyer 0x30. Les points et les astérisques sont des séparateurs pour la beauté, ils ne veulent rien dire et vous n'avez pas besoin de les envoyer. À la fin de la commande, un octet de somme de contrôle est ajouté, qui est calculé en tenant compte du préfixe et du postfixe de la commande, qui ne sont pas indiqués dans le tableau. Le préfixe de toutes les commandes de lecture est 0x01 0x52 0x31 0x02. Ce suffixe est 0x28 0x29 0x03. Cependant, l'envoi d'un préfixe n'est pas nécessaire, et un suffixe semble être obligatoire. Exemple: commande de lecture de date 09.09.02 * FF. En fait, vous devez passer les codes de caractères de texte 000902FF. C'est-à -dire, 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46. Ajoutez le préfixe et le suffixe, nous obtenons l'ensemble 0x01 0x52 0x31 0x02 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03. Nous lisons la somme de contrôle comme xor de tous les octets moins 1 et ajoutons l'octet reçu à la fin. Le préfixe est supprimé comme facultatif. En conséquence, nous envoyons cela au compteur - 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03 0x68. Le début du cycle d'échange doit être précédé des commandes d'initialisation de l'échange, dans l'esquisse ci-dessous, ces commandes sont marquées comme // Début 1, 2, 3. Une fois l'échange initialisé, vous pouvez lire les données du compteur dans le cycle pendant une durée arbitraire, mais après avoir perdu la communication et peut-être après un manque prolongé d'échange pour d'autres raisons, une réinitialisation est nécessaire.
De plus, la question technique est d'écrire un cycle d'interrogation des paramètres sous Arduino et de les afficher pour les démarreurs dans le moniteur de port. Le temps d'un cycle s'est avéré être d'environ une seconde. Cependant, dans la version finale du projet avec l'enregistrement des données sur un lecteur flash et des capteurs de température d'interrogation, ce temps est passé à 4 secondes. Cela ne me convenait pas du tout et devait plonger dans l'optimisation. En conséquence, j'ai à nouveau atteint un deuxième intervalle sans perdre de fonctionnalité. Soit dit en passant, j'ai réécrit le croquis à partir de zéro deux ou trois fois jusqu'à ce que je trouve la bonne architecture et les algorithmes économiques.
Implémentation logicielle d'échange avec un compteurLe code est extrait du contexte de mon grand croquis de travail. Compilé, mais sous cette forme, je ne l'ai jamais exécuté. Je ne le donne qu'à titre d'exemple et non à titre de programme de travail terminé. Bien qu'en théorie, tout devrait fonctionner sous cette forme.
Le code est écrit pour deux types de compteurs simultanément, le MT-124 monophasé et le MT-324 triphasé. Le type de compteur est sélectionné automatiquement dans le programme par le mot de réponse de la commande d'initialisation.
Je cite le code tel quel, sans joliesse et sans commentaires supplémentaires à l'exception de ceux que j'ai écrits moi-même. Et oui, je ne suis pas programmeur, et je n’étudie même pas pour cela, donc vous ne devriez pas me botter pour la qualité du code, mais vous pouvez apprendre à coder:
EnergyMeterNeva.inoUn énorme avantage supplémentaire du compteur d'électricité est une horloge en temps réel fiable et précise. Je n'ai pas eu à fournir au système un module supplémentaire, qui doit toujours être trouvé non seulement de toute façon, mais de haute qualité. L'heure actuelle précise à la seconde près que j'obtiens du compteur, entre autres données. Oui, en ce qui concerne le temps atomique, le temps du compteur est légèrement décalé (quelques secondes), je ne sais pas à quoi il est connecté, un réglage d'usine de mauvaise qualité ou autre chose, mais la précision est excellente, juste avec un léger biais.
Dans de rares moments, lorsque l'alimentation au chalet est coupée et que le compteur devient indisponible, je reçois l'heure actuelle du minuteur interne d'Arduina. Lorsque le compteur électrique fonctionne et que ses données sont disponibles, je réécris la minuterie interne d'Arduina avec la valeur du compteur sur chaque boucle de boucle. Lorsque le compteur tombe - l'heure actuelle continue de cocher la minuterie Arduina.
En plus de la lecture des paramètres, le compteur peut bien entendu être programmé. Autrement dit, l'interface fonctionne à la fois pour la lecture et l'écriture. Cependant, avec de telles difficultés, j'essayais d'obtenir un protocole de lecture des commandes que je n'ai même pas fait allusion au fabricant sur la demande d'un protocole d'enregistrement. Premièrement, je n'en avais pas besoin, sauf peut-être juste un peu de temps pour le déplacer. Deuxièmement, je soupçonne que ces données ne sont plus publiques, car elles peuvent être utilisées à des fins frauduleuses.
Capteurs de tempĂ©ratureJ'ai dĂ©jĂ
effectué un test de capteurs de température avec un exemple de croquis séparément plus tôt. Maintenant, il ne restait plus qu'à intégrer leur enquête dans le projet principal. Ce n'était pas difficile. Les neuf capteurs que j'ai utilisés ont fonctionné sans problème lorsque j'ai allumé 1-Wire en parallèle. La plage de lectures entre eux était d'environ 0,5 degrés, ce qui montre l'inutilité de les utiliser avec une précision maximale de 0,0625 degrés. J'ai rassemblé les capteurs pour le test dans un pack et l'ai enveloppé dans plusieurs couches de polyéthylène adhésif. Pour une plus grande précision, j'ai placé le pack verticalement et attendu un jour pour égaliser complètement la température. Les lectures de tous les capteurs ne se sont pas révélées être les mêmes.
. , , , delay(750). — , ( 750 ), . , — , . LOOP , . — LOOP 1-1.5 , .
«85» «0». , , . — . , . , ( ) .
-, - :
DS18x20_Temperature.ino:
TempSensors_DS18B20.ino1-Wire 4.7 . SMD-, 5.1 , ( ). .
(+5, gnd data), 9 , . . . — . — , . , , . , . :

, , .
, — , , . , (. - ). - , - .
, .. ( ) … ? , . . , .
La longueur totale de la paire torsadée dans les cabines était d'environ 25 mètres. Pièces pour capteurs externes - 5 et 10 mètres, et une pièce interne de dix mètres avec des branches pour sept capteurs. Tout fonctionne presque parfaitement. Seuls des tirets se croisent occasionnellement au lieu des valeurs de température. Cela signifie que les données d'un capteur particulier n'ont pas été lues correctement. Mais cela arrive si rarement (je le remarque peut-être une fois par mois) que cela ne pose aucun problème.Lebouclier Ethernet d' accès à distance a été acheté pour l'accès à distance à Arduino. Avec une bibliothèque intégrée, travailler avec elle, comme tout le reste dans Arduino, s'est avéré assez simple.. -, () - . , .
, — , — .
- , , html :

html- , . JSON.
. . , . html-, , java- - , . , , . . .
Je cite les fragments de code de mon implémentation de ce mécanisme.Dans la page html, nous intégrons le formulaire:<script type="text/javascript" src="http://domain/send_HTM.js"></script></pre> <pre style="font-size: 14px;"><form> <br><br> CONTROL.HTM:<br> <textarea cols="100" rows="20" wrap="off" id="htm"></textarea><br> <input type="button" value="" onclick="send_HTM();"><br> <div id="progress" style="display:none"> <div id="label"> :</div> <div style="width:800px;border:1px solid #000"> <div id="bar" style="background:#00f;height:10px;width:0px"></div> </div> </div> </form>
Le bouton "Envoyer" lance le script
Java suivant:
send_HTM.jsDans l'esquisse de la fonction de traitement des demandes de serveur Web par préfixes dans la demande 'CONTROL.HTM' (début d'envoi du fichier), 'htmlineN' (envoi du numéro de ligne) et 'END_CONTROL.HTM' (fin d'envoi du fichier), nous déterminons les actions suivantes:
File acceptHtmFile; ................ if (fl_accept_htm) // 'CONTROL.HTM' { SD.remove(CTRL_HTM); acceptHtmFile = SD.open(CTRL_HTM, FILE_WRITE); // if (!acceptHtmFile) // - { #ifdef DEBUG_SD Serial.println("SD-card not found"); #endif client.print("FAIL"); client.stop(); } else client.print("OK_OPEN_FILE"); acceptHtmMode = true; break; } if (fl_htmline) // 'htmlineN' { int b = acceptHtmFile.println(tag); if (b == 0) { client.print("FAIL"); acceptHtmMode = false; cntHtmModeIteration = 0; } else { client.print("OK"); } cntHtmModeIteration = 0; break; } if (fl_endhtm) // 'END_CONTROL.HTM' { SD.remove(CONTROL_HTM); acceptHtmFile.close(); File htmlFile = SD.open(CONTROL_HTM, FILE_WRITE); // acceptHtmFile = SD.open(CTRL_HTM); // for (int i = 0; i < acceptHtmFile.size(); i++) { digitalWrite(PIN_WATCHDOG_DONE, 1); htmlFile.write(acceptHtmFile.read()); digitalWrite(PIN_WATCHDOG_DONE, 0); } acceptHtmFile.close(); htmlFile.close(); client.print("OK_CLOSE_FILE"); acceptHtmMode = false; cntHtmModeIteration = 0; break; }
Les définitions CONTROL_HTM et CTRL_HTM sont les noms des fichiers html. Le premier est le fichier principal, le second est le fichier tampon. Dans le tableau de balises char se trouve le texte de la chaîne reçue, sélectionné dans la demande. La logique est la suivante: lors de la réception des données, elles sont écrites dans le fichier spoule, en fin de réception, le fichier spoule est écrasé dans le fichier principal. Je n'arrivais toujours pas à comprendre comment renommer simplement les fichiers, la bibliothèque standard SD n'a pas une telle fonction, donc une stupide copie caractère par caractère, ce qui prend beaucoup de temps.
Il serait pratique de stocker le code de la page Web de contrôle non pas sur la carte mémoire du contrôleur, mais sur la machine cliente, ou de le télécharger à partir d'une ressource externe. Mais l'interdiction des demandes interdomaines ne le permet pas. Les javascripts ne peuvent envoyer leurs demandes qu'au nord d'où ils ont été chargés. Dans ce cas, les corps des javascripts peuvent être chargés de n'importe où, il est seulement important d'où la page avec leur appel a été chargée.
Enregistrement des donnéesLe blindage Ethernet a un emplacement pour carte micro-SD à bord. C'est à cause de sa présence que j'ai décidé d'écrire des données dans des fichiers journaux. Pour travailler avec une carte mémoire, il y a aussi une bibliothèque intégrée, et pour gérer l'écriture-lecture des fichiers avec elle est généralement élémentaire.
Pour enregistrer la quantité de données, j'ai construit l'algorithme de journalisation afin que l'enregistrement ne se produise que lorsque les données changent de plus d'un seuil prédéterminé. Pour la température, il est de 0,1 °, pour la tension, il est de 0,2 V. Les données d'une journée sont écrites dans un seul fichier. À zéro heure, un nouveau fichier est créé. J'ai choisi le format de texte brut, avec des délimiteurs, afin que vous puissiez contrôler rapidement le contenu des fichiers pendant le débogage, et il y aurait une capacité simple à charger dans Excel.
Les restrictions de conception ne vous permettent pas d'insérer / retirer facilement une carte mémoire, j'ai donc utilisé une grande carte. Selon mes calculs, il sera rempli pendant plusieurs années, après quoi il faudra démonter le boîtier, retirer la carte mémoire et la nettoyer.
Je ne vois pas l'intérêt d'enregistrer le code, tout y est complètement trivial - un enregistrement banal de texte dans un fichier. Et ce code est réparti sur toute l'esquisse (non seulement les paramètres des capteurs sont enregistrés, mais aussi une variété d'événements ponctuels), il est difficile à isoler.
GraphiquesEn tant que moteur de cartographie, j'utilise la bibliothèque de visualisation javascript
amavart très flexible. La bibliothèque est gratuite et disponible pour téléchargement et utilisation hors ligne. J'ai également localisé cette bibliothèque sur mon NAS avec un accès Internet permanent. Le connecter et l'utiliser avec les paramètres par défaut n'est pas difficile, cependant, afin d'obtenir la vue dont j'avais besoin, j'ai dû beaucoup bricoler. Un grand nombre d'exemples sur le site et la disponibilité d'une documentation détaillée ont aidé.
Pour un exemple je donnerai le javascript de dessin des plannings. En soi, il est inutile, car il ne fonctionne qu'avec un serveur Web et une page html et peut être lié à d'autres scripts (c'était il y a longtemps, je ne me souviens pas de tous les détails). Mais les paramètres d'apparence de mes graphiques y sont contenus et vous pouvez les obtenir à partir de là :
get_log.jsLe gros avantage de la bibliothèque amchart est qu'elle peut dessiner les bons graphiques à partir de données déchirées. Comme je l'ai mentionné ci-dessus, dans le journal, je sauvegarde les données uniquement lorsqu'elles changent. Autrement dit, cela se produit de manière asynchrone et aléatoire. Il peut ne pas y avoir de nouvelles données pendant plusieurs minutes, puis en quelques secondes, elles changeront plusieurs fois. Par conséquent, les entrées du journal s'accompagnent d'intervalles de temps arbitraires. Amchart prend cela en compte lors du rendu, je n'ai pas à interpoler les données avant le rendu. J'envoie simplement le tableau de données tel quel et je vois un beau graphique uniforme dans le temps.
Je n'ai découvert qu'un seul inconvénient de cette bibliothèque - elle ne sait pas comment (enfin, ou je ne comprends toujours pas comment) mettre à jour humainement des graphiques en temps réel. Vous pouvez ajouter de nouvelles données à celles existantes, mais le redessin est effectué à chaque fois complètement de l'ensemble du tableau de données, ce qui ralentit considérablement le navigateur. Cependant, l'idéologie même de la lecture des données d'Arduina pour le rendu à la demande du navigateur est viciée par sa non-optimalité, il était donc inutile de se battre pour une mise à jour rapide en temps réel.
La bonne solution serait d'organiser un serveur distinct pour le stockage et la visualisation des données, d'où Arduina en temps réel les données tomberaient un peu et seraient stockées dans la base de données, et d'où elles pourraient être rapidement envoyées à l'utilisateur dans un navigateur pour visualisation.
Maintenant, les graphiques ressemblent à ceci (sur l'exemple du jour où il n'y a personne dans le vestiaire et, par conséquent, il n'y a pas de consommation d'énergie). Lorsque les données actuelles se produisent, l'échelle est automatiquement définie pour que tout soit bien ajusté et les valeurs des niveaux actuels apparaissent sur l'axe vertical:

Les graphiques sont affichés sur la même page où le contrôle a lieu, directement sous le bloc de contrôle principal.
Je ne fournis pas intentionnellement un ensemble complet de sources de projet pour plusieurs raisons:
- Il ne peut pas être démarré car il se trouve sur un autre réseau que le mien, car je n'ai pas essayé de rendre le projet portable, et il est strictement lié à mes adresses et à la topologie de mon réseau.
- Je suis sûr que l'idéologie générale du projet souffre de nombreux problèmes, car c'est ma première tentative dans le domaine où je ne suis pas bon à comprendre. Par conséquent, je ne propose à personne le projet entier à répéter sous cette forme. Je n'ai partagé que les moments dans lesquels j'ai moins confiance.
- Le projet est fait depuis longtemps et depuis longtemps, et je ne me souviendrai jamais de tous les détails et je ne pourrai pas expliquer un certain nombre de solutions. Le volume du croquis est très important (selon mes normes, environ 2 000 lignes), il existe plus d'une douzaine de scripts Java différents, je n'ai pas fait de diagramme schématique du fer. Autrement dit, je ne peux pas aider les conseils sur la plupart des questions.
AssemblageDès le début, je me suis fixé l'objectif - créer un appareil fini, et pas seulement une mise en page avec un tas de publications sur la table:

Et j'ai immédiatement décidé que je voulais placer l'appareil à l'intérieur du panneau électrique. Il y a de la nourriture et un comptoir, et en général, c'est pratique.
Pour cela, un étui dinrek était nécessaire. Au début, j'ai pensé à le développer et à l'imprimer sur une imprimante 3D. Mais je n'ai pas ma propre imprimante 3D, et ce que mes collègues travaillant sur leurs imprimantes auto-assemblées impriment ne me convient pas du tout dans la qualité de leur apparence. J'ai trouvé
des étuis prêts à l'emploi sur un rail DIN (de différentes tailles) à vendre, ils ont l'air bien, ils sont pratiques à utiliser (pliables), et il y a aussi une
carte aveugle prĂŞte Ă l'
emploi pour eux.
J'ai acheté le plus grand boîtier, afin que non seulement Arduino avec le bouclier Internet puisse y rentrer, mais aussi un relais pour commuter la charge:




Vint ensuite un long et fascinant processus d'installation de toutes les tripes dans le boîtier. Dans le cadre de cette activité, j'ai même acquis un merveilleux fer à souder avec fonction sommeil (les fers à souder que j'avais étaient encore de l'époque soviétique):

Pour l'installation, j'ai acheté un tas de toutes sortes de supports, vis, rondelles et écrous. Premier montage:


Pour connecter les fils aux contacts supérieurs, il a fallu utiliser des broches tordues, sinon il ne rentre pas dans le boîtier:

Les rondelles isolantes ont dû être coupées par endroits:

Et par endroits, il se pliera plus perversement, soulèvera la vis du manchon et coupera minutieusement le manchon:


Pour un seul relocalisation, il n'y avait pas assez de points de pivot, donc il ne tenait qu'Ă deux points:

Assemblage assemblé avec borniers:

Ensuite, l'engin a commencé à se transformer progressivement en fils. La carte a été utilisée uniquement pour le câblage d'alimentation et pour la connexion aux borniers. Pour les connexions de signaux, j'ai utilisé le fil MS-16 (je l'aime plus), pour l'alimentation, il n'a pas traversé la tension (jusqu'à 100 V), donc MGTF:

J'ai monté des LED sur le panneau avant, soudé les résistances de limitation de courant directement aux jambes des LED et les ai fermées avec un rétrécissement thermique:

En conséquence, nous avons obtenu un tel remplissage barbu:

Et voici une écharpe avec un microcircuit de chien de garde, à l'abri dans les entrailles de ma création, juste au-dessus du convertisseur de niveau RS-485-TTL:


Toute la structure est pliable, tout peut être retiré, déconnecté et remplacé sans soudure, à l'exception d'une écharpe à œil de chien, elle est soudée aux broches du connecteur, habillée d'un certain nombre de ports IO d'Arduina.
Dans la boite:

J'ai coupé des ouvertures pour les connecteurs Arduina dans la paroi en plastique du boîtier. J'ai d'abord fait les trous exactement en fonction de la taille des connecteurs, mais l'assemblage dans le boîtier doit être démarré en diagonale (sinon cela ne fonctionne tout simplement pas) et les connecteurs ne sont pas passés, j'ai dû dilapider un peu:

En allumant le produit fini sur la table, tout a fonctionné immédiatement:


Sur le panneau avant apporté:
- Quatre LED rouges - indication de charge;
- Deux verts - communication avec le compteur et avec le serveur VPN;
- Deux jaunes sont de rechange;
- Un jaune - indication d'un redémarrage du routeur;
- Un rouge est la nutrition;
- Et un bouton de réinitialisation.
Pour obtenir 5 volts sur 220, j'ai utilisé une alimentation dinerey avec réglage du niveau de sortie, l'alimentation a été fournie directement au microcontrôleur, en contournant le convertisseur d'entrée de 7-12 à 5 volts. C'était pratique pour plusieurs raisons. Tout d'abord, la puissance du convertisseur intégré à un moment donné n'était pas suffisante, le courant y est limité. Deuxièmement, il fallait encore alimenter le relais en 5 volts. Troisièmement, le tableau de bord est un facteur de forme dinrek pratique en termes d'installation. Par conséquent, ici:
Test
Tout était tourné sur la table, tout fonctionnait comme il se doit, il était temps d'installer le contrôleur dans le bouclier et de le vérifier en mode combat.
Mais d'abord, j'ai tout connecté «sur la morve», poussant littéralement tous les tripes dans un autre bouclier, à faible courant pour tester les capteurs de température en conditions réelles sur de longues lignes posées dans un canal de câble avec des câbles d'alimentation ~ 220V:

Comme vous pouvez le voir sur la photo ci-dessus, jusqu'à présent, j'ai essayé de contrôler le redémarrage du routeur par l'alimentation à l'aide de la prise Senseit «intelligente». Cependant, cet appareil avec un coût fou de 5 mille (pour 2016) s'est avéré extrêmement buggy et de mauvaise humeur. Au cours de l'année d'utilisation, cela m'a forcé à plusieurs reprises à arriver de façon imprévue au chalet à des moments inopportuns, afin de supprimer manuellement ce miracle de l'ingénierie et de la pensée marketing d'un profond inconvénient en termes de communications GSM. Avec la transition vers mon contrôleur Arduino, qui s'est avéré plus fiable qu'un exemple, j'ai été soulagé de jeter cette jonque «professionnelle» dans une belle boîte dans une boîte et de l'oublier.

Le test a été réussi, il n'y a eu aucun échec et il a été possible de procéder à l'installation finale dans un endroit régulier:

Oui, c'est le bouclier ABB TwinLine 800x300x225 IP55, d'une valeur de 25 mille roubles. sans remplissage (et remplissage pour un autre 15 mille environ). Et oui, il est installé dans un vestiaire 6x2. Chacun a ses propres cafards. Oui, j'ai
récupéré moi-même toutes les pièces électriques . Et il a aussi construit un vestiaire, oui. Non, je ne suis pas électricien. Et pas un constructeur.

Dans les profondeurs du bouclier, j'ai localisé une petite alimentation sans coupure
Powercom WOW 300 , là sa LED verte s'allume, et à gauche et au dessus - sa prise d'alimentation d'entrée:

Il dure environ 40 minutes d'autonomie de la batterie de l'appareil Arduino, d'un routeur avec un modem USB et une connexion Wi-Fi et des caméras de surveillance IP Full HD.
Et ici, vous pouvez voir les fiches d'alimentation blanches de deux consommateurs ininterrompus - le bloc d'alimentation Arduino et le blindage à faible courant, où se trouvent le routeur et le bloc d'alimentation pour la caméra de surveillance extérieure. Cette ligne va avec une coupure dans le contacteur, qui est contrôlé par Arduino, juste pour le même chien de garde logiciel qui redémarre le routeur sous tension en cas de chute d'un VPN (la caméra redémarre en même temps, bien qu'elle n'en ait pas besoin). Les lignes supérieures des paires torsadées des capteurs de température sont connectées au contrôleur:

Je dois dire que je ne ferais jamais confiance au passage d'une charge puissante à de petits relais bleus chinois, malgré les paramètres de ces relais, qui semblent permettre de le faire. Par conséquent, l'utilisation de contacteurs modulaires normaux
Legrand n ° 4 125 01 avec possibilité de commande manuelle a été immédiatement prévue. C'est-à -dire que les relais à l'intérieur du corps du contrôleur contrôlent les contacteurs, et les contacteurs contrôlent déjà la charge. C'est fiable. Mais l'alimentation du routeur et de la caméra ne s'effectue qu'à travers ce petit relais chinois bleu, le courant y est faible, donc c'est possible.
Au premier lancement de combat, j'ai été très déçu. Sur la table, j'ai tout vécu sauf la charge. Pourquoi? Les contacteurs cliquent et il est donc clair qu'ils vont commuter la charge. Mais non, il fallait faire l'expérience. Des électroconvecteurs puissants ont introduit des interférences dans le système au moment de l'ouverture des contacts, ce qui a conduit à un gel garanti du bouclier Internet. Et pour le sortir de la panne n'était possible qu'en coupant le courant, une simple réinitialisation n'a pas aidé. Googlé - oui, ce chinois a un tel problème. Et la bibliothèque ne gère pas cette situation. Autrement dit, le morceau de fer est mauvais, et le logiciel n'est pas très bon.
Je pensais déjà que tout était parti. J'ai même commandé des relais à semi-conducteurs, mais ils, écume, sont plus grands en hauteur, et ils ne rentreraient pas dans ma conception. Mais alors j'ai pensé qu'il pourrait encore être possible de supprimer l'interférence. Googlé à nouveau, a trouvé des condensateurs anti-bruit spéciaux (les soi-disant condensateurs de type X). Il suffit de les connecter en parallèle à l'enroulement de commande des contacteurs, et voilà ! Les raccords ont complètement disparu. Au cours de la dernière année de fonctionnement, aucun cas n'a été enregistré:



Mais de cette façon, vous pouvez regarder à l'intérieur de la boîte:


Eh bien, la vue finale de la visière avec le plastron (aucun bouchon n'était fourni dans le kit):

Pour le débogage et le clignotement, le câble USB est connecté au contrôleur et stocké à l'intérieur du bouclier derrière une porte fermée (il ne sera temporairement pas connecté à cette photo):


Le système fonctionne depuis près d'un an, a survécu à des gelées jusqu'à 20 degrés sans aucun problème.
En général, je suis satisfait du résultat. Cependant, pour les tâches plus ou moins fonctionnelles, Arduino est clairement faible. Plus d'une fois, je suis tombé en panne de mémoire et j'ai dû couper et optimiser. Et la vitesse de travail, surtout avec une carte mémoire, ne me convient pas du tout. Par conséquent, les futures implémentations de ces métiers, le cas échéant, je voudrais baser sur quelque chose de plus puissant. Des collègues me donnent un Raspberry Pi, une bonne option, je pense.
Quelqu'un pourrait dire: «Combien de difficultés il y a pour une tâche aussi primitive», et il aura probablement raison. Pour moi, toute cette entreprise est un passe-temps, avec peu de justification pour le sens. Par conséquent, je cherchais du divertissement dans tout ce que je pouvais :)