Fortsetzung dieses ArtikelsDas Unternehmen kaufte NEXT-M-Überwachungsposten der inländischen Produktion NEXT Technologies. Um die Visualisierung des Betriebs von Pumpeinheiten zu gewährleisten,
Feueralarm, Spannung an den Startern, Raumtemperatur, Notwasserstand. Das Herzstück von NEXT-M ist ATMEGA 1280. Diese Tatsache war ermutigend hinsichtlich der Möglichkeit, ein eigenes Kit für spezielle Anforderungen zu erstellen.
Die Aufgabe bestand darin, in kürzester Zeit und zu niedrigsten Kosten ein vollständig autonomes lokales Versandsystem zu schaffen. Basis ist der Mikrocontroller. Entwicklung, Herstellung, alles vom Personal selbst.
Das System sollte ohne Abhängigkeit von Mobilfunknetzen, Servern, dem Internet und dem Lizenzierungssystem für die Verwendung von Hochfrequenzressourcen arbeiten, keine Computer verwenden oder Laptops im Überwachungs- und Steuerungssystem maximal regelmäßig verwenden, ohne über einen längeren Zeitraum (6 bis 9 Monate) auf Objekte zugreifen zu müssen. Die Netzwerkkonfiguration hat eine radiale Struktur. Die Daten werden an einem Punkt gesammelt und dann zur Verarbeitung über herkömmliche Kommunikationskanäle oder als Ausdruck gesendet.
Das System sollte Folgendes bereitstellen:
- Überwachung des Betriebs von Pumpeinheiten
- technologische Automatisierung
- Notfallschutz
- Notfallalarm
- Betriebsstunden
- Berechnung der verbrauchten Strommenge
- Gerätetemperaturregelung
- Feueralarm
- periodisches Fernlesen von Informationen
- unbekannte zukünftige Anforderungen
Betriebsbedingungen:
- Abdeckungsfläche 1 km².
- direkte Sichtbarkeit zwischen Objekten
- Temperatur von +50 bis -50 ° C.
- Luftfeuchtigkeit bis zu 100%
- biologisch aktive Ablagerungen (Schimmel, sulfatreduzierende Bakterien)
- Vibration, nicht mehr, Maschinen der Klassen 1–2 gemäß GOST ISO 10816-1-97
- Elektromagnetische Umgebung - Schalten von Elektromotoren durch Schütze KT 6053, RVS-DN-Softstarter, SIIDENS MICROMASTER PID-Regelgeräte, Strahlung im ISM- und GSM-Bereich gemäß den Anforderungen für diese Geräte, manuelles Lichtbogenschweißen vor Ort
- Überspannung des Netzes, kurzfristige Stromausfälle, Blitzüberspannungen, Phasenungleichgewicht bei Ausfall der Freileitung in Verteilungsnetzen von 6-10 kV.
Trotz dieser strengen Anforderungen ist die Implementierung mit einer schrittweisen Lösung des Problems recht einfach.
Vor diesem Hintergrund wurde das Arduino Nano 3.0-Board zum "Gehirn" der Konzeption. Der Robotdyn-Schal verfügt über einen ATMEGA 328-Controller, den erforderlichen 3,3-V-Spannungsregler
800 mA Strom und Wandler zu CH340G UART-USB.
Zunächst wurden Betriebszeitzähler als die relevantesten erstellt. Zuvor verwendete Industriezähler, die auf PICs mit einem transformatorlosen Stromversorgungskreis gesammelt wurden, fielen während des Betriebsjahres aufgrund von Spannungsspitzen aus. Nur intakt mit Hilfe von hausgemachten Netzteilen für 5V blieb intakt. Um die Installation und die Universalität der Verbindung zu beschleunigen, wird ein Signal über den Zustand der Einheiten von den Anschlüssen der Schaltvorrichtungen, d. H. Registrierung des Vorhandenseins der 1. Phase der Spannung mit einer dreiphasigen Stromversorgung 380V. Zur Koordinierung mit der Steuerung wird ein Zwischenrelais mit einer 220-V-Wicklung oder ein Optokoppler aus einer LED und einem Fotowiderstand GL5516 oder einem Optoelement PC817 verwendet. Alle Optionen wurden getestet. Die LED wird von einer gleichgerichteten Spannung mit Strombegrenzung gespeist, wobei zwei CBB22-Kondensatoren verwendet werden, die für eine Spannung von 630 V ausgelegt sind und zur Sicherheit bei der Stichprobenprüfung von Stromkreisen mit einem Megaohmmeter in Reihe geschaltet sind.
Ablesen der Betriebszeit mit dem LCD-Bildschirm ST7735S, Übertragen von Echtzeitdaten über Funk mit dem Modul E01-ML01DP05 mit einer Frequenz von 2,4 MHz. Dieses Gerät enthält einen nRF24L01 + -Chip und einen RFX2401C-Empfangs- / Empfangsverstärker.
Ausgangsleistung bis zu 100 mW. Spiralantennen für die gewünschte Reichweite im Online-Rechner der
Site . Die Wahl des Antennentyps beruht auf dem Ausschluss des Empfangs einmal reflektierter Wellen von den umgebenden Metallstrukturen. Antennenteile werden auf einem 3D-Drucker gedruckt. Der aktuelle Status der Zähler wird im EEPROM der Steuerung selbst gespeichert und bei einem unerwarteten Stromausfall wiederhergestellt. Zeitintervalle für das Zählen werden vom RTC DS3231-Chip in Form eines Moduls mit einer Pufferbatterie bereitgestellt. Im Netzteil werden drei Module verwendet, die HLK-PM01 600mA 220 / 5V-Impulsquelle selbst, der
HW- 553- und der
03962A- Wandler von 1-5V auf 5V sind ein Batterieregler mit
einem Schutzkreis gegen Kurzschluss, Überentladung und Überladung. Alle Komponenten wurden auf der Aliexpress-Website gekauft.
4-Kanal-Zähler. An den Eingängen befinden sich LC-Filter zum Schutz vor Störungen auf einer Twisted-Pair-Kommunikationsleitung. Daten über den Zustand der Kontrollobjekte werden ständig 1 Mal pro Sekunde gelesen und farbig auf dem LCD angezeigt. Die Messwerte werden alle 36 Sekunden aktualisiert und im nichtflüchtigen Speicher aufgezeichnet. 36 Sek. Ist 1/100 Stunden, in diesem Format werden Daten benötigt. Alle 12 Sekunden Für jede Steuereinheit werden Informationen über die Anzahl der Betriebssekunden übertragen. Der EEPROM-Speicher hat laut Hersteller eine begrenzte Anzahl von Schreiblöschzyklen, 100.000 Mal. Die schlechteste Option ist, wenn mindestens eine Zelle ständig aktualisiert wird. Die Größe des ersten Zählers beträgt 4 Bytes, dies ist eine Langformatnummer, 4 Zähler, insgesamt 16 Bytes belegen einen Datensatz. Die Chipspeicherlänge beträgt 1024 Bytes. Nach 64 Einträgen von 4 Zählern beginnt die Aufzeichnung erneut. In der EEPROM-Bibliothek zeichnet die EEPROM.put-Methode nicht auf, wenn der Wert der Zelle und die zu schreibenden Informationen übereinstimmen, werden die Zellen nicht beeinträchtigt. Infolgedessen beträgt die garantierte Betriebszeit des Speichers mehr als 7 Jahre. Die Zeit möglicher, aber ungerechtfertigter Arbeiten kann viel länger sein.
Programm in Arduino IDE// 12 328 Bytes (38%)
#include <Adafruit_GFX.h> // Kerngrafikbibliothek
#include <Adafruit_ST7735.h> // Hardwarespezifische Bibliothek
#include <SPI.h>
#include <EEPROM.h>
#include <Wire.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24-Radio (9, 10); // Funkobjekt für die Arbeit mit der RF24-Bibliothek,
// und Pin-Nummern nRF24L01 + (CE, CSN)
#include <DS3231.h>
DS3231 rtc (SDA, SCL);
Zeit t;
// # definiere TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // Sie können dies auch mit dem Arduino-Reset verbinden
// In diesem Fall setzen Sie diesen #define Pin auf -1!
// # definiere TFT_DC 9 // DC = RS = A0- Optionen zur Bezeichnung des Ausgangs der Wahl des Befehls- oder Datenregisters.
#define TFT_DC 3
Adafruit_ST7735 tft = Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_RST);
// Option 2: Verwenden Sie alle Stifte, aber etwas langsamer!
#define TFT_SCLK 13 // setze diese auf die Pins, die du magst!
#define TFT_MOSI 11 // setze diese auf die Pins, die du magst!
// Adafruit_ST7735 tft = Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include <avr / wdt.h>
Byteverschiebung = 52;
Byte pinState;
vorzeichenlose lange Pumpe [4]; // Array mit 4 Sekunden
float m = 3600,0;
vorzeichenlose int-Adresse = 0;
int rc; // Variable für Zähler
unsigned long sumprim = 0;
vorzeichenlose lange Summe = 0;
Byte i = 0;
Byte k = 34;
unsigned int z = 0;
Byte b = B00000001;
Byte-Pumrcounter [4]; // Array zum Speichern der Zustände von Objekten, 1- aus, 0- ein
int start = 0; // //
void setup () {
rtc.begin ();
radio.begin (); // Initiiere die Operation nRF24L01 +
radio.setChannel (120); // Datenübertragungskanal (von 0 bis 127).
radio.setDataRate (RF24_250KBPS); // Datenübertragungsrate (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // Sendeleistung (RF24_PA_MIN = -18 dBm, RF24_PA_LOW = -12 dBm,
// RF24_PA_HIGH = -6 dBm, RF24_PA_MAX = 0 dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Öffne die Pipe mit der Kennung für die Datenübertragung
// Um die Zeit einzustellen, kommentieren Sie die erforderlichen Zeilen aus
//rtc.setDOW(1); // Wochentag
//rtc.setTime(21, 20, 0); // Zeit im 24-Stunden-Format.
//rtc.setDate(29, 10, 2018); // Datum, 29. Oktober 2018
tft.initR (INITR_BLACKTAB); // Initialisiere einen ST7735S-Chip, schwarze Lasche
// Verwenden Sie diesen Initialisierer (Kommentar), wenn Sie einen 1,44 "-TFT verwenden
//tft.initR(INITR_144GREENTAB); // Initialisiere einen ST7735S-Chip, RED rcB tab
tft.setTextWrap (false); // Text am rechten Rand ablaufen lassen
tft.setRotation (2); // für BLACK PCB und RED tft.setRotation (0) oder nicht.
tft.fillScreen (ST7735_BLACK); // Bildschirm löschen
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // Software-Straffung funktioniert, High-Level-
// überwachte Objekte "funktionieren nicht", "1" wird in alle 4 Senior-Ports von D geschrieben, das Konto geht nicht.
für (rc = 0; rc <4; rc ++)
{
tft.setCursor (3, rc * 10 + shift); // Anzahl der Positionen von Kontrollobjekten anzeigen
tft.print (rc + 1);
}}
tft.setCursor (12, 0); // 3 Textzeilen ausgeben
tft.println ("DEVELOPERS & BUILD"); // um deine Lieben zu preisen
tft.setCursor (24, 10); // oder böses Urheberrecht
tft.print ("ENTWICKLER MM");
tft.setCursor (28, 20);
tft.print ("BUILD-ER DD");
// Datenwiederherstellung ///////////////////////////////////////////////////// ////////////
für (z = 0; z <1023; z + = 16) {// Iteriert über alle Zellen seiner Industrie
// und schreibt in das Array von 4 Variablen pump, 4 Bytes pro Zähler, weil
// Variable ohne Vorzeichen. Zähler 4, ein Datensatz aller 4 benötigt 16 Bytes.
EEPROM.get (z, Pumpe [0]); // also ohne for-Schleife weniger Volumen
EEPROM.get (z + 4, Pumpe [1]);
EEPROM.get (z + 8, Pumpe [2]);
EEPROM.get (z + 12, Pumpe [3]);
// Zuweisung eines neuen nächsten Wertes aus der Summe der 4-x Zähler
sumprim = (Pumpe [0] + Pumpe [1] + Pumpe [2] + Pumpe [3]);
// vergleicht den neuen Wert der Summe von 4 Zählern in der Variablen sumprim mit dem vorherigen Wert in der Variablen
// sumsec und wenn der vorherige Betrag kleiner oder gleich der neuen Summe ist, wird eine neue größere oder gleiche Summe zugewiesen
// sumsec Wert.
if (sumsec <= sumprim) {
sumsec = sumprim; // //
// und der aktuelle Wert z wird der Adressvariablen zugewiesen, z ist die Adresse des Anfangs des Blocks von 16 Bytes aus 4 Werten
// gleichzeitig aufgezeichnete Zähler (da beim Abrufen eines Ports alle 8 Bits gleichzeitig aufgezeichnet werden
// einschließlich unserer gewünschten hohen 4 Bits von Port D).
Adresse = z;
}}
}}
// Wiederum beträgt der Zugriff auf den Epromprom-Speicher an der Anfangsadresse des Blocks 16 Byte von 4 Werten der aufgezeichneten Zähler
// zuletzt, d.h. Werte vor dem Herunterfahren oder Neustarten aufgrund eines Hangs. Letzte Aufnahme
// Werte von Zählern zu einem Array von 4 Variablen pump.
EEPROM.get (Adresse, Pumpe [0]);
EEPROM.get (Adresse + 4, Pumpe [1]);
EEPROM.get (Adresse + 8, Pumpe [2]);
EEPROM.get (Adresse + 12, Pumpe [3]);
Adresse + = 16; // Erhöhe die Adresse zum Schreiben des nächsten Blocks, ohne die Daten des letzten Datensatzes zu überschreiben
// Ende der Datenwiederherstellung //////////////////////////////////////////////// /////////////////////
attachInterrupt (0, count, RISING); // Pin D2, aktiviere den Interrupt-Betrieb, jede Sekunde, in der sie ankommen
// Impulse von RTC DS3231 vom SQW-Ausgang
wdt_enable (WDTO_8S); // Starten Sie den Watchdog-Timer und starten Sie den Controller im Falle eines Hängens neu.
// für die Sie den Befehl wdt_reset timer reset senden müssen (und einen Neustart während des normalen Betriebs vermeiden müssen - 8 Sekunden.
// Für Tests wird nicht empfohlen, den Wert auf weniger als 8 Sekunden einzustellen. In diesem Fall wird der Timer zuvor zurückgesetzt
// graben und jede Sekunde.
}}
void loop () {
// leerer Zyklus, hier wird der phasenverschobene Betriebsmodus des Elektromotors gesteuert
}}
void count () {
tft.setTextColor (ST7735_WHITE); // Setze die Schriftfarbe
t = rtc.getTime (); // Zeit lesen
tft.setCursor (5, 120); // Cursorposition setzen
tft.fillRect (5, 120, 50, 7, ST7735_BLACK); // Zeitausgabebereich löschen
tft.print (rtc.getTimeStr ()); // Stunden anzeigen
wdt_reset (); // den Watchdog-Timer in jedem Zyklus zurücksetzen, d. h. eine Sekunde
for (rc = 0; rc <4; rc ++) // Start der Schleife zur Überprüfung des Eingangszustands
// Portbits zum vorherigen Lesestatus von Port D-Bits
{
pinState = (PIND >> 4) & (b << rc);
if (pumrcounter [rc]! = pinState) {// und wenn es nicht übereinstimmt, dann
pumrcounter [rc] = pinState; // Ordne die Portbit-Zustandsvariable dem neuen Wert 1/0 zu
}}
// Anzeige des Status von Objekten der Farbkontrolle
// BLAU ist ein kleiner Fehler des vorhandenen Bildschirms (oder der Bibliothek?). RGB und BGR werden gemischt.
if (pinState == (b << rc)) {
tft.fillRect (15, ((rc * 10 + Verschiebung)), 7, 7, ST7735_BLUE); // Ändern Sie für Konten auf niedriger Ebene GRÜN in BLAU
} else {
tft.fillRect (15, ((rc * 10 + Verschiebung)), 7, 7, ST7735_GREEN); // Ändern Sie für ein Konto auf niedriger Ebene BLAU in GRÜN
Pumpe [rc] + = 1; // 1 Sekunde zum Laufzeitzähler hinzufügen
}}
}}
k ++;
if (k == 36) {
k ist 0;
tft.fillRect (30, shift, 97, 40, ST7735_BLACK); // lösche den Laufzeitausgabebereich
tft.fillRect (60, 120, 73, 7, ST7735_BLACK); // und Daten
tft.setCursor (60, 120); // Cursorposition setzen
tft.print (rtc.getDateStr ()); // zeige das Datum auf dem LCD-Bildschirm an
für (rc = 0; rc <4; rc ++) // Betriebszeitablesungen in ganzen Zahlen, Zehnteln und ausgeben
{
tft.setCursor (30, rc * 10 + Verschiebung); // Hundertstelstunde mit einer Verschiebung von 10 Pixel nach unten auf dem Bildschirm
tft.println (Pumpe [rc] / m);
}}
// "rohe" Betriebszeitwerte (in Sekunden) im EEPROM aufzeichnen /////////////////////////////////////
für (rc = 0; rc <4; rc ++)
{
EEPROM.put (Adresse, Pumpe [rc]);
Adresse + = Größe von (float); // Inkrementiere die Datensatzadressvariable
}}
}}
// Daten drahtlos aus Daten senden, die angeben, wie viele Bytes gesendet werden sollen.
if ((k == 6) || (k == 18) || (k == 30)) {
vorzeichenlose lange Daten;
radio.write (& start, sizeof (start));
für (i = 0; i <4; i ++) {
Daten = Pumpe [i];
radio.write (& data, sizeof (data));
}}
}}
}}
Ein paar Kommentare am Ende. Das Konto hat an den Eingängen einen niedrigen Logikpegel.
Aufhängungswiderstände R2-R5 36 kOhm für Version mit GL5516-Fotowiderständen. Bei Fototransistor-Optokopplern und -Relais 4,7-5,1 kOhm liefern. Der Arduino Nano v3.0-Bootloader wurde durch Arduino Uno ersetzt, wobei der TL866A-Programmierer für den korrekten Watchdog-Betrieb verwendet wurde. Die Sicherungen sind so korrigiert, dass sie bei Spannungen über 4,3 V arbeiten. Die externe Rücksetzschaltung R6 C3 wurde nicht verwendet. Im Beispielprogramm entspricht die Senderfrequenz nicht dem nicht lizenzierten Bereich, der 2,4-MHz-Bereich ist auf die Frequenzen 2400,0-2483,5 MHz begrenzt.
Die Senderreichweite des E01-ML01DP05 beträgt 2400-2525 MHz. Die Bandbreite eines Kanals beträgt 1 MHz, wenn die Geschwindigkeit auf "RF24_2MBPS", den angegebenen radio.setChannel (120) -Kanal und den nächsten, d.h. Das Band wird 2 MHz sein.
Fortsetzung