V podjetju so bili kupljeni monitorni sistemi NEXST-M domače proizvodnje "Next Technologies". Za vizualizacijo delovanja črpalnih agregatov,
požarno-varnostne signalizacije, prisotnosti napetosti na zaganjalnikih, temperature v prostoru ter kritične ravni vode. Srce NEXST-M je ATMEGA 1280, kar daje upanje za možnost ustvarjanja lastne rešitve za specifične potrebe.
Naloga je bila, da se v najkrajšem možnem času in z minimalnimi stroški ustvari povsem avtonomen sistem lokalnega usklajevanja za specifične potrebe. Osnova je mikrokrmilnik. Razvoj in izdelava potekata s strani samega osebja.
Sistem mora delovati brez odvisnosti od mobilnih omrežij, strežnikov, interneta in dovolilnega sistema za uporabo radijskih frekvenčnih virov, ne sme uporabljati računalnikov v sistemih nadzora in upravljanja ali pa le občasno prenosne računalnike, brez dostopa do objektov za daljše obdobje (6-9 mesecev). Konfiguracija omrežja ima radialno strukturo. Podatki se zbirajo na eni točki in nato pošiljajo na obdelavo preko običajnih komunikacijskih kanalov ali v obliki fizične kopije.
Sistem mora zagotavljati:
- nadzor delovanja črpalnih enot
- tehnološko avtomatizacijo
- zaščito pred posledicami izrednih razmer
- signalizacijo ob izrednih razmerah
- številčni obračun časa delovanja
- številčni obračun porabljene električne energije
- nadzor temperature opreme
- varnostno-požarno signalizacijo
- periodično daljinsko snemanje informacij
- nepoznane zahteve v prihodnosti
Delovni pogoji:
- teritorij pokritosti 1 kvadratni kilometer.
- neposredna vidljivost med objekti
- temperatura od +50 do -50 C
- vlaga do 100%
- biološki aktivni nanosi (m evida, sulfatne bakterije)
- vibracije, največ, stroji razreda 1-2 po GOST ISO 10816-1-97
- elektromagnetno okolje - preklopanje elektromotorjev s kontaktnimi releji KT 6053, oprema za mehko zagon RVS-DN, oprema za PID-regulacijo SIEMENS MICROMASTER, emisije v ISM in GSM pasu v skladu z zahtevami za te naprave, ročno oblokovanje na objektu
- povišeno napetost omrežja, kratkotrajne prekinitve oskrbe z elektriko, strelne prenapetosti, nerazmerje faz pri pretrganju žice VZ v distribucijskih omrežjih 6-10 kV.
Kljub takšnim strogin zahtevam je izvedba povsem enostavna pri postopnem reševanju naloge.
Ob upoštevanju vsega, je kot 'možgani' zasnovane naprave postala plošča 'Arduino Nano 3.0'. Plošča 'Robotdyn' ima krmilnik ATMEGA 328, potreben stabilizator napetosti 3,3V na
tok 800 mA in pretvornik na CH340G UART-USB.
Najprej so bili ustvarjeni števeci delovanja kot najbolj aktualni. Prej uporabljeni industrijski števci, sestavljeni na PIC-ih z breztransformatorno shemo napajanja, so propadli zaradi sunkov napetosti v enem letu delovanja. Cela so ostala le tista, ki so bila priključena preko samogradnih napajalnikov na napetost 5V. Za pospešitev montaže in vsestranskost priključitve signal o stanju enot prevzamemo z kontaktov komutacijskih naprav, tj. registracija prisotnosti 1. faze napetosti pri trifazni napajanju 380V. Za usklajevanje s krmilnikom se uporablja vmesni rele z navitjem na 220V ali optopara sestavljena iz LED dioda in fotoporozorja GL5516 ali optopara PC817. Vsa varijante so bile preizkušene v delovanju. LED dioda je napajana z enosmerno napetostjo z omejevanjem toka s pomočjo dveh kondenzatorjev SVV22, ki so zasnovani za napetost 630V in so vključeni zaporedno za varnost pri naključnem preverjanju vezij z megaohmetrom.
Preberite podatke o času delovanja s pomočjo LCD zaslona ST7735S, prenos podatkov po radijski povezavi v realnem času s pomočjo modula E01-ML01DP05 na frekvenci 2,4 MHz. To naprava vsebuje čip nRF24L01+ in ojačevalnik sprejema-oddajanja RFX2401C,
izhodna moč do 100 mW. Antene so spiralne, zasnovane za potrebni razpon v spletnem kalkulatorju Izbor tipa antena je odvisen od izključitve sprejema enkrat odsevanih valov od okolij, ki so iz kovinskih konstrukcij. Delci antene so natisnjeni na 3D tiskalniku. Trenutno stanje merilnikov se shrani v EEPROM samega krmilnika in se v primeru nepredvidenega izklopa napajanja obnovi. Časovni intervali za štetje so zagotovljeni s RTC mikročipom DS3231 v obliki modula z baterijo rezervoar. V napajalniku so uporabljeni 3 moduli, impulzno napajanje 220/5V HLK-PM01 600mA, pretvornik iz 1-5V v 5V. in — krmilnik baterij, ki ima zaščite pred kratkim stikom, prenapolnjenjem in prevelikim praznjenjem. Vsi sestavni deli so bili kupljeni na spletnem mestu Aliexpress.
Testna plošča
Štirikanalni merilnik. Na vhodih so LC filtri za zaščito pred motnjami po komunikacijski liniji iz pletene žice. Podatki o stanju nadzorovanih objektov se nenehno berejo 1-krat na sekundo, prikazujejo se z barvo na LCD-ju. Osveževanje podatkov in zapis v energijsko neodvisno pomnilnik poteka vsakih 36 sekund. 36 sekund - to je 1/100 ure, prav v takšnem formatu so potrebni podatki. Vsake 12 sekund se prenaša informacija o številu sekund dela za vsak nadzorni agregat. Pomnilnik EEPROM ima omejeno število ciklov zapisa brisanja, po podatkih proizvajalca, 100000-krat. Najslabša možnost je, da nenehno poteka osveževanje vsaj ene celice. Obseg 1. merilnika je 4 bajte, to je številka formata long, 4 merilniki, skupaj 16 bajtov zaseda en zapis. Dolžina pomnilnika mikrovezja je 1024 bajtov, po 64-ih zapisih 4-ih merilnikov se bo zapis začel znova. V knjižnici EEPROM metoda EEPROM.put ne opravi zapisa, če se vrednost celice in zapisana informacija ujemata, degradacije celic ne bo. Kot rezultat bo čas zagotovljenega delovanja pomnilnika več kot 7 let. Čas možnega, vendar ne zagotovljenega delovanja pa je lahko bistveno daljši.
Principska shema
Program v 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); // objekt radio za delo z knjižnico RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Čas 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]; // niz z 4 vrednostmi merilnikov sekund
float m = 3600.0;
unsigned int address = 0;
int rc; // spremenljivka za merilnike
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // niz za shranjevanje stanj objektov, 1- izkl., 0- vkl.
int start = 0; //
void setup() {
rtc.begin();
radio.begin(); // Začnemo delo nRF24L01+
radio.setChannel(120); // kanal za prenos podataka (od 0 do 127).
radio.setDataRate (RF24_250KBPS); // brzina prenosa podataka (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // snaga predajnika (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Otvaramo cev sa identifikatorom za prenos podataka
// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.
tft.initR(INITR_BLACKTAB); // inicijalizacija ST7735S čipa, crna oznaka
// 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); // Dozvolite tekstu da prelazi desni ivicu
tft.setRotation( 2 ); // za crnu PCB i crvenu tft.setRotation(0) ili ne.
tft.fillScreen(ST7735_BLACK); // čišćenje ekrana
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softversko povlačenje radi, visok nivo-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.
for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // ispis brojeva pozicija objekata kontrole
tft.print ( rc + 1 );
}
tft.setCursor (12, 0); // ispis 3 reda teksta
tft.println ("DEVELOPERS & BUILDER"); // za hvalospeve o sebi
tft.setCursor (24, 10); // ili zloćudni copyright
tft.print ("DEVELOPER M.M.");
tft.setCursor (28, 20);
tft.print ("BUILD-ER D.D.");
//восстановление данных/////////////////////////////////////////////////////////
for ( z = 0; z < 1023; z += 16 ) { // Prolazi kroz sve ćelije EEPROM-a
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // tako, bez for petlje, manji obim
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; // povećavanje adrese za upis sledećeg bloka bez brisanja podataka poslednjeg unosa
// конец восстановления данных////////////////////////////////////////////////////////////////
attachInterrupt(0, count, RISING); // pin D2, dozvola za rad prekida, svaki sekund dolaze
// импульсы от RTC DS3231 с выхода SQW
wdt_enable (WDTO_8S); // pokretanje watchdog tajmera, restartuje kontroler u slučaju zamrzavanja, vreme,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.
}
void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}
void count() {
tft.setTextColor(ST7735_WHITE); // postavljanje boje fonta
t = rtc.getTime(); // čitanje vremena
tft.setCursor ( 5, 120 ); // postavljanje pozicije kursora
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // čišćenje oblasti prikaza vremena
tft.print(rtc.getTimeStr()); // ispis vremena
wdt_reset(); // resetovanje watchdog tajmera svaki ciklus, tj. svake sekunde
for (rc = 0; rc < 4; rc ++) // početak petlje provere usaglašenosti stanja ulaznih
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );
if (pumrcounter [rc] != pinState) { // i ako ne odgovara, onda
pumrcounter [rc] = pinState; // dodeljivanje varijabli stanje bita porta novom vrednosti 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // za brojanje po niskom nivou promeniti ZELENU u PLAVU
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // za brojanje po niskom nivou promeniti PLAVU u ZELENU
pump [rc] += 1; // dodajemo u brojač vreme rada 1 sekundu
}
}
k ++;
if ( k == 36 ) {
k = 0;
tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // čišćenje oblasti prikaza rada vremena
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // in date
tft.setCursor ( 60, 120 ); // set cursor position
tft.print(rtc.getDateStr()); // display date on LCD screen
for (rc = 0; rc < 4; rc++) // display readings of runtime in whole, tenths and
{
tft.setCursor ( 30, rc * 10 + shift ); // in hundredths of an hour with a downward shift of 10 pixels on the screen
tft.println(pump [rc] / m);
}
// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////
for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // increment the address recording variable
}
}
// отправляем данные по радиоканалу из 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));
}
}
}
A few remarks at the end. Counting occurs at a low logic level on the inputs.
Pull-up resistors R2-R5 36 kOhm for the option with GL5516 phototransistors. In case of a phototransistor optocoupler and relay, set 4.7 - 5.1 kOhm. The Arduino Nano v3.0 bootloader has been replaced with an Arduino Uno using the TL866A programmer for the correct operation of the watchdog timer. The fuses have been changed for operation above 4.3 V. The external reset circuit R6 C3 was not used. In the example program, the transmitter frequency does not correspond to the unlicensed range; the frequency range 2.4 MHz is limited to 2400.0—2483.5 MHz.
The transmitter range E01-ML01DP05 is 2400-2525 MHz. The bandwidth of one channel is 1 MHz; when setting the speed to “RF24_2MBPS,” the specified radio.setChannel(120) channel and the next one will be occupied, i.e., the bandwidth will be 2 MHz.
Izvor: habr.com
