
Nichts Außergewöhnliches, nur ein weiterer Arduino-Controller. Mit Sensoren, Rollen und einer Webseite. Aber mit seinen eigenen Eigenschaften und seiner sehr spezifischen praktischen Anwendung, wenn auch recht banal - die Ferneinbeziehung der elektrischen Heizung in das Land. Die Anführungszeichen in der Kopfzeile sind nicht zufällig, der Controller ist in der aktuellen Version kein Smart Home, dient aber als gute Basis dafür.
(Hinweis - Dieser Satz wurde am 12.04.18 aufgrund der Kommentare hinzugefügt.)Hauptmerkmale:
- Sensor für elektrische Netzwerkparameter - Stromzähler „Neva“ gemäß RS-485;
- Fernänderung der auf der SD-Karte liegenden Steuerungswebseite;
- Zuverlässige Aufnahme einer Gruppe von Dallas-Temperatursensoren in lange Leitungen;
- Diagramme von Parameteränderungen ohne Einbeziehung von Cloud-Diensten;
- Ausfallsichere Lösungen (externer Watchdog, USV, automatischer Neustart des Routers);
- Schutz des Internetschildes vor Einfrieren bei Störungen durch Leistungsrelais;
- Komplettes Design in einem DIN-Schienengehäuse.
Ich habe dieses System langsam gemacht, als Unterhaltung, von Zeit zu Zeit das Projekt monatelang geworfen ... Es dauerte ungefähr anderthalb Jahre von der Idee bis zur Implementierung :)
Da ich vorher nichts mit Mikrocontrollern zu tun hatte, begann ich mit dem Starter-Kit mit Aliexpress, spielte mit LEDs, Tasten und Sensoren, verstand etwas und begann, eine Steuerung für die Fernsteuerung und Überwachung zu bauen. Nun, das „Smart Home“ ist natürlich nicht direkt, aber so ähnlich.
Das praktische Ziel war zunächst eines: die Fernschaltung der Heizung im Land. Ich habe es noch nicht geschafft, ein Haus zu bauen (meine Hände haben es nicht erreicht), aber ich habe ein wunderbares, komfortables
Sommerhaus aus Hackfleisch, das von elektrischen Konvektoren erhitzt wird. Wärmen Sie ein Umkleidehaus auf, das sich während der Woche bis Freitagabend abgekühlt hat - eine sehr verlockende Gelegenheit in der kalten Jahreszeit.
Die Aufgabe der Fernsteuerung von Lasten erwies sich jedoch als recht trivial. Arduino plus das Internetschild, eine fertige Skizze aus dem Internet, und die Rollen klicken bereits auf die Häkchen auf der Webseite. Das praktische Ziel wurde irgendwie sehr schnell und einfach erreicht. Und es war langweilig. Ich wollte etwas interessanteres.
Ich habe mir ein zweites praktisches Ziel gesetzt - die Überwachung des Stromverbrauchs im Sommerhausnetz. Ich habe unprätentiöse Stromsensoren für Tests herumgespielt. Alles hat gut funktioniert, aber diese Option war nicht für Kampfarbeiten geeignet. Ich konnte keine leistungsstärkeren Sensoren als bei 5A finden, aber ich brauchte mindestens 25A.
Und ich hatte die Idee, einen Stromzähler als Leistungssensor zu verwenden. Und es war ein großartiger Gedanke! Und ich habe ein solches Gerät geschaffen und gesehen, dass es gut ist! Nicht ohne Schwierigkeiten, aber ich habe diese Aufgabe perfekt abgeschlossen, mit einem Gefühl tiefer Befriedigung, und ich werde es weiter unten erzählen :).
FunktionellDie erste (und bislang letzte) Kampfversion des "Smart Home" -Controllers verfügt über folgende Funktionen:
- Manuelle Fernsteuerung der Aktivierung des Leistungsrelais über einen Browser und Überwachung des aktuellen Status;
- Fernüberwachung der Parameter eines dreiphasigen Stromversorgungsnetzes (Spannung, Strom, Frequenz und viel mehr unnötiger Müll, den ich später abschaltete);
- Fernüberwachung der Messwerte eines Zwei-Tarif-Stromzählers;
- Fernüberwachung einer Gruppe von Temperatursensoren;
- Protokollieren von Daten und Aufzeichnen von Ereignissen auf einer Speicherkarte;
- Anzeige der Daten aller Sensoren für den ausgewählten Tag im Browser in Form von Grafiken.
IdeologieDas Prinzip des Aufbaus des gesamten Systems - ohne Cloud-Dienste von Drittanbietern sowie Datenerfassungs- und Anzeigeserver. Das ist weder gut noch schlecht. In der Anfangsphase des "intelligenten Bauens" ist ein solches Schema ausreichend und einfach. Obwohl es bestimmte Einschränkungen für die Verwendung auferlegt.
Arduino mit einem Internetschild ist der einzige Webserver im System. Die Webseite mit der Verwaltungsoberfläche wird auf der Internet-Speicherkarte gespeichert und an den Browser übertragen, wenn über die angegebene IP-Adresse auf sie zugegriffen wird. Die weitere Interaktion der Benutzeroberfläche mit Arduino erfolgt über Java-Skripte, deren Körper nicht in die Webseite eingebettet sind, sondern in meinem Home-Dateispeicher mit Internetzugang gespeichert sind. Dieser Ansatz reduziert das Gewicht der Webseite, wodurch das Lesen von der SD-Karte beschleunigt wird, und ermöglicht es Ihnen, den Skriptcode schneller und einfacher zu ändern.
Das Lesen des Datenprotokolls zum Anzeigen von Grafiken erfolgt auf Anfrage von der Speicherkarte (Drücken einer Taste in einem Browser). Daten werden nur in der aktuellen Sitzung der Browserseite angezeigt, sie werden nirgendwo gespeichert, und wenn Sie die Seite neu laden, müssen Sie sie erneut lesen. Dies ist ein Minus der Ideologie, da das Lesen von einer Speicherkarte ziemlich langsam ist und das Abrufen einer täglichen Datenmenge ein oder zwei Minuten dauern kann (es gab die Idee, das Datenspeicherformat zu überarbeiten, um seine Größe zu verringern und das Lesen zu beschleunigen).
Die aktuellen Werte der Sensoren werden auf der Seite angezeigt und in Echtzeit mit der Schleifenzyklusfrequenz aktualisiert, die ich habe und die ungefähr 1 Hz beträgt.
Der Algorithmus enthält derzeit keine „Schlauheit“. Ob ich den Algorithmus in Zukunft ermahnen werde - ich weiß nicht, für den Moment ist die aktuelle Version für mich völlig zufriedenstellend.
NetzwerktopologieIn der Hütte mobiles Internet Yota (USB-Modem + WLAN-Router). Es gibt keine feste IP-Adresse und es gibt auch keine Möglichkeit, sie zu erhalten, selbst für Geld. Und selbst wenn es keine dynamische weiße IP-Adresse gibt, ist DynDNS nicht anwendbar. Nur graue IP-Adresse des internen Yota-Netzwerks. IPota Yota unterstützt nicht (zumindest für 2017 ist dies der Fall). Daher habe ich nur einen Weg gefunden, um von außen zum Länderrouter zu gelangen - VPN.
Zu Hause (in der Stadt) kabelgebundenes Internet mit einer weißen festen IP-Adresse. Router, gefolgt von Netzwerkspeicher. Auf diesem Heimrouter wurde ein VPN-Server eingerichtet. Der Länderrouter ist so konfiguriert, dass der PPTP-VPN-Tunnel zum Heimrouter angehoben wird.
Der Controller auf Arduino ist mit dem LAN-Port des Country-Routers verbunden und befindet sich hinter NAT. Der 80. Port wird an diesen weitergeleitet. Daher kann ich nur über mein VPN auf Arduino zugreifen. Dementsprechend sind das Heim-LAN und das VPN, die ich habe, zwei Segmente desselben Subnetzes. Der Zugriff erfolgt direkt dort. Auf seinem Bürocomputer und auf einem Smartphone stellte er eine VPN-Verbindung her und erhielt Zugriff auf Arduino. Nicht sehr bequem zu bedienen, aber es funktioniert. Ja, und relative Sicherheit wird bereitgestellt - ohne Autorisierung in meinem VPN kann niemand anderes zur Controller-Verwaltungsseite gelangen.
Der Engpass ist der VPN-Tunnel zum Länderrouter. Fällt regelmäßig. Darüber hinaus wird die PPTP-Verbindung abgebrochen, der Internetzugang bleibt bestehen. Und das Schlimmste ist, dass die PPTP-Verbindung nicht mehr von selbst aufsteigt, wenn sie unterbrochen wird. Selbst ein Neustart des Routers wird nicht gespeichert. Nur ein vollständiger Neustart der Stromversorgung mit einem USB-Modem und dann nicht sofort. Sie müssen es ausschalten, 10 Minuten warten und wieder einschalten. Glück - gut, nein - die nächste Iteration. Laut dem technischen Support von Zyxel ist der Grund, dass der Mobilfunkbetreiber PPTP-Pakete blockiert, da eine Seite korrekt sendet, die andere korrekt zuhört, die Daten jedoch nicht erreichen (ich habe Zyxel-Router an beiden Enden des VPN-Tunnels). Yota scheint schuld zu sein, aber etwas zu erreichen, das von ihnen verständlich ist, ist unmöglich. Oder vielleicht auch nicht Yota.
WachhundUm einen relativ reibungslosen Betrieb des VPN zu gewährleisten, verwende ich einen
Krückenprogramm- Watchdog. Der Länderrouter wird über ein von Arduina gesteuertes Leistungsrelais mit Strom versorgt. Sobald der VPN-Server aufhört zu pingen (auch Arduina pingt), wird der Router nach 10 Minuten für 10 Minuten vom Stromnetz getrennt und dann wieder vom Router Es wird eingeschaltet und es wird erwartet, dass innerhalb von 5 Minuten eine PPTP-Verbindung hergestellt wird. Wenn keine Verbindung besteht, die nächste Iteration. Manchmal wirkt diese Verbindung wochen- und sogar monatelang stabil und manchmal beginnt sie fast täglich zu brechen. Es wurde noch kein anderer Weg gefunden, um das Problem zu lösen. Wie ich bereits sagte, unterstützt Yota IPv6 nicht, es gibt oder verkauft kein weißes IP an Physiker, es gibt keinen anderen Anbieter mit normalen Tarifen und sicherlich keinen unbegrenzten Datenverkehr. Diese Entscheidung ist zwar eine Krücke, erfüllt aber ihre Aufgabe sehr gut. Jetzt habe ich bis auf wenige Ausnahmen immer eine Verbindung, wenn ich zum Zeitpunkt des Neustarts komme.
Neben Software habe ich auch einen Hardware-Watchdog implementiert. Nur für den Fall. Der Controller sollte in Abwesenheit von mir wochen- und manchmal sogar monatelang arbeiten und nicht hängen bleiben. Wie sich diese ganze Wirtschaft in großen Minuspunkten verhalten wird, war mir nicht bekannt, also war ich in Sicherheit. Der in Atmega eingebaute Watchdog hat bei mir nicht funktioniert, weil ich bei Arduino Mega überhaupt nicht "out of the box" gearbeitet habe, und um ihn zum Laufen zu bringen, musste ich viel Spaß haben. Dieses Problem wird hier gut beschrieben. Außerdem hat er ein maximales Intervall von 8 Sekunden, was mir unzureichend erschien. Daher habe ich einen speziellen Watchdog-Timer-Chip TPL5000DGST verwendet, dessen Intervall durch eine Kombination von drei Pins festgelegt wird und 64 Sekunden erreichen kann, was perfekt zu mir passt. Für diesen Chip habe ich ein kleines Steckbrett gekauft, es verlötet und am Anschluss mit den E / A-Anschlüssen von Arduina befestigt (das Foto ist im Montageabschnitt unten zu sehen). Tests haben den zuverlässigen Betrieb dieses Watchdogs gezeigt, und ich habe mich gefragt, wie oft er in der Realität funktionieren wird. Zu diesem Zweck habe ich dem Programmcode eine Variable hinzugefügt, in der Uhrzeit und Datum des Programmstarts gespeichert sind. Diese Informationen werden auf der Steuerungswebseite angezeigt. Die Praxis hat gezeigt, dass der Controller im Gegensatz zu einem VPN lange Zeit reibungslos funktioniert und der Watchdog-Timer nie nützlich war (beim Schreiben des Artikels hat er zum ersten Mal funktioniert, er war nicht umsonst). Die Dauer des Dauerbetriebs betrug mehr als 3 Monate und hätte länger dauern können, wenn ich nicht von Zeit zu Zeit etwas im Code korrigieren und den Controller neu starten musste.
Der Parametersensor des Stromversorgungsnetzes - der Newva-Stromzähler
Wie oben erwähnt, kann meiner Meinung nach nichts Besseres und Genaueres als ein moderner digitaler Stromzähler mit einer externen Datenzugriffsschnittstelle als Sensor für Stromversorgungsparameter gefunden werden. Ich entschied mich für den Newa-Schalter der St. Petersburger Firma Taypit mit der RS-485-Schnittstelle.
Ich betone, dass ein Stromzähler mit fest angeschlossenen Kabeln der 485. Schnittstelle offiziell nicht als Zähler verwendet werden darf (
Update : In den
Kommentaren wurde vorgeschlagen, dass dies zulässig ist). Deshalb habe ich im Stromnetz der Hütte zwei Zähler in Reihe geschaltet. Der erste ist ein offizieller Stromzähler, versiegelt und registriert, der sich im Straßeneingang befindet. Der zweite ist mein nicht versiegelter und nicht erfasster Stromversorgungssensor, den die Energievertriebsgesellschaft nicht interessiert, weil sie sich nicht um alles kümmert, was nach dem Messgerät installiert wird. Dieser Stromzähler befindet sich bereits in der Schalttafel im Umkleidekabine, und in derselben Schalttafel befindet sich auch ein Controller auf Arduino, aber dazu später mehr.
In der Hütte habe ich ein dreiphasiges Stromversorgungsnetz. In der Stadt kann ich nur einphasig debuggen. Deshalb habe ich zwei Meter erworben, einen dreiphasigen Neva MT-324 und einen einphasigen Neva MT-124. Das anfängliche Debuggen des Controllers wurde auf dem Tisch auf einem Dreiphasenzähler mit einer einphasigen Verbindung durchgeführt und dann im Kampfbetriebsmodus regelmäßig im Datscha-Schild installiert. Das Debuggen nachfolgender Softwaremodifikationen wurde bereits an einem günstigeren einphasigen Zähler auf dem Tisch durchgeführt:

