A vállalat megvásárolta a NÉKST-M monitorozó állomásokat, a hazai "Nékt Technológia" gyártásából. A szivattyúaggregátok működésének vizualizálására,
tűz- és vagyonvédelmi jelzések, a kapcsolók áramellátásának ellenőrzése, a helyiség hőmérséklete, a víz vészhelyzeti szintjének megfigyelése. A NÉKST-M szíve az ATMEGA 1280, és ez a tény elgondolkodtatott a saját készlet létrehozásának lehetőségén, a konkrét igényekhez.
A feladat az volt, hogy a lehető legrövidebb időn belül és minimális költségek mellett teljesen autonóm helyi diszpécserrendszert hozzunk létre a konkrét igényeknek megfelelően. Az alap egy mikrokontroller. A fejlesztést és gyártást a személyzet saját erejével végzi.
A rendszernek függetlenül kell működnie a mobilhálózatoktól, szerverek, az internettől és a rádiófrekvenciás erőforrások felhasználásának engedélyező rendszerétől, nem használhat számítógépeket a vezérlési és irányítási rendszerekben, legfeljebb alkalmi használatra laptopokkal, anélkül, hogy hosszú időre (6-9 hónap) hozzáférést nyerne az objektumokhoz. A hálózat konfigurációja radiális struktúrájú. Az adatok egy pontban gyűjtődnek, és aztán normál kommunikációs csatornákon vagy szilárd másolat formájában kerülnek feldolgozásra.
A rendszernek biztosítania kell:
- a szivattyúberendezések működésének ellenőrzését
- a technológiai automatizálást
- a baleseti üzemmódok következményeinek védelmét
- a baleseti üzemmódok jelzését
- a munkabejárati idő számítását
- a felhasznált villamosenergia mennyiségének számítását
- és a berendezések hőmérsékletének ellenőrzését
- tűzvédelmi jelzések biztosítása
- időszakos távoli információgyűjtést
- jövőbeli ismeretlen követelményeket
Működési feltételek:
- terület lefedettség 1 négyzetkilométer.
- közvetlen látótávolság az objektumok között
- hőmérséklet +50 és -50 °C között
- 100%-ig terjedő páratartalom
- biológiailag aktív lerakódások (penész, szulfát-reduktáló baktériumok)
- rezgés, legfeljebb az ISO 10816-1-97 szerinti 1-2 osztályú gépek
- elektromágneses környezet - az elektromotorok kapcsolása a KCT 6053 relékkel, RVS-DN lágyindító berendezéssel, SIEMENS MICROMASTER PID-vezérlő berendezéssel, az ISM és GSM sávokban az ezen eszközökre vonatkozó követelmények szerint, manuális ívhegesztés a helyszínen
- túl magas hálózati feszültség, rövid idejű áramkimaradások, villámlásból származó túlfeszültségek, fáziskülönbség egy vezeték megszakadása esetén 6-10 kV elosztóhálózatokban.
A szigorú követelmények ellenére a megvalósítás teljesen egyszerű a feladat lépésről lépésre történő megoldása esetén.
Mindezek figyelembevételével az elképzelés „agya” az „Arduino Nano 3.0” tábla lett. A „Robotdyn” táblának ATMEGA 328 vezérlője van, amelyhez szükséges 3,3 V feszültségszabályozó,
800 mA árammal és egy CH340G UART-USB konverter.
Elsősorban az üzemórák számlálói készültek el, mivel ezek voltak a legaktuálisabbak. A korábban használt ipari számlálók, amelyek PIC-eken alapultak, és transzformátor nélküli tápellátási sémával rendelkeztek, tönkrementek a feszültségingadozások miatt egy év működés során. Csak azok maradtak épek, amelyeket házilag készített 5V-os tápegységekhez csatlakoztattak. A gyorsabb telepítés és a csatlakoztathatóság érdekében az aggregátumok állapotáról szóló jelet a kapcsolási berendezések kapcsaiból veszik, azaz a 380V-os háromfázisú táplálás 1. fázisának feszültségének a jelenlétét regisztrálják. A vezérlővel való összhang érdekében köztes relét használnak 220V tekercseléssel, vagy optopárt, amely LED-ből és GL5516 fényellenállásból vagy RC817 optopárból áll. Minden lehetőséget teszteltek. A LED-et egyenárammal táplálják, áramkorlátozással két, 630V feszültségre tervezett, sorba kötött CBB22 kondenzátorral, a véletlen áramkör-ellenőrzések védelme érdekében.
Az üzemóra-értékek leolvasása ST7735S LCD képernyőn keresztül, az adatok valós időben történő átvitele E01-ML01DP05 modul segítségével 2,4 GHz-en. Ez az eszköz nRF24L01+ chipet és az RFX2401C vétel-átvitel erősítőt tartalmaz,
kimeneti teljesítmény akár 100 mW. Az antennák spirálisak, a szükséges frekvenciatartományban online kalkulátorral számítva. . Az antenna típusának kiválasztása a környező fém szerkezetekről visszaverődő hullámok vételének kizárásával történik. Az antenna elemei 3D nyomtatón készülnek. A számlálók aktuális állapota az EEPROM-ban tárolódik, és váratlan áramkimaradás esetén visszaállítható. Az időintervallumokat a DS3231 RTC chip biztosít, amely elemről működő modulnak számít. A tápegységben 3 modul található: az impulzusos tápegység 220/5V HLK-PM01 600mA és egy 1-5V-ból 5V-ra történő átalakító. és — egy akkumulátor vezérlő, amely tartalmaz rövidzárlat, túlmerülés és túltöltés elleni védelemmel. Minden alkatrészt az Aliexpress weboldalon vásároltak.
Prototípus lap
4-csatornás számláló. A bemeneteken LC szűrők találhatók a kábeles kommunikációs vonal zavarainak védelmére. Az ellenőrzött objektumok állapotadatait folyamatosan, másodpercenként egyszer olvassák be, és színkódolt módon jelenítik meg az LCD-n. Az adatok frissítése és energiafüggetlen memóriába történő írás minden 36 másodpercben történik. A 36 másodperc - ez 1/100 óra, pontosan ilyen formátumban szükségesek az adatok. Minden 12 másodpercben információt küldenek az egyes ellenőrző egységek működési idejéről. Az EEPROM memóriának korlátozott számú írási-törlési ciklusa van – a gyártó adatai szerint 100000 alkalom. A legrosszabb forgatókönyv, ha folyamatosan frissítik legalább egy cellát. Az 1. számláló mérete 4 bájt, ami long formátumú szám, 4 számlálónál összesen 16 bájtot foglal el egy írás. A chip memória hossza 1024 bájt, 64 írás után a 4 számláló írása újra kezdődik. Az EEPROM könyvtárban az EEPROM.put módszer nem végez írást, ha a cella értéke és az írt információ megegyezik, az cellák degradálódása nem fog bekövetkezni. Ennek eredményeként a memória garantált élettartama több mint 7 év lesz. A lehetséges, de nem garantált üzemidő ennél sokkal hosszabb is lehet.
Elvári séma
Program az Arduino IDE-ben//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); // rádió objektum az RF24 könyvtárral való munkához,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Idő 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]; // tömb 4 számláló másodperceivel
float m = 3600.0;
unsigned int address = 0;
int rc; // változó a számlálókhoz
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter [4]; // tömb az objektumok állapotának tárolására, 1- kikapcsolva, 0- bekapcsolva.
int start = 0; //
void setup() {
rtc.begin();
radio.begin(); // Az nRF24L01+ működésének inicializálása
radio.setChannel(120); // adatátviteli csatorna (0-tól 127-ig).
radio.setDataRate(RF24_250KBPS); // adatátviteli sebesség (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // adó teljesítmény (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Adatátvitelhez az azonosítóval rendelkező cső megnyitása
// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.
tft.initR(INITR_BLACKTAB); // ST7735S chip inicializálása, fekete fül
// 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); // Engedélyezi, hogy a szöveg a jobb szélén túl fusson
tft.setRotation(2); // Fekete PCB-hez és piros tft.setRotation(0) vagy nem.
tft.fillScreen(ST7735_BLACK); // Képernyő törlése
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // a szoftveres felfelé húzás működik, magas szint-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.
for (rc = 0; rc < 4; rc++)
{
tft.setCursor(3, rc * 10 + shift); // Ellenőrző objektumok pozícióainak számának kiírása
tft.print(rc + 1);
}
tft.setCursor(12, 0); // Három sor szöveg kiírása
tft.println("DEVELOPERS & BUILD"); // Hogy fényezzük magunkat
tft.setCursor(24, 10); // vagy a gonosz szerzői jogra
tft.print("DEVELOPER M.M.");
tft.setCursor(28, 20);
tft.print("BUILD-ER D.D.");
//восстановление данных/////////////////////////////////////////////////////////
for (z = 0; z < 1023; z += 16) { // Minden EEPROM cella átvizsgálása
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get(z, pump[0]); // így, ciklus nélkül, kevesebb a tér
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; // a következő blokk írása előtt az adatokat nem törölve
// конец восстановления данных////////////////////////////////////////////////////////////////
attachInterrupt(0, count, RISING); // pin D2, megszakítás engedélyezése, másodpercenként jönnek
// импульсы от RTC DS3231 с выхода SQW
wdt_enable(WDTO_8S); // őrzőidőzítő indítása, újraindítja a vezérlőt felfüggesztés esetén, idő,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.
}
void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}
void count() {
tft.setTextColor(ST7735_WHITE); // A betűszín beállítása
t = rtc.getTime(); // Az idő beolvasása
tft.setCursor(5, 120); // A kurzor helyének beállítása
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // Az idő megjelenítési területének törlése
tft.print(rtc.getTimeStr()); // Az óraképviseletek kiírása
wdt_reset(); // A megfigyelő időzítő visszaállítása minden ciklusban, azaz másodpercenként
for (rc = 0; rc < 4; rc++) // a bemeneti állapotok ellenőrzésének ciklusának kezdete
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & (b << rc);
if (pumrcounter[rc] != pinState) { // és ha nem egyezik, akkor
pumrcounter[rc] = pinState; // az port bit állapotának új 1/0 értékének hozzárendelése
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == (b << rc)) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // Alacsony szintű számoláshoz cserélje ki a ZÖLD-t KÉK-re
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // Alacsony szintű számoláshoz cserélje ki a KÉK-t ZÖLD-re
pump[rc] += 1; // Egy másodperccel növeljük a működési idő számlálóját
}
}
k ++;
if (k == 36) {
k = 0;
tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // Az üzemidő megjelenítési területének törlése
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // és dátumok
tft.setCursor ( 60, 120 ); // kurzorpozíció beállítása
tft.print(rtc.getDateStr()); // dátum kiírása az LCD képernyőre
for (rc = 0; rc < 4; rc++) // kiírás a munkamagatartásról egész, tizedes és
{
tft.setCursor ( 30, rc * 10 + shift ); // százalékos óraérték kiírása 10 pixellel lefelé eltolva
tft.println(pump [rc] / m);
}
// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////
for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // a írási cím változó növelése
}
}
// отправляем данные по радиоканалу из 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));
}
}
}
Kis megjegyzések a végén. A számlálás alacsony logikai szinten történik a bemeneteken.
A R2-R5 húzási ellenállások 36 kΩ a GL5516 fotorezisztorokkal rendelkező változat esetén. Fototranszisztoros optókeret és relé esetén 4,7-5,1 kΩ-ra kell állítani. Az Arduino Nano v3.0 betöltője Arduino Uno-ra lett cserélve a TL866A programozó segítségével a watchdog időzítő megfelelő működése érdekében. A fúziók módosítva lettek, hogy 4,3 V feletti feszültségnél működjenek. A visszaállító áramkör R6 C3 nem volt használva. A példa programban a vevő frekvenciája nem felel meg a nem engedélyezett sávnak, a 2,4 GHz-es sáv a 2400.0—2483.5 MHz frekvenciákra korlátozódik.
A E01-ML01DP05 adó tartománya 2400-2525 MHz. Az egy csatorna sávszélessége 1 MHz, a ‘RF24_2MBPS’ sebesség beállítása mellett az adott radio.setChannel(120) csatorna és a következő is foglalt, így a sáv 2 MHz szélességű lesz.
Forrás: habr.com
