Lokales autonomes Datenerfassungssystem

Das Unternehmen kaufte NEKST-M-Überwachungsposten, die im Inland von Next Technologies hergestellt wurden. Um die Visualisierung des Betriebs von Pumpeinheiten zu gewährleisten,
Feuer- und Sicherheitsalarme, Spannungsanliegen an den Anlassern, Raumtemperatur, Notwasserstand. Das Herzstück von NEKST-M ist ATMEGA 1280 und diese Tatsache ist ermutigend im Hinblick auf die Möglichkeit, ein eigenes Kit für spezifische Anforderungen zu erstellen.

Die Aufgabe bestand darin, in kürzester Zeit und mit minimalen Kosten ein vollständig autonomes lokales Versandsystem für spezifische Anforderungen zu schaffen. Die Basis ist ein Mikrocontroller. Entwicklung, Fertigung, durch die Mitarbeiter selbst erstellt.

Das System muss unabhängig von Mobilfunknetzen, Servern, dem Internet und dem Lizenzierungssystem für die Nutzung von Hochfrequenzressourcen funktionieren, darf für den Betrieb des Überwachungs- und Steuerungssystems keine Computer verwenden und darf höchstens in regelmäßigen Abständen Laptops ohne Zugriff darauf verwenden Objekte für eine lange Zeit (6-9 Monate). Die Netzwerkkonfiguration hat eine radiale Struktur. Die Daten werden an einem Punkt erfasst und dann über reguläre Kommunikationskanäle oder in Papierform zur Verarbeitung gesendet.

Das System muss Folgendes bieten:

  • Überwachung des Betriebs von Pumpeinheiten
  • technologische Automatisierung
  • Schutz vor den Folgen von Notfällen
  • Notsignalisierung
  • Betriebszeitberechnung
  • Berechnung der verbrauchten Strommenge
  • Temperaturregelung der Ausrüstung
  • Sicherheit und Feueralarm
  • regelmäßige Fernaufzeichnung von Informationen
  • unbekannte zukünftige Anforderungen

Betriebsbedingungen:

  • Abdeckungsbereich 1 km².
  • direkte Sichtbarkeit zwischen Objekten
  • Temperatur von +50 bis -50 C
  • Luftfeuchtigkeit bis 100 %
  • biologisch aktive Ablagerungen (Schimmel, sulfatreduzierende Bakterien)
  • Vibration, nicht mehr, von Maschinen der Klassen 1-2 gemäß GOST ISO 10816-1-97
  • elektromagnetische Umgebung – Schalten von Elektromotoren mit KT 6053-Schützen, RVS-DN-Softstartausrüstung, SIEMENS MICROMASTER PID-Regelungsausrüstung, Strahlung im ISM- und GSM-Bereich gemäß den Anforderungen für diese Geräte, manuelles Lichtbogenschweißen vor Ort
  • Überhöhte Netzspannung, kurzfristige Unterbrechungen der Stromversorgung, Blitzüberspannungen, Phasenungleichgewicht bei Bruch einer Freileitung in 6-10-kV-Verteilungsnetzen.

Trotz dieser hohen Anforderungen ist die Umsetzung recht einfach, wenn das Problem Schritt für Schritt gelöst wird.

Unter Berücksichtigung aller Aspekte wurde das „Arduino Nano 3.0“-Board zum „Gehirn“ des Plans. Das Robotdyn-Board verfügt über einen ATMEGA 328-Controller, den notwendigen 3,3-V-Spannungsstabilisator für
Strom 800 mA und Konverter zu CH340G UART-USB.