Um das Messgerät an Arduino anzuschließen, ist ein RS-485-TTL-Pegelwandler erforderlich:

Um mit dem Zähler arbeiten zu können, benötigen Sie eine kostenlose serielle Schnittstelle auf Arduino. Leider hat Arduino Uno nur eine serielle Schnittstelle. Wenn Sie diese unter den Ladentisch nehmen würden, müssten Sie die Debug-Ausgabe von Textinformationen (Port-Monitor) verlieren, und ohne diese wäre es unmöglich, eine Skizze zu schreiben. Daher verwende ich Arduino Mega, das mehrere serielle Schnittstellen hat. Es wäre möglich, die zweite serielle Schnittstelle softovo über die digitalen Anschlüsse von Arduino zu implementieren, aber ich habe keine geeignete Bibliothek gefunden, mit der andere Anschlusseinstellungen außer der Geschwindigkeit geändert werden können. Die Einstellungen des Zählerports unterscheiden sich von den Standardeinstellungen: 9600 Bitrate, 7 Datenbits, 1 Stoppbit, Paritätskontrolle - gerade. Glücklicherweise können Sie diese Einstellungen mit dem seriellen Standardobjekt in Arduino vornehmen.
Es war relativ einfach, das Austauschprotokoll mit dem Zähler abzurufen - der
öffentlich zugängliche Zählerhersteller verfügt über ein Programm zum Lesen von Parametern unter Windows, das auch über einen Portmonitor verfügt. Um das Messgerät an einen Computer anzuschließen, habe ich den Schnittstellenkonverter MOXA 232/432 / 485USB verwendet. Einige Zeit für die visuelle Analyse der Pakete - und ich habe die Hauptbefehle herausgegriffen.
Dies schien mir jedoch nicht genug zu sein, und ich kontaktierte den Hersteller per E-Mail. Nach einem Monat Korrespondenz mit Typit gelang es mir schließlich, eine vollständige Liste der Befehle mit Interpretation zu erhalten:
Parametercodierung MT3XX E4SParametercodierung NEVA MT124 AS OP (E4P)Update 28.10.2019 : Erläuterungen zu den Befehlen. Die Befehle in der Tabelle werden als Textzeichen dargestellt. Das heißt, wo es 0 (Null) kostet, müssen Sie 0x30 senden. Punkte und Sternchen sind Trennzeichen für Schönheit, sie bedeuten nichts und Sie müssen sie nicht senden. Am Ende des Befehls wird ein Prüfsummenbyte hinzugefügt, das unter Berücksichtigung des Befehlspräfixes und des Postfixes berechnet wird, die in der Tabelle nicht angegeben sind. Das Präfix für alle Lesebefehle lautet 0x01 0x52 0x31 0x02. Dieser Postfix ist 0x28 0x29 0x03. Das Senden eines Präfixes ist jedoch nicht erforderlich, und ein Postfix scheint obligatorisch zu sein. Beispiel: Befehl zum Lesen des Datums 09.09.02 * FF. Eigentlich müssen Sie die Textzeichencodes 000902FF übergeben. Das heißt, 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46. Fügen Sie das Präfix und das Postfix hinzu, wir erhalten die Menge 0x01 0x52 0x31 0x02 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03. Wir lesen die Prüfsumme als xoder aller Bytes minus 1 und addieren das empfangene Byte am Ende. Das Präfix wird als optional verworfen. Als Ergebnis senden wir dies an den Zähler - 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03 0x68. Vor dem Beginn des Austauschzyklus müssen die Befehle für die Austauschinitialisierung stehen. In der folgenden Skizze sind diese Befehle als // Start 1, 2, 3 gekennzeichnet. Sobald der Austausch initialisiert ist, können Sie die Daten vom Zähler im Zyklus für eine beliebig lange Zeit lesen, jedoch nach Verlust der Kommunikation und Möglicherweise ist nach längerem Mangel an Austausch aus anderen Gründen eine Neuinitialisierung erforderlich.
Darüber hinaus besteht die technische Angelegenheit darin, einen Zyklus der Parameterabfrage unter Arduino zu schreiben und diese zunächst im Port-Monitor anzuzeigen. Die Zeit eines Zyklus betrug ungefähr eine Sekunde. In der endgültigen Version des Projekts mit Datenprotokollierung auf einem Flash-Laufwerk und Abfragetemperatursensoren wurde diese Zeit jedoch auf 4 Sekunden erhöht. Das passte mir überhaupt nicht und musste in die Optimierung eintauchen. Infolgedessen habe ich wieder ein zweites Intervall erreicht, ohne die Funktionalität zu verlieren. Übrigens habe ich die Skizze zwei- oder dreimal von Grund auf neu geschrieben, bis ich die richtige Architektur und die richtigen wirtschaftlichen Algorithmen gefunden habe.
Software-Implementierung des Austauschs mit einem ZählerDer Code wird aus dem Kontext meiner großen Arbeitsskizze herausgerissen. Kompiliert, aber in dieser Form habe ich es nie ausgeführt. Ich gebe es nur als Beispiel und nicht als fertiges Arbeitsprogramm. Obwohl theoretisch alles in dieser Form funktionieren sollte.
Der Code wird für zwei Arten von Zählern gleichzeitig geschrieben, einphasiges MT-124 und dreiphasiges MT-324. Der Zählertyp wird im Programm automatisch durch das Antwortwort des Initialisierungsbefehls ausgewählt.
Ich zitiere den Code so wie er ist, ohne Hübschheit und ohne zusätzliche Kommentare außer denen, die ich für mich selbst geschrieben habe. Und ja, ich bin kein Programmierer und lerne nicht einmal dafür. Sie sollten mich also nicht wegen der Qualität des Codes treten, aber Sie können lernen, wie man
codiert :
EnergyMeterNeva.inoEin großes Plus des Stromzählers ist eine zuverlässige und genaue Echtzeituhr. Ich musste dem System kein zusätzliches Modul zur Verfügung stellen, das nicht nur irgendwie, sondern auch qualitativ hochwertig zu finden ist. Die auf die Sekunde genau aktuelle Zeit erhalte ich unter anderem vom Zähler. Ja, in Bezug auf die Atomzeit ist die Zählerzeit leicht verschoben (einige Sekunden). Ich weiß nicht, womit sie verbunden ist, eine Werkseinstellung von schlechter Qualität oder etwas anderes, aber die Genauigkeit ist ausgezeichnet, nur mit einer leichten Abweichung.
In seltenen Momenten, wenn der Strom in der Hütte ausgeschaltet ist und der Zähler nicht mehr verfügbar ist, erhalte ich die aktuelle Zeit vom internen Timer von Arduina. Wenn der Stromzähler funktioniert und seine Daten verfügbar sind, schreibe ich den internen Timer von Arduina mit dem Wert des Zählers in jeder Schleifenschleife neu. Wenn der Zähler abfällt, tickt die aktuelle Zeit weiterhin auf dem Arduina-Timer.
Neben dem Lesen der Parameter kann natürlich auch der Zähler programmiert werden. Das heißt, die Schnittstelle funktioniert sowohl zum Lesen als auch zum Schreiben. Mit solchen Schwierigkeiten versuchte ich jedoch, ein Protokoll zum Lesen von Befehlen zu erhalten, das ich dem Hersteller nicht einmal über die Anforderung eines Aufzeichnungsprotokolls anzeigte. Erstens brauchte ich es nicht, außer vielleicht nur ein wenig Zeit, um es zu bewegen. Zweitens vermute ich, dass diese Daten nicht mehr öffentlich sind, da sie für betrügerische Zwecke verwendet werden können.
TemperatursensorenIch habe bereits zuvor
einen Test von Temperatursensoren mit einem Skizzenbeispiel separat durchgeführt. Jetzt blieb es nur noch, ihre Umfrage in das Hauptprojekt einzubetten. Es war nicht schwer. Alle neun Sensoren, die ich hatte, arbeiteten problemlos, als ich 1-Wire parallel einschaltete. Der Messbereich zwischen ihnen betrug etwa 0,5 Grad, was zeigt, dass es sinnlos ist, sie mit einer maximalen Genauigkeit von 0,0625 Grad zu verwenden. Ich sammelte die Sensoren für den Test in einer Packung und wickelte sie in mehrere Schichten Polyethylenkleber ein. Für eine größere Genauigkeit platzierte ich die Packung vertikal und wartete einen Tag, um die Temperatur vollständig auszugleichen. Die Messwerte aller Sensoren waren nicht gleich.
Ich habe jedoch nicht begonnen, die Genauigkeit der Umrechnung der Temperatur der Sensoren selbst zu beeinträchtigen. Es ist einfacher, die Messwerte programmgesteuert abzurunden, und ich würde den Nutzen aus dem Zeitpunkt der Umfrage nicht ziehen, da ich einen Algorithmus entwickelt habe, bei dem das Zeitlimit für die Konvertierung keine leere, nutzlose Verzögerung ist (750). Die übliche Logik für die Arbeit mit Sensoren besteht darin, zuerst einen Befehl zum Starten der Temperaturumwandlung auszugeben, dann auf den Abschluss der Umwandlung zu warten (mindestens 750 ms) und dann die Daten zu lesen. Ich habe das Gegenteil getan, wodurch ich ein leeres Warteintervall ausschließen konnte - zuerst habe ich die Daten von den Sensoren gelesen und dann sofort mit der Konvertierung begonnen. Und während der gesamte Rest des Codes im LOOP-Zyklus funktioniert, haben die Daten nur Zeit, sich auf das Lesen in der nächsten Runde vorzubereiten. Mit der Zeit erhalte ich die Daten in diesem Fall etwas später von den Sensoren - der LOOP-Zyklus dauert ungefähr 1-1.5 Sekunden, aber das ist absolut nicht kritisch.Manchmal erhielt ich von allen Sensoren die Daten „85“ oder „0“. Ich verstehe nicht, um welche Art von Pfosten es sich handelt, daher habe ich den Code überprüft und ausgeschlossen, dass solche Daten in das Ergebnis gelangen. Ein weiterer Pfosten wurde an einem der Sensoren entdeckt - er hielt die Einstellungen nicht, als die Stromversorgung ausgeschaltet wurde. Entweder ist sein internes Flash-Laufwerk tot oder etwas anderes. Daher habe ich im Setup die Einstellungen für die Sensoren registriert, und jetzt, wenn die Stromversorgung eingeschaltet wird (falls sie immer noch verschwindet), sind garantiert alle Sensoren konfiguriert.Ich habe die Adressen bestimmter Sensoren anhand eines Skizzenbeispiels erhalten, das irgendwo von mir ausgegraben und ein wenig geändert wurde: DS18x20_Temperature.inoDanach habe ich die Adressen mit Konstanten in einem Array bewertet und mich im Hauptprogramm sofort an die Sensoren gewandt, deren Adressen: TempSensors_DS18B20.inoFür den korrekten Betrieb der Sensoren am 1-Draht-Bus muss ein 4,7-kΩ-Pull-up-Widerstand zwischen der Datenleitung und der Stromversorgung installiert werden. Es war praktisch für mich, einen SMD-Widerstand zwischen die Stifte des Klemmenblocks zu löten, aber ich fand in einem geeigneten Gehäuse nur 5,1 kOhm und legte ihn ein (er ist auf dem Foto im Montageabschnitt auf der Unterseite der Platine sichtbar). Alles funktioniert gut.Meine Temperatursensoren sind elektrisch parallel an einer langen Leitung (+5, gnd und Daten) angeschlossen, alle 9 Teile, aber schwierig. Twisted Pair-Kabel sind physikalisch durch einen Stern verbunden, um Sensoren bequem um das Objekt herum zu verdrahten. Ich benutze zwei Paare in jedem Kabelarm. Ein Paar ist die Sensorleistung. Das zweite Paar ist eine Datenleitung, die durch eine Leitung zum Sensor führt und von dieser über die zweite Leitung zurückkehrt. Somit ist es möglich, die Kabel mit einem Stern von der Abschirmung zu trennen, aber elektrisch ist es ein Stern nur in der Leistung, und nach den Daten ist es eine Leitung. Diese Verbindungsoption erwies sich bei der Arbeit an langen Leitungen als zuverlässiger. Bei einer einfachen Parallelverbindung traten beim Lesen von Daten viele Fehler auf. Hier ist eine Skizze eines solchen Schemas:
Ich habe die halben Meter langen Enden der dreiadrigen Kabel der Sensoren selbst nicht gekürzt, sondern sie so angeschlossen, wie sie waren. Es stellte sich heraus, dass dies nicht kritisch war.Insgesamt gibt es drei Kabel für die Kabinen, zwei für externe Sensoren, jeweils eines für jede und eines für alle verbleibenden sieben internen. Diese sieben internen Sensoren werden auf die gleiche Weise angeschlossen, jedoch innerhalb eines langen Kabels und mit kurzen Abzweigungen davon (siehe die untere T-Form in der Skizze). Irgendwo gab es genug einen Standard-halben Meter Schwanz des Sensors zum Verzweigen, irgendwo wurde er mit Hilfe des gleichen verdrillten Paares verzweigt.Zweidraht-Sensorschaltkreis mit sogenannter Ich habe keine parasitäre Energie verwendet (wenn die Sensoren über die Datenleitung mit Strom versorgt werden), weil ... warum? Auf jeden Fall würde ich vier Paar Kabel nehmen, einfach weil ich sie hatte. Es gibt keine Probleme beim Verlegen des Kabels in den Kabinen. Und die parasitäre Stromversorgungsschaltung ist entscheidend für die in einigen Betriebsarten verbrauchte Strommenge. Es können unnötige Probleme auftreten.Die Gesamtlänge des verdrillten Paares in den Kabinen betrug ungefähr 25 Meter. Teile für externe Sensoren - 5 und 10 Meter, und ein zehn Meter langes internes Teil mit Abzweigungen für sieben Sensoren. Alles funktioniert fast perfekt. Anstelle von Temperaturwerten kreuzen sich nur gelegentlich Striche. Dies bedeutet, dass Daten von einem bestimmten Sensor nicht korrekt gelesen wurden. Aber das passiert so selten (ich merke es vielleicht einmal im Monat), dass es keine Probleme verursacht.Remote - Zugrifffür Remote - Zugriff auf das Arduino wurde Ethernet Schild gekauft. Mit einer eingebauten Bibliothek erwies sich die Arbeit damit, wie alles andere in Arduino, als recht einfach.Funktionell ist mein Arbeitsschema wie folgt. Auf Arduino wurde ein Webserver eingerichtet, der beim Zugriff eines Clients (Browsers) eine Webseite mit verschiedenen Informationen generiert. Die automatische Aktualisierung der Daten auf der Seite wird mithilfe von Javascript implementiert, das den Server nach Timer abfragt.Die Seite enthält auch eine Reihe von Steuerelementen zur Steuerung von Aktuatoren, die an Arduino-Leistungsrelais angeschlossen sind, die die lastelektrischen Heizungen und die Beleuchtung schalten.Ich habe mit dem Design der Webseite kein Dampfbad genommen, zumal eine minimale Menge an Textdaten erforderlich war, um sie schneller zu laden, daher das primitivste HTML und das ist alles:
Anstelle von Daten habe ich Tags in den HTML-Code eingebettet, die im laufenden Betrieb durch echte Daten ersetzt werden, wenn die Seite vom Server generiert wird. Wenn Daten auf Anforderung von Javascript automatisch aktualisiert werden, werden sie direkt vom Mikrocontroller im JSON-Format an den Browser übertragen.Der Seitencode befindet sich in einer Datei auf der Speicherkarte und wird beim Zugriff auf den Server von dieser geladen. Für eine schnellere und bequemere Änderung des Seitencodes habe ich den Mechanismus zum Aktualisieren selbst eingebaut. Unten unter dem Block der grundlegenden Steuerelemente befinden sich ein Textfeld und eine Schaltfläche zum Senden. Ich kopiere den neuen HTML-Code in das Textfeld und drücke die Taste. Danach sendet das Java-Skript Daten an den Webserver des Controllers, der sie zuerst in der Spooldatei speichert. Wenn die Übertragung erfolgreich war, wird die Hauptdatei durch einen Puffer ersetzt, die Seite wird automatisch aktualisiert. Das ist alles.
Änderungen akzeptiert.Ich zitiere die Codefragmente meiner Implementierung dieses Mechanismus.In die HTML-Seite binden wir das Formular ein:<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>
Die Schaltfläche "Senden" startet das folgende
Java- Skript:
send_HTM.jsIn der Skizze in der Funktion zum Verarbeiten von Webserveranforderungen nach Präfixen in den Anforderungen 'CONTROL.HTM' (Senden der Datei starten), 'htmlineN' (Senden der Zeilennummer) und 'END_CONTROL.HTM' (Ende des Sendens der Datei) bestimmen wir die folgenden Aktionen:
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; }
Die hier definierten CONTROL_HTM- und CTRL_HTM-Namen sind die Namen der HTML-Dateien. Die erste ist die Hauptdatei, die zweite ist die Pufferdatei. In dem Array von Tag char liegt der Text der empfangenen Zeichenfolge, der aus der Anforderung ausgewählt wurde. Die Logik lautet wie folgt: Wenn Daten empfangen werden, werden sie in die Spooldatei geschrieben. Am Ende des Empfangs wird die Spooldatei in der Hauptdatei überschrieben. Ich konnte immer noch nicht verstehen, wie man die Dateien einfach umbenennt, die SD-Standardbibliothek hat keine solche Funktion, also dummes zeichenweises Kopieren, was viel Zeit in Anspruch nimmt.
Es ist praktisch, den Code der Steuerungswebseite nicht auf der Speicherkarte des Controllers, sondern auf dem Clientcomputer zu speichern oder von einer externen Ressource herunterzuladen. Das Verbot domänenübergreifender Anfragen erlaubt dies jedoch nicht. Javascripts können ihre Anfragen nur in den Norden senden, aus dem sie geladen wurden. In diesem Fall können die Javascripts von überall geladen werden. Es ist nur wichtig, woher die Seite mit ihrem Aufruf geladen wurde.
DatenprotokollierungDas Ethernet-Shield verfügt über einen integrierten Micro-SD-Kartensteckplatz. Aufgrund seiner Anwesenheit habe ich beschlossen, Daten in Protokolldateien zu schreiben. Um mit einer Speicherkarte arbeiten zu können, ist auch eine Bibliothek integriert, und das Schreiben und Lesen von Dateien damit zu verwalten, ist im Allgemeinen elementar.
Um die Datenmenge zu speichern, habe ich den Protokollierungsalgorithmus so erstellt, dass der Datensatz nur dann erstellt wird, wenn sich die Daten um mehr als einen vorgegebenen Schwellenwert ändern. Für die Temperatur beträgt sie 0,1 °, für die Spannung 0,2 V. Daten für einen Tag werden in eine Datei geschrieben. Nach null Stunden wird eine neue Datei erstellt. Ich habe das Nur-Text-Format mit Trennzeichen gewählt, damit Sie den Inhalt von Dateien während des Debuggens schnell steuern können und es eine einfache Möglichkeit gibt, in Excel zu laden.
Aufgrund von Designbeschränkungen können Sie eine Speicherkarte nicht bequem einsetzen / entfernen, daher habe ich eine große Karte verwendet. Nach meinen Berechnungen wird es einige Jahre lang ausgefüllt. Danach muss das Gehäuse zerlegt, die Speicherkarte entfernt und gereinigt werden.
Ich sehe keinen Sinn darin, den Code zu protokollieren, da ist dort alles völlig trivial - eine banale Aufzeichnung von Text in einer Datei. Und dieser Code ist über die gesamte Skizze verteilt (nicht nur die Parameter der Sensoren werden protokolliert, sondern auch eine Vielzahl von einmaligen Ereignissen). Es ist schwierig, ihn zu isolieren.
GrafikenAls Charting-Engine verwende ich die hochflexible
Amavart- Javascript-Visualisierungsbibliothek. Die Bibliothek ist kostenlos und steht zum Download und zur Offline-Nutzung zur Verfügung. Ich habe diese Bibliothek auch auf meinem NAS mit permanentem Internetzugang gefunden. Das Verbinden und Verwenden mit den Standardeinstellungen ist nicht schwierig. Um jedoch die Ansicht zu erhalten, die ich brauchte, musste ich viel basteln. Eine Vielzahl von Beispielen auf der Website und die Verfügbarkeit detaillierter Dokumentation haben geholfen.
Als Beispiel werde ich das Javascript zum Zeichnen von Zeitplänen geben. An sich ist es nutzlos, da es nur in Verbindung mit einem Webserver und einer HTML-Seite funktioniert und möglicherweise mit anderen Skripten verknüpft ist (es ist lange her, ich erinnere mich nicht an alle Details). Aber die Darstellungseinstellungen meiner Diagramme sind darin enthalten und können von dort
abgerufen werden :
get_log.jsDer große Vorteil der Amchart-Bibliothek besteht darin, dass sie aus zerrissenen Daten die richtigen Grafiken zeichnen kann. Wie oben erwähnt, speichere ich im Protokoll Daten nur, wenn sie sich ändern. Das heißt, dies geschieht asynchron und zufällig. Möglicherweise sind einige Minuten lang keine neuen Daten vorhanden, die sich dann in wenigen Sekunden mehrmals ändern. Dementsprechend gehen Einträge im Protokoll mit beliebigen Zeitintervallen. Amchart berücksichtigt dies beim Rendern selbstständig. Ich muss die Daten vor dem Rendern nicht interpolieren. Ich sende das Datenarray einfach so wie es ist und sehe ein schönes Diagramm, das zeitlich einheitlich ist.
Ich habe nur einen Nachteil dieser Bibliothek entdeckt - sie weiß nicht, wie (na ja, oder ich verstehe immer noch nicht, wie) Echtzeitdiagramme menschlich aktualisiert werden können. Sie können vorhandenen Daten neue hinzufügen, aber das gesamte Datenarray wird jedes Mal neu gezeichnet, was den Browser erheblich verlangsamt. Die Ideologie, Daten von Arduina zu lesen, um sie bei Bedarf vom Browser zu rendern, ist jedoch durch ihre Nichtoptimalität fehlerhaft, sodass es keinen Sinn machte, in Echtzeit um ein schnelles Update zu kämpfen.
Die richtige Lösung wäre, einen separaten Server zum Speichern und Visualisieren von Daten zu organisieren, auf dem die Daten von Arduina in Echtzeit ein wenig abfallen und in der Datenbank gespeichert werden und von wo aus sie schnell in einem Browser zur Visualisierung an den Benutzer gesendet werden könnten.
Jetzt sehen die Diagramme so aus (am Beispiel des Tages, an dem sich niemand in der Wechselstube befindet und dementsprechend kein Energieverbrauch besteht). Wenn aktuelle Daten auftreten, wird die Skalierung automatisch so eingestellt, dass alles gut passt und die Werte der aktuellen Pegel auf der vertikalen Achse angezeigt werden:

Diagramme werden auf derselben Seite angezeigt, auf der die Steuerung direkt unter dem Hauptsteuerblock stattfindet.
Ich stelle aus mehreren Gründen nicht absichtlich einen vollständigen Satz von Projektquellen zur Verfügung:
- Es kann nicht wie in einem anderen Netzwerk als meinem gestartet werden, da ich nicht versucht habe, das Projekt portabel zu machen, und es ist fest an meine Adressen und meine Netzwerktopologie gebunden.
- Ich bin sicher, dass die allgemeine Ideologie des Projekts viele verschiedene Probleme hat, da dies mein erster Versuch in dem Bereich ist, in dem ich nicht gut verstehe. Daher schlage ich niemandem das gesamte Projekt zur Wiederholung in dieser Form vor. Ich habe nur die Momente geteilt, in denen ich weniger zuversichtlich bin.
- Das Projekt wurde für eine lange Zeit und für eine lange Zeit durchgeführt, und ich werde mich nie an alle Details erinnern und nicht in der Lage sein, eine Reihe von Lösungen zu erklären. Das Volumen der Skizze ist sehr groß (nach meinen Maßstäben etwa zweitausend Zeilen), es gibt mehr als ein Dutzend verschiedene Java-Skripte, ich habe kein schematisches Diagramm des Eisens erstellt. Das heißt, ich kann nicht helfen, in den meisten Fragen zu beraten.
MontageVon Anfang an habe ich mir das Ziel gesetzt, ein fertiges Gerät zu erstellen und nicht nur ein Layout mit einem Haufen Postings auf dem Tisch:

