Lokaal autonoom systeem voor gegevensverzameling

Op het bedrijf zijn monitoringstations van het binnenlandse merk «Next Technologies» aangeschaft. Deze zijn bedoeld om de werking van pompen te visualiseren,
de brand- en inbraaksystemen, de aanwezigheid van spanning op de starters, de temperatuur in de ruimte en het alarmniveau van het water. Het hart van de NEX-M is de ATMEGA 1280, wat hoopvol is voor de mogelijkheid om een eigen set te creëren voor specifieke behoeften.

De taak was om in de kortst mogelijke tijd en met minimale kosten een volledig autonoom lokaal dispatching systeem te creëren voor specifieke behoeften. De basis is een microcontroller. Ontwikkeling en fabricage gebeurt door het personeel zelf.

Het systeem moet functioneren zonder afhankelijkheid van mobiele netwerken, serversinternet en goedkeuringssystemen voor het gebruik van frequentiebronnen, en mag in de werking van het controle- en beheersysteem geen gebruik maken van computers of maximaal sporadisch laptops gebruiken, zonder toegang tot de objecten gedurende lange tijd (6-9 maanden). Het netwerk heeft een radiale structuur. Gegevens worden op één punt verzameld en vervolgens verzonden voor verwerking via reguliere communicatiemiddelen of in de vorm van fysieke kopieën.

Het systeem moet voorzien in:

  • de controle van de werking van pompinstallaties
  • technologische automatisering
  • bescherming tegen de gevolgen van noodsituaties
  • alarm voor noodsituaties
  • de tijdsregistratie
  • de tellen van het verbruikte elektriciteitsvolume
  • de controle van de temperatuur van apparatuur
  • de brand- en inbraaksignalering
  • periodieke afstandsmeting van informatie
  • onbekende vereisten in de toekomst

Werkomstandigheden:

  • bereikgebied van 1 km².
  • rechter zichtlijn tussen de objecten
  • temperatuur van +50 tot -50 °C
  • vochtigheid tot 100%
  • biologisch actieve afzetting (schimmel, sulfaat-reducerende bacteriën)
  • trillingen, niet meer dan machines van klasse 1-2 volgens GOST ISO 10816-1-97
  • elektromagnetische omgeving - schakeling van elektromotoren met contactoren KT 6053, apparatuur voor zacht starten RVS-DN, PID-reguleringsapparatuur SIEMENS MICROMASTER, straling in het ISM- en GSM-bereik volgens de eisen voor deze apparaten, handmatig booglassen op de locatie
  • verhoogde netspanning, kortstondige onderbrekingen in de stroomvoorziening, bliksemoverspanningen, faseverschuivingen bij het breken van een draad in distributienetwerken van 6-10 kV.

Ondanks deze strenge eisen is de implementatie vrij eenvoudig bij stapsgewijze aanpak van het probleem.

Met alles in overweging werd de "hersenen" van het ontwerp de "Arduino Nano 3.0". Het bord van "Robotdyn" bevat de ATMEGA 328 controller, de benodigde spanningsstabilisator van 3,3V voor
een stroom van 800 mA en de CH340G UART-USB converter.

