In dem Unternehmen wurden die Überwachungsstationen NEXT-M des heimischen Herstellers „Next Technologies“ angeschafft. Diese dienen der Visualisierung der Funktionsweise der Pumpaggregate,
der Brandmelde- und Einbruchmeldeanlagen, der Spannungsüberwachung an den Schaltern, der Temperatur im Raum sowie des kritischen Wasserstandes. Das Herzstück des NEXt-M ist der ATMEGA 1280, was hinsichtlich der Möglichkeit, ein individuelles Set für spezifische Bedürfnisse zu erstellen, vielversprechend ist.
Die Aufgabe bestand darin, in minimaler Zeit und mit geringen Kosten ein vollständig autarkes System zur lokalen Disposition gemäß spezifischen Anforderungen zu entwickeln. Grundlage ist ein Mikrocontroller. Die Entwicklung und Herstellung erfolgt durch das Personal selbst.
Das System muss unabhängig von Mobilfunknetzen arbeiten. Server, des Internets und Erlaubnissysteme für die Nutzung von Funkfrequenzen, nicht für den Betrieb von Kontroll- und Managementsystemen von Computern oder maximal zeitweiser Nutzung von Laptops ohne Zugang zu den Objekten über längere Zeiträume (6-9 Monate). Die Netzwerkkonfiguration hat eine radiale Struktur. Daten werden an einem Punkt gesammelt und anschließend zur Verarbeitung über gewöhnliche Kommunikationskanäle oder in Form einer physischen Kopie gesendet.
Das System muss Folgendes gewährleisten:
- Überwachung der Pumpensysteme
- Technologische Automatisierung
- Schutz vor den Folgen von Notfallmodi
- Signalisation von Notfallmodi
- Zählung der Betriebszeit
- Zählung des Verbrauchs von Elektrizität
- Überwachung der Gerätetemperatur
- Einbruchmelde- und Brandmeldeanlagen
- Periodischer Remote-Datenabruf
- Unbekannte Anforderungen in der Zukunft
Betriebsbedingungen:
- Abdeckungsgebiet von 1 km².
- Direkte Sichtverbindung zwischen den Objekten
- Temperatur von +50 bis -50 °C
- Luftfeuchtigkeit bis zu 100%
- Biologisch aktive Ablagerungen (Schimmel, sulfatreduzierende Bakterien)
- Vibration, max. Maschinen der Klassen 1-2 gemäß GOST ISO 10816-1-97
- elektromagnetische Umgebung - Steuerung von Elektromotoren mit KT 6053 Kontaktoren, mit RVS-DN sanften Startanlagen und mit SIEMENS MICROMASTER PID-Regeltechnik, Strahlung im ISM- und GSM-Bereich gemäß den Anforderungen an diese Geräte, manuelles Lichtbogenschweißen vor Ort
- Überspannung im Netz, kurzfristige Stromausfälle, Blitzüberspannungen, Phasenverschiebungen bei Kabelbruch in Verteilernetzen von 6-10 kV.
Trotz dieser strengen Anforderungen ist die Umsetzung ganz einfach, wenn die Aufgabe schrittweise gelöst wird.
Unter Berücksichtigung aller Aspekte wurde als „Gehirn“ die Platine „Arduino Nano 3.0“ gewählt. Die Platine von „Robotdyn“ verfügt über den ATMEGA 328 Mikrocontroller, einen notwendigen 3,3 V Spannungsregler für
800 mA und einen CH340G UART-USB-Konverter.
Zunächst wurden Zähler für die Betriebserfassung entwickelt, da diese am aktuellsten sind. Die zuvor verwendeten industriellen Zähler, die auf PICs mit einer nicht-transformierten Stromversorgung basierten, sind aufgrund von Spannungsschwankungen während eines Jahres Betriebs ausgefallen. Einzig die mit selbstgebauten 5V-Netzteilen verbundenen Zähler blieben unbeschädigt. Um die Installation zu beschleunigen und eine universelle Anschlussmöglichkeit zu gewährleisten, wird das Signal über den Zustand der Anlagen von den Anschlüssen der Schaltgeräte abgenommen, d.h. die Registrierung der Präsenz der ersten Phase bei dreiphasiger 380V-Einspeisung. Zur Abstimmung mit dem Controller wird ein Zwischenrelais mit einer Wicklung von 220V oder eine Optokoppler-Kombination aus einer LED und dem Fotowiderstand GL5516 oder dem Optokoppler PC817 verwendet. Alle Varianten wurden in der Praxis getestet. Die LED wird mit gleichgerichtetem Strom versorgt, wobei der Strom dank zwei in Reihe geschalteten, auf 630V ausgelegten Kondensatoren CWB22 begrenzt wird, um bei einer versehentlichen Überprüfung der Schaltkreise mit einem Megohmmeter sicher zu bleiben.
Abfrage der Betriebsstundenzählerstände über das ST7735S LCD-Display, Datenübertragung in Echtzeit über den E01-ML01DP05 Modul bei einer Frequenz von 2,4 MHz. Dieses Gerät enthält den Chip nRF24L01+ und den Senderempfänger RFX2401C,
mit einer Ausgangsleistung von bis zu 100 mW. Die Antennen sind Spiralantennen, die im Online-Rechner für den erforderlichen Frequenzbereich dimensioniert wurden. Die Auswahl des Antennentypen erfolgt zur Vermeidung der Empfangs von einstufig reflektierten Wellen durch umliegende Metallkonstruktionen. Die Antennenteile sind mit einem 3D-Drucker hergestellt. Der aktuelle Zustand der Zähler wird im EEPROM des Controllers gespeichert und bei plötzlichem Stromausfall wiederhergestellt. Die Zeitintervalle für die Zählung werden durch den RTC-Chip DS3231 als Modul mit einer Backup-Batterie bereitgestellt. In der Stromversorgung sind 3 Module eingesetzt, nämlich die Impulsversorgung 220/5V HLK-PM01 600mA, ein Wandler von 1-5V auf 5V. und – ein Akku-Controller, der zum Schutz vor Kurzschluss, Überentladung und Überladung besitzt. Alle Komponenten wurden auf der Aliexpress-Website gekauft.
Breadboard
4-Kanal-Zähler. An den Eingängen befinden sich LC-Filter zum Schutz vor Störungen in der Kommunikationsleitung über Twisted-Pair-Kabel. Die Daten über den Zustand der Überwachungsobjekte werden kontinuierlich einmal pro Sekunde erfasst und farblich auf dem LCD angezeigt. Die Aktualisierung der Werte und die Speicherung im nichtflüchtigen Speicher erfolgt alle 36 Sekunden. 36 Sekunden entsprechen 1/100 Stunde; genau in diesem Format werden die Daten benötigt. Alle 12 Sekunden werden Informationen über die Anzahl der Betriebssekunden für jedes Überwachungsaggregat übertragen. Der EEPROM-Speicher hat eine begrenzte Anzahl von Schreib-/Löschzyklen, laut Hersteller etwa 100.000 Mal. Der schlechteste Fall tritt auf, wenn ständig mindestens eine Zelle aktualisiert wird. Der Speicherbedarf für einen Zähler beträgt 4 Byte; dies entspricht einer Long-Zahl, insgesamt belegen 4 Zähler 16 Byte pro Aufzeichnung. Die Speicherkapazität des Chips beträgt 1024 Byte, nach 64 Aufzeichnungen von 4 Zählern beginnt die Speicherung von vorne. In der EEPROM-Bibliothek führt die Methode EEPROM.put keine Speicherung durch, wenn der Wert der Zelle und die zu schreibenden Informationen übereinstimmen; eine Degradierung der Zellen tritt nicht auf. Somit wird die garantierte Lebensdauer des Speichers mehr als 7 Jahre betragen. Die mögliche, aber nicht garantierte Betriebsdauer kann deutlich länger sein.
Prinzipielle Schematik
Programm in der Arduino IDE//12 328 байт (38%)
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <EEPROM.h>
#include <Wire.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); \/\/ radio-Objekt für die Arbeit mit der RF24-Bibliothek,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time t;
//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // you can also connect this to the Arduino reset
// in which case, set this #define pin to -1!
//#define TFT_DC 9 // DC=RS=A0- варианты обозначений вывода выбора регистра команд или данных.
#define TFT_DC 3
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// Option 2: use any pins but a little slower!
#define TFT_SCLK 13 // set these to be whatever pins you like!
#define TFT_MOSI 11 // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include <avr/wdt.h>
byte shift = 52;
byte pinState;
unsigned long pump[4];\/\/ Array mit 4 Werten für die Sekundenzähler
float m = 3600.0;
unsigned int address = 0;
int rc;\/\/ Variable für die 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 zur Speicherung der Objektzustände, 1 - aus, 0 - ein.
int start = 0; \/\/
void setup() {
rtc.begin();
radio.begin(); \/\/ Initiierung der nRF24L01+ Kommunikation
radio.setChannel(120); \/\/ Datenübertragungskanal (von 0 bis 127).
radio.setDataRate(RF24_250KBPS); \/\/ Datenübertragungsgeschwindigkeit (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 der Leitung mit der Identifikationsnummer für die Datenübertragung
// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.
tft.initR(INITR_BLACKTAB); \/\/ Initialisiere einen ST7735S-Chip, schwarzes Tab
// Use this initializer (uncomment) if you’re using a 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, RED rcB tab
tft.setTextWrap(false); \/\/ Texte dürfen am rechten Rand enden
tft.setRotation(2); \/\/ für schwarze PCBs, und rot tft.setRotation(0) oder nicht.
tft.fillScreen(ST7735_BLACK); \/\/ Bildschirm löschen
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000;\/\/ Programmatische Pull-Up-Widerstände aktiv, hoher Pegel-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.
for (rc = 0; rc < 4; rc++)
{
tft.setCursor(3, rc * 10 + shift); \/\/ Anzeige der Positionen der Kontrollobjekte
tft.print(rc + 1);
}
tft.setCursor(12, 0); \/\/ Ausgabe von 3 Zeilen Text
tft.println («ENTWICKLER & BAUEN» ); // zur Selbstlob
tft.setCursor (24, 10); // oder bösen Copyright
tft.print («ENTWICKLER M.M.»);
tft.setCursor (28, 20);
tft.print («BAU-ER D.D.»);
//восстановление данных/////////////////////////////////////////////////////////
for ( z = 0; z < 1023; z += 16 ) { // durchläuft alle EEPROM-Zellen
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // ohne for-Schleife, weniger Aufwand
EEPROM.get ( z + 4, pump [1]);
EEPROM.get ( z + 8, pump [2]);
EEPROM.get ( z + 12, pump [3]);
// присвоение нового очередного значения суммы 4-x счётчиков
sumprim = (pump [0] + pump [1] + pump [2] + pump [3]);
// сравнивается новое значение суммы 4-х счетчиков в переменной sumprim с предыдущим значением в переменной
// sumsec и если предыдущая сумма меньше или равна новой сумме, присваивается новое большее или равное
// sumsec значение.
if ( sumsec <= sumprim ) {
sumsec = sumprim; //
//и присваивается переменной address текущее значение z, z- это адрес начала блока в 16 байт из 4-х значений
// счетчиков, записанных в одно и то-же время ( т.к. при опросе порта записываются одновременно все его 8 бит,
// в том числе наши нужные старшие 4 бита порта D).
address = z;
}
}
// еще раз обращение к памяти еепром по адресу начала блока в 16 байт из 4-х значений счетчиков записанных
// последними, т.е. значения перед выключением или перезагрузкой по причине зависания. Запись последних
// значений счетчиков в массив из 4-х переменных pump.
EEPROM.get ( address, pump [0]);
EEPROM.get ( address + 4, pump [1]);
EEPROM.get ( address + 8, pump [2]);
EEPROM.get ( address + 12, pump [3]);
address += 16; // Erhöhung der Adresse für den nächsten Schreibblock, ohne die letzten Daten zu überschreiben
// конец восстановления данных////////////////////////////////////////////////////////////////
attachInterrupt(0, count, RISING); // Pin D2, Aktivierung des Interrupts, jede Sekunde
// импульсы от RTC DS3231 с выхода SQW
wdt_enable (WDTO_8S); // Start des Watchdog-Timers, zurücksetzen des Controllers im Falle eines Hängens, Zeit,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.
}
void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}
void count() {
tft.setTextColor(ST7735_WHITE); // Setzen der Schriftfarbe
t = rtc.getTime(); // Lesen der Uhrzeit
tft.setCursor ( 5, 120 ); // Setzen der Cursorposition
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // Bereinigung des Zeitbereichs
tft.print(rtc.getTimeStr()); // Ausgabe der Uhrenanzeigen
wdt_reset(); // Zurücksetzen des Watchdog-Timers jede Schleife, d.h. jede Sekunde
for (rc = 0; rc < 4; rc ++) // Beginn der Schleife zur Überprüfung des Status der Eingänge
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & (b << rc);
if (pumrcounter[rc] != pinState) { // und wenn nicht übereinstimmt, dann
pumrcounter[rc] = pinState; // Zuweisung des Portstatusbits an die Variable mit dem neuen Wert 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == (b << rc)) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // für die Zählung im niedrigen Niveau ändern Sie GREEN auf BLUE
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // für die Zählung im niedrigen Niveau ändern Sie BLUE auf GREEN
pump[rc] += 1; // fügen Sie dem Timerzähler 1 Sekunde hinzu
}
}
k++;
if (k == 36) {
k = 0;
tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // Bereinigung des Zeitnutzungsanzeigebereichs
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // und des Datums
tft.setCursor(60, 120); // Cursorposition festlegen
tft.print(rtc.getDateStr()); // Datum auf dem LCD-Bildschirm ausgeben
for (rc = 0; rc < 4; rc++) // Ausgabe der Arbeitsstunden in ganzen, zehntel und
{
tft.setCursor(30, rc * 10 + shift); // Zeigt nach unten um 10 Pixel für die Stunden auf dem Bildschirm
tft.println(pump[rc] / m);
}
// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////
for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump[rc]);
address += sizeof(float); // Inkrementieren der Speicheradresse
}
}
// отправляем данные по радиоканалу из data указывая сколько байт надо отправить.
if ((k == 6) || (k == 18) || (k == 30)) {
unsigned long data;
radio.write(&start, sizeof(start));
for (i = 0; i < 4; i++) {
data = pump[i];
radio.write(&data, sizeof(data));
}
}
}
Kleine Hinweise zum Schluss. Die Zählung erfolgt bei niedrigem logischen Niveau an den Eingängen.
Der Widerstand R2-R5 beträgt 36 kΩ für die Variante mit GL5516-Fotowiderständen. Bei der Verwendung von Fototransistor-Optokopplern und Relais sollten 4,7-5,1 kΩ eingesetzt werden. Der Arduino Nano v3.0 Bootloader wurde durch einen Arduino Uno mithilfe des TL866A-Programmierers ersetzt, um die ordnungsgemäße Funktion des Watchdog-Timers sicherzustellen. Die Fuses wurden so angepasst, dass sie bei Spannungen über 4,3 V funktionieren. Die externe Reset-Schaltung R6 C3 wurde nicht verwendet. Im Beispielprogramm entspricht die Frequenz des Senders nicht dem lizenzfreien Frequenzbereich; der Bereich bei 2,4 GHz ist auf die Frequenzen 2400,0—2483,5 MHz beschränkt.
Der Frequenzbereich des Senders E01-ML01DP05 liegt zwischen 2400 und 2525 MHz. Die Bandbreite eines Kanals beträgt 1 MHz; bei einer Geschwindigkeitseinstellung von "RF24_2MBPS" wird der angegebene radio.setChannel(120) Kanal sowie der folgende Kanal belegt, d.h. die Bandbreite beträgt 2 MHz.
Quelle: habr.com