Und sofort entschieden, dass ich das Gerät in der Schalttafel platzieren möchte. Es gibt Essen und eine Theke, und im Allgemeinen ist es bequem.
Hierfür war ein Dinrek-Fall erforderlich. Zuerst dachte ich daran, es zu entwickeln und auf einem 3D-Drucker zu drucken. Aber ich habe keinen eigenen 3D-Drucker, und was meine Kollegen an ihren selbst zusammengestellten Druckerdrucken arbeiteten, passte mir in der Qualität ihres Aussehens überhaupt nicht. Ich habe
fertige Koffer auf einer DIN-Schiene (in verschiedenen Größen) zum Verkauf gefunden, sie sehen gut aus, sind bequem zu verwenden (zusammenklappbar) und es gibt auch eine fertige
Blindkarte für sie.
Ich habe das größte Gehäuse gekauft, damit nicht nur Arduino mit dem Internetschild hineinpassen kann, sondern auch ein Relais zum Lastschalten:




Als nächstes folgte ein langer und faszinierender Prozess, bei dem der gesamte Kutteln in den Koffer eingebaut wurde. Im Rahmen dieses Geschäfts erwarb ich sogar einen wunderbaren Lötkolben mit Schlaffunktion (die Lötkolben, die ich hatte, stammten noch aus sowjetischer Zeit):

Für die Installation kaufte ich ein paar Racks, Schrauben, Unterlegscheiben und Muttern aller Art. Erstmontage:


Um die Drähte mit den oberen Kontakten zu verbinden, mussten verbogene Stifte verwendet werden, da sie sonst nicht in das Gehäuse passten:

Die Isolierscheiben mussten stellenweise geschnitten werden:

Und stellenweise biegt es sich perverser, hebt die Schraube an der Hülse an und schneidet die Hülse aufwendig ab:


Für ein einzelnes Reloch gab es nicht genügend Drehpunkte, so dass es nur an zwei Punkten hing:

Zusammengebaute Baugruppe mit Klemmenblöcken:

Dann begann das Handwerk allmählich zu Drähten zu wachsen. Die Platine wurde nur zur Stromverdrahtung und zum Anschluss an Klemmenblöcke verwendet. Für Signalverbindungen habe ich das MS-16-Kabel verwendet (ich mag es mehr), für die Stromversorgung ging es nicht durch die Spannung (bis zu 100 V), also MGTF:

Ich habe LEDs an der Vorderseite angebracht, die Strombegrenzungswiderstände direkt an die Beine der LEDs gelötet und sie mit Schrumpfschlauch geschlossen:

Als Ergebnis haben wir eine solche bärtige Füllung bekommen:

Und hier ist ein Schal mit einem Watchdog-Mikrokreislauf, der im Darm meiner Kreation direkt über dem RS-485-TTL-Pegelwandler geschützt ist:


Die gesamte Struktur ist zusammenklappbar, alles kann ohne Löten entfernt, getrennt und ersetzt werden, mit Ausnahme eines Schals mit Hundehütte, der an die Stifte des Steckverbinders gelötet ist und mit einer Reihe von E / A-Anschlüssen von Arduina versehen ist.
In der Box:

Ich habe Öffnungen für Arduinas Stecker in die Plastikwand des Gehäuses geschnitten. Zuerst habe ich die Löcher genau entsprechend der Größe der Steckverbinder gemacht, aber die Montage in das Gehäuse muss diagonal gestartet werden (sonst funktioniert es einfach nicht) und die Steckverbinder gingen nicht durch, ich musste ein wenig verschwenden:

Beim Einschalten des fertigen Produkts auf dem Tisch funktionierte alles sofort:


Auf der Frontplatte gebracht:
- Vier rote LEDs - Lastanzeige;
- Zwei grüne - Kommunikation mit dem Zähler und mit dem VPN-Server;
- Zwei gelbe sind frei;
- Ein Gelb - Anzeige eines Neustarts des Routers;
- Ein Rot ist Ernährung;
- Und eine Reset-Taste.
Um 5 Volt aus 220 herauszuholen, habe ich ein Dinerey-Netzteil mit Ausgangspegeleinstellung verwendet. Der Strom wurde direkt an den Mikrocontroller geliefert, wobei der Eingangswandler von 7-12 auf 5 Volt umgangen wurde. Dies war aus mehreren Gründen praktisch. Erstens war die Leistung des eingebauten Wandlers irgendwann nicht mehr ausreichend, der Strom dort ist begrenzt. Zweitens war es weiterhin notwendig, das Relais mit 5 Volt zu versorgen. Drittens ist der Armaturenbrett ein praktischer Dinrek-Formfaktor in Bezug auf die Installation. Deshalb hier:
Test
Alles wurde auf den Tisch gedreht, alles funktionierte wie es sollte, es war Zeit, den Controller im Schild zu installieren und ihn im Kampfmodus zu überprüfen.
Aber zuerst habe ich alles „am Rotz“ angeschlossen und buchstäblich den ganzen Kutteln in eine andere Abschirmung mit geringem Strom geschoben, um die Temperatursensoren unter realen Bedingungen auf langen Leitungen zu testen, die in einem Kabelkanal mit ~ 220-V-Stromkabeln verlegt sind:

Wie Sie auf dem Foto oben sehen können, habe ich bisher versucht, den Neustart des Routers über die „intelligente“ Senseit-Buchse mit Strom zu steuern. Dieses Gerät mit wahnsinnigen Kosten von 5.000 (für 2016) erwies sich jedoch als extrem fehlerhaft und launisch. Während des Nutzungsjahres war ich wiederholt gezwungen, zu ungünstigen Zeiten ungeplant in der Hütte anzukommen, um dieses Wunder des technischen und Marketing-Denkens manuell von einem tiefen Nachteil in Bezug auf die GSM-Kommunikation zu entfernen. Mit dem Übergang zu meinem Arduino-Controller, der sich als zuverlässiger als ein Beispiel herausstellte, war ich erleichtert, diesen „professionellen“ Müll in eine schöne Schachtel in einer Schachtel zu werfen und ihn zu vergessen.

Der Test war erfolgreich, es gab keine Fehler und es war möglich, an einem regulären Ort mit der endgültigen Installation fortzufahren:

Ja, dies ist der Schild ABB TwinLine 800x300x225 IP55 im Wert von 25 Tausend Rubel. ohne zu füllen (und für weitere 15 Tausend ungefähr füllen). Und ja, es ist in einem 6x2 Wechselhaus installiert. Jeder hat seine eigenen Kakerlaken. Ja, ich habe
die gesamte Elektrik selbst gesammelt . Und er hat auch eine Umkleidekabine gebaut, ja. Nein, ich bin kein Elektriker. Und kein Baumeister.

In den Tiefen des Schildes habe ich eine kleine unterbrechungsfreie Stromversorgung
Powercom WOW 300 gefunden , dort leuchtet die grüne LED und links und darüber - der Eingangsstecker:

Die Akkulaufzeit des Arduino-Geräts, eines Routers mit USB-Modem und WLAN sowie Full-HD-IP-Überwachungskameras beträgt ca. 40 Minuten.
Und hier sehen Sie die weißen Netzstecker von zwei unterbrechungsfreien Verbrauchern - dem Arduino-Netzteil und dem Niedrigstromschild, auf dem sich der Router und das Netzteil für die Außenüberwachungskamera befinden. Diese Leitung führt zu einer Unterbrechung des von Arduino gesteuerten Schützes, nur für denselben Software-Watchdog, der den Router im Falle eines VPN-Ausfalls mit Strom neu startet (die Kamera wird gleichzeitig neu gestartet, obwohl sie ihn nicht benötigt). Die oberen Linien der verdrillten Paare von Temperatursensoren sind mit der Steuerung verbunden:

Ich muss sagen, dass ich dem Umschalten einer starken Last auf kleine blaue chinesische Relais trotz der Parameter dieser Relais, die dies zu ermöglichen scheinen, niemals vertrauen würde. Daher wurde sofort die Verwendung normaler modularer Schütze
Legrand Kat. Nr. 4 125 01 mit der Möglichkeit der manuellen Steuerung festgelegt. Das heißt, die Relais im Steuerkörper steuern die Schütze, und die Schütze steuern bereits die Last. Es ist zuverlässig. Die Stromversorgung des Routers und der Kamera erfolgt jedoch nur über dieses kleine blaue chinesische Relais, der Strom dort ist gering, so dass es möglich ist.
Beim ersten Kampfstart war ich sehr enttäuscht. Auf dem Tisch habe ich alles außer der Last erlebt. Warum? Schütze klicken und es ist klar, dass sie die Last wechseln werden. Aber nein, es war notwendig zu erleben. Leistungsstarke Elektrokonvektoren führten zum Zeitpunkt des Öffnens der Kontakte zu Störungen im System, was zu einem garantierten Einfrieren der Internetabschirmung führte. Und um ihn aus dem Abstieg herauszuholen, war nur durch Entfernen der Stromversorgung möglich, ein einfaches Zurücksetzen half nicht. Googelte - ja, dieser Chinese hat so ein Problem. Und die Bibliothek geht mit dieser Situation nicht um. Das heißt, das Stück Eisen ist schlecht und die Software ist nicht sehr gut.
Ich dachte schon, dass alles weg ist. Ich habe sogar Halbleiterrelais bestellt, aber sie sind größer und passen nicht in mein Design. Aber dann dachte ich, dass es immer noch möglich sein könnte, die Störung zu unterdrücken. Wieder gegoogelt, fanden spezielle Rauschunterdrückungskondensatoren (die sogenannten Kondensatoren vom Typ X). Schließen Sie sie einfach parallel zur Steuerwicklung der Schütze an, und siehe da! Aufhängevorgänge verschwanden vollständig. Im vergangenen Betriebsjahr wurde kein einziger Fall registriert:



Aber auf diese Weise können Sie in die Box schauen:


Nun, die fertige Ansicht des Visiers mit dem Plastron (im Kit waren keine Stopfen enthalten):

Zum Debuggen und Blinken wird das USB-Kabel an den Controller angeschlossen und im Schild hinter einer geschlossenen Tür aufbewahrt (es wird vorübergehend nicht mit diesem Foto verbunden):


Das System arbeitet seit fast einem Jahr und hat Fröste bis zu 20 Grad problemlos überstanden.
Generell bin ich mit dem Ergebnis zufrieden. Für mehr oder weniger funktionale Aufgaben ist Arduino jedoch eindeutig schwach. Mehr als einmal ging mir der Speicher aus und ich musste schneiden und optimieren. Und die Arbeitsgeschwindigkeit, insbesondere mit einer Speicherkarte, passt mir überhaupt nicht. Daher möchte ich bei den zukünftigen Implementierungen solcher Handwerke, wenn überhaupt, auf etwas Stärkerem aufbauen. Kollegen geben mir einen Raspberry Pi, eine gute Option, denke ich.
Jemand könnte sagen: „Wie viele Schwierigkeiten gibt es für eine solch primitive Aufgabe?“ Und wird wahrscheinlich richtig sein. Für mich ist dieses ganze Unternehmen ein Hobby mit wenig Rechtfertigung für die Bedeutung. Deshalb suchte ich Unterhaltung in allem, wo ich konnte :)