In de eerste plaats zijn er urenregistratiesystemen ontwikkeld als de meest relevante. Eerder gebruikte industriële tellers, die waren samengesteld uit PIC's met een transformerloos voedingsschema, zijn defect geraakt door spanningspieken gedurende een jaar gebruik. Alleen de apparaten die met zelfgemaakte voedingen van 5V waren aangesloten, bleven intact. Om de installatie te versnellen en de aansluiting universeel te maken, wordt het signaal over de toestand van de apparaten genomen van de aansluitklemmen van de schakelelementen, dat wil zeggen, de registratie van de aanwezigheid van de 1e fase spanning bij driefasige voeding van 380V. Voor de afstemming met de controller wordt een tussenrelais met een spoel van 220V of een optokoppelaar die uit een LED en een GL5516 fotoreistor bestaat, gebruikt. Alle opties zijn in de praktijk getest. De LED wordt gevoed met gelijkspanning met stroombeperking door middel van twee SBB22-condensatoren die zijn ontworpen voor een spanning van 630V, die in serie zijn aangesloten voor de veiligheid bij een toevallige controle van de circuits met een megohmmeter.
Het uitlezen van de bedrijfstijdgegevens met behulp van een ST7735S LCD-scherm, de overdracht van gegevens via een radiokanaal in realtime met behulp van de E01-ML01DP05 module op een frequentie van 2,4 GHz. Deze apparaten bevatten de nRF24L01+ chip en de transmissie-ontvangstantenne RFX2401C,
met een uitgangsvermogen tot 100 mW. De antennes zijn spiraalvormig en zijn ontworpen voor de vereiste frequentie met behulp van een online calculator websiteDe keuze van het type antennes is gebaseerd op de uitsluiting van de ontvangst van eenmalig gereflecteerde golven van omringende metalen constructies. De onderdelen van de antennes zijn afgedrukt op een 3D-printer. De huidige toestand van de tellers wordt opgeslagen in de EEPROM van de controller en kan in geval van een onverwachte stroomonderbreking worden hersteld. Tijdintervallen voor de telling worden geleverd door de RTC-chip DS3231 in de vorm van een module met een reservebatterij. In de voeding zijn 3 modules toegepast: een impulsbron 220/5V HLK-PM01 600mA, een omzetter van 1-5V naar 5V. HW-553 en 03962A — een accubeheermodule die heeft een schema voor bescherming tegen kortsluiting, diepontlading en overladen. Alle componenten zijn aangeschaft op de website Aliexpress.

PrototypingboardLokaal autonoom systeem voor gegevensverzameling
4-kanaals teller. Op de ingangen staan LC-filters ter bescherming tegen interferenties via de communicatiedraad van twisted pair. Gegevens over de toestand van de controleobjecten worden continu elke seconde gelezen en worden in kleur weergegeven op het LCD. De actualisering van de gegevens en de opslag in niet-vluchtige geheugens gebeurt elke 36 seconden. 36 seconden is 1/100 uur, precies in dit formaat zijn de gegevens vereist. Elke 12 seconden wordt de informatie over de tijdsduur van de werking voor elk controlesysteem verzonden. Het EEPROM-geheugen heeft een beperkt aantal schrijf- en wiscycli, volgens de fabrikant, 100.000 keer. Het slechtste geval is wanneer ten minste één cel voortdurend wordt bijgewerkt. De grootte van 1 teller is 4 bytes, dit is een getal in long-formaat, 4 tellers, in totaal 16 bytes voor één registratie. De lengteeenheid van de chip is 1024 bytes; na 64 registraties van 4 tellers begint de registratie opnieuw. In de EEPROM-bibliotheek voert de methode EEPROM.put geen registratie uit als de waarde van de cel en de te schrijven informatie overeenkomen; er zal geen degradatie van de cellen zijn. Uiteindelijk zal de gegarandeerde levensduur van het geheugen meer dan 7 jaar zijn. De tijd die mogelijk is, maar niet gegarandeerd, kan veel langer zijn.

Principiële schemaLokaal autonoom systeem voor gegevensverzameling
Programma in 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-object voor het werken met de RF24-bibliotheek,
// и номера выводов 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 met 4 waarden van tellers in seconden
float m = 3600.0;
unsigned int address = 0;
int rc;// variabele voor tellers
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 voor het opslaan van de toestanden van de objecten, 1 - uit, 0 - aan.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Start de werking van nRF24L01+
radio.setChannel(120); // gegevensoverdracht kanaal (van 0 tot 127).
radio.setDataRate (RF24_250KBPS); // gegevensoverdracht snelheid (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // zendvermogen (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Open de buis met de identifier voor gegevensoverdracht

// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.

tft.initR(INITR_BLACKTAB); // initialiseer een ST7735S-chip, zwarte 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); // Sta tekst toe om voorbij de rechterrand te lopen
tft.setRotation(2); // voor ZWARTE PCB en RODE tft.setRotation(0) of geen.
tft.fillScreen(ST7735_BLACK); // scherm wissen

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softwarematige Pull-up actief, hoog niveau-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for (rc = 0; rc < 4; rc++)
{
tft.setCursor(3, rc * 10 + shift); // weergave van de posities van controleobjecten
tft.print(rc + 1);
}