Zunächst wurden als modernste Betriebsstundenzähler geschaffen. Früher verwendete Industriezähler, die auf PICs mit transformatorlosem Stromversorgungskreis aufgebaut waren, fielen aufgrund von Spannungsspitzen innerhalb eines Jahres nach dem Betrieb aus. Nur diejenigen, die über selbstgebaute 5-V-Netzteile angeschlossen wurden, blieben intakt. Um die Installation zu beschleunigen und die Anschlussvielfalt zu erhöhen, wird von den Klemmen der Schaltgeräte ein Signal über den Zustand der Geräte abgenommen, d.h. Registrierung des Vorhandenseins der 1. Phasenspannung bei einer dreiphasigen Stromversorgung von 380 V. Zur Koordination mit der Steuerung wird ein Zwischenrelais mit 220-V-Wicklung oder ein Optokoppler bestehend aus einer LED und einem GL5516-Fotowiderstand oder ein PC817-Optokoppler verwendet. Alle Optionen wurden getestet. Die LED wird mit einer gleichgerichteten Spannung mit Strombegrenzung betrieben, wobei zwei SVV22-Kondensatoren verwendet werden, die für eine Spannung von 630 V ausgelegt sind und zur Sicherheit bei versehentlicher Prüfung der Stromkreise mit einem Megaohmmeter in Reihe geschaltet sind.
Ablesen der Betriebszeitwerte über den LCD-Bildschirm ST7735S, Echtzeit-Datenübertragung per Funk über das Modul E01-ML01DP05 mit einer Frequenz von 2,4 MHz. Dieses Gerät enthält den nRF24L01+ Chip und den RFX2401C Sende-/Empfangsverstärker,
Ausgangsleistung bis zu 100 mW. Auf die gewünschte Reichweite ausgelegte Wendelantennen im Online-Rechner Standort. Die Wahl des Antennentyps wird durch den Ausschluss des Empfangs einfach reflektierter Wellen von umgebenden Metallstrukturen bestimmt. Antennenteile werden auf einem 3D-Drucker gedruckt. Der aktuelle Stand der Zähler wird im EEPROM der Steuerung selbst gespeichert und bei einem unerwarteten Stromausfall wiederhergestellt. Zeitintervalle zum Zählen werden vom RTC-Chip DS3231 in Form eines Moduls mit Pufferbatterie bereitgestellt. Die Stromversorgung erfolgt über 3 Module, die eigentliche Impulsquelle 220/5V HLK-PM01 600mA, einen Wandler von 1-5V auf 5V HW-553 и 03962A - Batterieregler mit Muster Schutz vor Kurzschluss, Tiefentladung und Überladung. Alle Komponenten wurden auf der Aliexpress-Website gekauft.

BrotbrettLokales autonomes Datenerfassungssystem
4-Kanal-Zähler. An den Eingängen befinden sich LC-Filter zum Schutz vor Störungen über eine Twisted-Pair-Kommunikationsleitung. Daten zum Zustand der Steuerobjekte werden ständig einmal pro Sekunde ausgelesen und farbig auf dem LCD angezeigt. Die Messwerte werden alle 1 Sekunden aktualisiert und im nichtflüchtigen Speicher aufgezeichnet. 36 Sekunden sind 36/1 einer Stunde. Dies ist das Format, in dem die Daten benötigt werden. Alle 100 Sek. Für jedes Steuergerät werden Informationen über die Anzahl der Betriebssekunden übermittelt. EEPROM-Speicher haben eine begrenzte Anzahl von Schreib-Lösch-Zyklen, laut Hersteller 12 Mal. Die schlechteste Option ist, wenn mindestens eine Zelle ständig aktualisiert wird. Das Volumen des 100000. Zählers beträgt 1 Bytes, dies ist eine Zahl im Langformat, 4 Zähler, insgesamt werden 4 Bytes von einem Datensatz belegt. Die Speicherlänge des Chips beträgt 16 Byte; nach 1024 Einträgen von 64 Zählern beginnt die Aufzeichnung von vorne. In der EEPROM-Bibliothek schreibt die Methode EEPROM.put nicht; wenn der Wert der Zelle und die geschriebenen Informationen übereinstimmen, kommt es zu keiner Verschlechterung der Zellen. Dadurch beträgt die garantierte Speicherbetriebszeit mehr als 4 Jahre. Die Zeit möglicher, aber nicht garantierter Arbeiten kann deutlich länger sein.

SchaltplanLokales autonomes Datenerfassungssystem
Programm in der Arduino IDE//12 Bytes (328 %)

#enthalten // Kerngrafikbibliothek
#enthalten // Hardwarespezifische Bibliothek
#einschließen
#enthalten
#einschließen
#enthalten
#enthalten
RF24-Funk (9, 10); // Funkobjekt für die Arbeit mit der RF24-Bibliothek,
// und Pin-Nummern nRF24L01+ (CE, CSN)
#enthalten
DS3231 RTC (SDA, SCL);
Zeit t;

//#define 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!
//#define TFT_DC 9 // DC=RS=A0 - Bezeichnungsoptionen zur Auswahl eines Befehls oder Datenregisters.
#define TFT_DC 3

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// Option 2: beliebige Pins verwenden, aber etwas langsamer!
#define TFT_SCLK 13 // Stellen Sie diese auf beliebige Pins ein!
#define TFT_MOSI 11 // Stellen Sie diese auf beliebige Pins ein!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#enthalten

Byteverschiebung = 52;
Byte pinState;
unsigned long pump[4];// Array mit 4-Sekunden-Zählerwerten
float m = 3600.0;
vorzeichenlose int-Adresse = 0;
int rc;// Variable für Zähler
unsigned long sumprim = 0;
unsigned long sumsec = 0;
Byte i = 0;
Byte k = 34;
unsigned int z = 0;
Byte b = B00000001;
Byte Pumrcounter[4]; // Array zum Speichern von Objektzuständen, 1 – aus, 0 – ein.
int start = 0; //

void setup () {

rtc.begin();
radio.begin(); // Arbeit einleiten nRF24L01+
radio.setChannel(120); // Datenkanal (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=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Öffnen Sie eine Pipe mit einem Bezeichner für die Datenübertragung

// Um ​​die Zeit festzulegen, entkommentieren Sie die erforderlichen Zeilen
//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 Registerkarte
// Verwenden Sie diesen Initialisierer (auskommentieren), wenn Sie ein 1.44-Zoll-TFT verwenden
//tft.initR(INITR_144GREENTAB); // Initialisiere einen ST7735S-Chip, ROTE rcB-Registerkarte
tft.setTextWrap(false); // Text über den rechten Rand hinauslaufen lassen
tft.setRotation( 2 ); // für SCHWARZES PCB und ROT tft.setRotation(0) oder nicht.
tft.fillScreen(ST7735_BLACK); // Bildschirm löschen

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // Software-Verschärfung funktioniert, hohes Niveau -
// kontrollierte Objekte „funktionieren nicht“, „4“ wird auf alle 1 Senior-Ports D geschrieben, es erfolgt keine Zählung.

für ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + Shift ); // Positionsnummern von Kontrollobjekten anzeigen
tft.print(rc + 1);
}

tft.setCursor(12, 0); // 3 Textzeilen ausgeben
tft.println("ENTWICKLER & BAUEN"); // um dich selbst zu loben, deine Lieben
tft.setCursor(24, 10); // oder böses Urheberrecht
tft.print("ENTWICKLER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//Datenwiederherstellung////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Iteriert durch alle Zellen der Branche
//und schreibt in ein Array von 4 Pumpenvariablen, 4 Bytes für jeden Zähler, weil
// vorzeichenlose lange Variable. Es gibt 4 Zähler, ein Datensatz aller 4 benötigt 16 Bytes.
EEPROM.get(z, pump[0]); // also, ohne die for-Schleife, weniger Volumen
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// Zuweisen eines neuen nächsten Werts für die Summe von 4 Zählern
sumprim = (Pumpe [0] + Pumpe [1] + Pumpe [2] + Pumpe [3]);

// vergleicht den neuen Wert der Summe von 4 Zählern in der Sumprim-Variablen mit dem vorherigen Wert in der Variablen
// sumsec und wenn die vorherige Summe kleiner oder gleich der neuen Summe ist, wird die 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 am Anfang eines 16-Byte-Blocks mit 4 Werten
// gleichzeitig aufgezeichnete Zähler (da beim Polling eines Ports alle 8 Bits davon gleichzeitig geschrieben werden,
// einschließlich unserer notwendigen hohen 4 Bits von Port D).
Adresse = z;
}
}

// erneuter Zugriff auf den EEPROM-Speicher an der Adresse des Anfangs eines Blocks von 16 Bytes mit 4 aufgezeichneten Zählerwerten
// zuletzt, d.h. Werte vor dem Herunterfahren oder Neustarten aufgrund eines Einfrierens. Aufnahme der neuesten
// Zählerwerte in ein Array mit 4 Variablen pumpen.

EEPROM.get(address, pump[0]);
EEPROM.get(address + 4, pump[1]);
EEPROM.get(address + 8, pump[2]);
EEPROM.get(address + 12, pump[3]);

Adresse += 16; //Erhöhen der Adresse zum Schreiben des nächsten Blocks, ohne die Daten des letzten Datensatzes zu überschreiben

//Ende der Datenwiederherstellung/////////////////////////////////////////////////////////////////// //////////////////

attachmentInterrupt(0, count, RISING); // Pin D2, Interrupts aktivieren, kommen jede Sekunde
// Impulse von RTC DS3231 vom SQW-Ausgang

wdt_enable(WDTO_8S); // Watchdog-Timer starten, Controller neu starten, falls einfriert, Zeit,
// für den Sie den Timer-Reset-Befehl wdt_reset( ausgeben und einen Neustart während des normalen Betriebs vermeiden müssen – 8 Sek.
// Für Tests wird nicht empfohlen, den Wert auf weniger als 8 Sekunden einzustellen. In diesem Fall wird der Timer vorzugsweise zurückgesetzt
// ruckelt, und das passiert jede Sekunde.

}

void loop () {
// Leerzyklus, hier erfolgt die Steuerung des Leerlaufbetriebs des Elektromotors
}

Void count() {

tft.setTextColor(ST7735_WHITE); // Schriftfarbe festlegen
t = rtc.getTime(); // Lesezeit
tft.setCursor(5, 120); // Setzen der Cursorposition
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // Löschen des Zeitausgabebereichs
tft.print(rtc.getTimeStr()); // Uhrwerte ausgeben

wdt_reset(); // Den Watchdog jeden Zyklus zurücksetzen, d. h. jede Sekunde

for (rc = 0; rc < 4; rc ++) // Beginn des Zyklus zur Überprüfung der Übereinstimmung des Eingabezustands
// Port-Bits auf den vorherigen Lesezustand der Port-D-Bits
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // und wenn nicht übereinstimmt, dann
pumrcounter[rc] = pinState; // Der Port-Bit-Statusvariablen einen neuen Wert 1/0 zuweisen
}
// Anzeige des Zustands von Farbkontrollobjekten
// BLAU ist ein kleiner Fehler des vorhandenen Bildschirms (oder der Bibliothek?), RGB und BGR sind verwechselt.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + Shift)), 7, 7, ST7735_BLUE); // für die Zählung auf niedriger Ebene GRÜN in BLAU ändern
} Else {
tft.fillRect(15, ((rc * 10 + Shift)), 7, 7, ST7735_GREEN); // für Low-Level-Zählung ändern Sie BLAU zu GRÜN
Pumpe [rc] += 1; // 1 Sekunde zum Betriebszeitzähler hinzufügen
}
}

k++;
if (k == 36) {
k = 0;

tft.fillRect(30, Shift, 97, 40, ST7735_BLACK); // Löschen des Betriebszeitanzeigebereichs
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // und Daten

tft.setCursor(60, 120); // Setzen der Cursorposition
tft.print(rtc.getDateStr()); // Anzeige des Datums auf dem LCD-Bildschirm

for (rc = 0; rc < 4; rc ++) //Betriebsstunden im Ganzen, Zehntel und ausgeben
{
tft.setCursor ( 30, rc * 10 + Shift ); // Hundertstel einer Stunde mit einer Bildschirmverschiebung um 10 Pixel nach unten
tft.println(pump [rc] / m);
}

// „rohe“ Betriebsstundenwerte (in Sekunden) ins EEPROM schreiben ////////////////////////////

für (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump [rc]);
Adresse += sizeof(float); // Erhöhe die Schreibadressvariable
}
}

// Daten über den Funkkanal senden aus Daten, 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++) {
data = pump [i];
radio.write( &data, sizeof( data));
}
}
}

Ein paar Anmerkungen zum Schluss. An den Eingängen erfolgt die Zählung auf einem niedrigen logischen Pegel.

Die Pull-up-Widerstände R2-R5 betragen 36 kOhm für die Option mit Fotowiderständen GL5516. Im Falle eines Fototransistor-Optokopplers und eines Relais auf 4,7–5,1 kOhm einstellen. Der Arduino Nano v3.0-Bootloader wurde durch den Arduino Uno ersetzt, wobei der TL866A-Programmierer für den korrekten Betrieb des Watchdog-Timers verwendet wurde. Die Sicherungen sind so korrigiert, dass sie bei Spannungen über 4,3 V funktionieren. Der externe Reset-Schaltkreis R6 C3 wurde nicht verwendet. Im Beispielprogramm entspricht die Senderfrequenz nicht dem freien Bereich, der 2,4-MHz-Bereich ist auf die Frequenzen 2400.0-2483.5 MHz beschränkt.

Der Bereich des Senders E01-ML01DP05 beträgt 2400-2525 MHz. Die Bandbreite eines Kanals beträgt 1 MHz, bei der Geschwindigkeitseinstellung „RF24_2MBPS“ wird der angegebene radio.setChannel(120)-Kanal und der nächste belegt, d.h. Das Band wird 2 MHz betragen.

Source: habr.com

Kommentar hinzufügen