tft.setCursor(12, 0); // weergave van 3 regels tekst
tft.println("DEVELOPERS & BUILD"); // voor zelfverheerlijking
tft.setCursor(24, 10); // of kwaadaardige copyright
tft.print("DEVELOPER M.M.");
tft.setCursor(28, 20);
tft.print("BUILD-ER D.D.");

//восстановление данных/////////////////////////////////////////////////////////

for (z = 0; z < 1023; z += 16) { // Loop door alle EEPROM-cellen
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get(z, pump[0]); // zo, zonder for-loop, minder volume
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; // adresverhoging voor het schrijven van het volgende blok zonder de laatste gegevens te overschrijven

// конец восстановления данных////////////////////////////////////////////////////////////////

attachInterrupt(0, count, RISING); // pin D2, inschakelen van interrupt functie, elke seconde komen ze binnen
// импульсы от RTC DS3231 с выхода SQW

wdt_enable(WDTO_8S); // starten van de watchdog timer, reset de controller bij vastlopers, tijd,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}

void count() {

tft.setTextColor(ST7735_WHITE); // instellen van de tekstkleur
t = rtc.getTime(); // tijd uitlezen
tft.setCursor(5, 120); // instellen van de cursorpositie
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // gebied voor tijdsuitvoer wissen
tft.print(rtc.getTimeStr()); // weergave van het tijdsresultaat

wdt_reset(); // reset de watchdog timer elke cyclus, dus elke seconde

for (rc = 0; rc < 4; rc++) // begin van de cyclus voor het controleren van de status van de ingangen
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter[rc] != pinState) { // en als het niet overeenkomt, dan
pumrcounter[rc] = pinState; // toewijzing van de variabele status van de poortbit nieuw waarde 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == (b << rc)) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // voor telling op laag niveau, verander GREEN naar BLUE
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // voor telling op laag niveau, verander BLUE naar GREEN
pump[rc] += 1; // voeg 1 seconde toe aan de werktijd teller
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // gebied voor werktijd uitschakelen
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // en datum

tft.setCursor ( 60, 120 ); // cursorpositie instellen
tft.print(rtc.getDateStr()); // datum op het LCD-scherm weergeven

for (rc = 0; rc < 4; rc ++) // weergeven van de werkingswaarden in gehele, tiende en
{
tft.setCursor ( 30, rc * 10 + shift ); // honderdelen van een uur met een verschuiving van 10 pixels naar beneden op het scherm
tft.println(pump [rc] / m);
}

// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////

for (rc = 0; rc < 4; rc ++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // incrementeer de schrijfsnelheidsvariabele
}
}

// отправляем данные по радиоканалу из 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 opmerkingen aan het einde. De telling begint bij een laag logisch niveau op de ingangen.

De pull-up weerstanden R2-R5 zijn 36 kΩ voor de variant met fotoweerstanden GL5516. In het geval van een fototransistor optocoupler en relais, gebruik 4,7- 5,1 kΩ. De bootloader van de Arduino Nano v3.0 is vervangen door de Arduino Uno met een TL866A programmeerder voor een correcte werking van de watchdogtimer. De fuses zijn aangepast voor werking bij een spanning boven 4,3 V. De externe resetcircuits R6 C3 werden niet gebruikt. In het programma voorbeeld komt de frequentie van de zender niet overeen met het niet-gelicentieerde bereik, het bereik van 2,4 GHz is beperkt tot frequenties van 2400,0—2483,5 MHz.

Het zenderbereik E01-ML01DP05 bedraagt 2400- 2525 MHz. De bandbreedte van één kanaal is 1 MHz, bij een snelheid ingesteld als "RF24_2MBPS" wordt het aangegeven radio.setChannel(120) kanaal en het volgende bezet, dat wil zeggen de bandbreedte zal 2 MHz zijn.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster