La întreprindere au fost achiziționate stații de monitorizare NEXXT-M de producție autohtonă „Nexxt Technologies”. Pentru a asigura vizualizarea funcționării agregatelor de pompare,
a sistemului de alarmă de incendiu și de securitate, a tensiunii la porți, a temperaturii din încăpere și a nivelului de apă de urgență. Inima NEXXT-M este ATMEGA 1280, iar acest fapt a adus speranțe în privința posibilității de a crea un kit propriu conform nevoilor specifice.
S-a stabilit sarcina de a crea, în cel mai scurt timp și cu cheltuieli minime, un sistem complet autonom de dispecerizare locală pentru nevoile specifice. Baza este un microcontroler. Proiectarea, fabricarea sunt realizate cu forțele proprii ale personalului.
Sistemul trebuie să funcționeze fără dependență de rețelele mobile, servere, internet și sistemul de autorizare a utilizării resurselor de frecvență radio, să nu utilizeze în activitatea de control și gestionare computere sau, în cel mai bun caz, laptopuri ocazional, fără acces la obiecte pentru o perioadă lungă de timp (6-9 luni). Configurația rețelei are o structură radială. Datele sunt colectate într-un singur punct și apoi trimise pentru procesare prin canale de comunicație obișnuite sau sub formă de copie fizică.
Sistemul trebuie să asigure:
- controlul funcționării instalațiilor de pompare
- automatica tehnologică
- protecția împotriva consecințelor modurilor de urgență
- semnalizarea modurilor de urgență
- numărarea timpului de funcționare
- numărarea volumului de energie electrică consumată
- controlul temperaturii echipamentului
- sistemul de alarmă de incendiu și securitate
- prelevarea periodică la distanță a informațiilor
- cerințe necunoscute în viitor
Condiții de funcționare:
- teritoriu de acoperire de 1 km².
- vizibilitate directă între obiecte
- temperatura de la +50 la -50°C
- umiditate de până la 100%
- depuneri biologic active (mucegai, bacterii reducătoare de sulf)
- vibrații, maxim de tipuri 1-2 conform GOST ISO 10816-1-97
- mediu electromagnetic - comutarea motoarelor electrice cu contactori KT 6053, echipamente de pornire progresivă RVS-DN, echipamente de reglementare PID SIEMENS MICROMASTER, radiații în gama ISM și GSM conform cerințelor acestor dispozitive, sudură manuală cu arc la fața locului
- tensiune de rețea crescută, întreruperi temporare ale alimentării electrice, supratensiuni cauzate de furtuni, dezechilibre fazice în urma ruperii unui fir de linie în rețelele de distribuție de 6-10 kV.
În ciuda acestor cerințe stricte, implementarea este destul de simplă dacă se abordează etapa cu etapă problema.
Având în vedere toate acestea, placa „Arduino Nano 3.0” a fost concepută ca „creier” al proiectului. Placa de la „Robotdyn” are un controler ATMEGA 328, un stabilizator de tensiune necesar de 3,3V pe
curent de 800 mA și un convertor CH340G UART-USB.
În primul rând, au fost create contoare de funcționare, deoarece acestea sunt cele mai relevante. Contoarele industriale anterioare, construite pe circuite PIC cu alimentare fără transformator, au ieșit din funcțiune din cauza fluctuațiilor de tensiune pe parcursul unui an de lucru. Au rămas intacte doar cele conectate prin blocuri de alimentare artizanale de 5V. Pentru a accelera montajul și a facilita conectarea, semnalul de stare al agregatelor este preluat din bornele aparatelor de comutare, adică înregistrarea prezenței primei faze de tensiune în alimentarea trifazată de 380V. Pentru a se conecta la controler se utilizează un releu intermediar cu bobină de 220V sau un optocuplor format dintr-un LED și un fotorezistor GL5516 sau optocuplor PC817. Toate variantele au fost testate în funcțiune. LED-ul este alimentat cu tensiune îndreptată, cu limitarea curentului prin două condensatoare SVV22, calculate pentru o tensiune de 630V, conectate în serie pentru siguranță în cazul unei verificări accidentale cu megohmmetrul.
Citirea indicațiilor de timp de funcționare cu ajutorul ecranului LCD ST7735S, transmiterea datelor prin radio în timp real utilizând modulul E01-ML01DP05 la frecvența de 2,4 MHz. Acest dispozitiv conține un chip nRF24L01+ și un amplificator de recepție-transmitere RFX2401C,
puterea de ieșire de până la 100 mW. Antenele sunt spirale, calculate pentru banda necesară în calculatorul online. . Tipul de antene este determinat de excluderea recepției undelor reflectate o singură dată de structurile metalice din jur. Componentele antenelor sunt imprimate pe o imprimantă 3D. Starea curentă a contoarelor este păstrată în EEPROM-ul controlerului însuși și, în caz de deconectare neașteptată a alimentării, este restaurată. Intervalele temporale pentru numărare sunt asigurate de circuitul RTC DS3231 sub forma unui modul cu baterie de rezervă. În sursa de alimentare se utilizează 3 module, un sursă impuls, 220/5V HLK-PM01 600mA, un convertor din 1-5V în 5V și — controler de baterie care are de protecție împotriva scurtcircuitului, descărcării excesive și încărcării excesive. Toate componentele au fost achiziționate de pe site-ul Aliexpress.
Placă de prototipare
Contor pe 4 canale. Pe intrări sunt instalate filtre LC pentru a proteja de interferențe pe linia de comunicație din cabluri împletite. Datele despre starea obiectelor monitorizate sunt citite constant o dată pe secundă, afișate cu o culoare pe ecranul LCD. Actualizarea citirilor și salvarea în memorie nevolatilă se realizează la fiecare 36 de secunde. 36 de secunde este 1/100 dintr-o oră, exact în acest format sunt cerute datele. La fiecare 12 secunde are loc transmiterea informațiilor despre numărul de secunde de funcționare pentru fiecare aparat de control. Memoria EEPROM are un număr limitat de cicluri de scriere-ștergere, conform producătorului, 100000 de ori. Cea mai proastă variantă este atunci când este efectuată constant actualizarea măcar unei celule. Dimensiunea unui contor este de 4 octeți, acesta este un număr de format long, 4 contoare, în total 16 octeți ocupă o înregistrare. Lungimea memoriei chip-ului este de 1024 octeți, după 64 de înregistrări de 4 contoare, înregistrarea va începe din nou. În biblioteca EEPROM, metoda EEPROM.put nu efectuează scrierea dacă valoarea celulei și informația scrisă coincid, nu va exista degradare a celulelor. Drept urmare, timpul garantat de funcționare a memoriei va fi mai mare de 7 ani. Timpul de funcționare posibil, dar negarantat, poate fi mult mai mare.
Schema principială
Programul în 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); // obiect radio pentru a lucra cu biblioteca RF24,
// и номера выводов 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 cu 4 valori ale contoarelor de secunde
float m = 3600.0;
unsigned int address = 0;
int rc;// variabilă pentru contoare
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 pentru stocarea stărilor obiectelor, 1- oprit, 0- pornit.
int start = 0; //
void setup() {
rtc.begin();
radio.begin(); // Inițiem funcționarea nRF24L01+
radio.setChannel(120); // canal de transmisie de date (de la 0 la 127).
radio.setDataRate (RF24_250KBPS); // viteza de transmisie a datelor (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // puterea transmisorului (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Deschide un tub cu identificator pentru transmiterea datelor
// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.
tft.initR(INITR_BLACKTAB); // inițializează un cip ST7735S, tab negru
// 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); // Permite textul să se extindă pe marginea dreaptă
tft.setRotation( 2 ); // pentru PCB NEGRU și RED tft.setRotation(0) sau nu.
tft.fillScreen(ST7735_BLACK); // curățarea ecranului
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // închiderea software funcționează, nivel înalt-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.
for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // afișarea numerelor pozițiilor obiectelor de control
tft.print ( rc + 1 );
}
tft.setCursor (12, 0); // afișarea a 3 linii de text
tft.println («DEVELOPERS & BUILD» ); // pentru lauda proprie
tft.setCursor (24, 10); // sau copyright-ul urâcios
tft.print («DEVELOPER M.M.»);
tft.setCursor (28, 20);
tft.print («BUILD-ER D.D.»);
//восстановление данных/////////////////////////////////////////////////////////
for ( z = 0; z < 1023; z += 16 ) { // Iterate over all EEPROM cells
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // așa, fără un ciclu for, mai puțin volum
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; // creșterea adresei pentru a scrie următorul bloc fără a suprascrie datele ultimei înregistrări
// конец восстановления данных////////////////////////////////////////////////////////////////
attachInterrupt(0, count, RISING); // pin D2, activarea funcționării întreruperii, primind fiecare secundă
// импульсы от RTC DS3231 с выхода SQW
wdt_enable (WDTO_8S); // activarea temporizatorului de supraveghere, resetează controlerul în cazul înghețului, timpul,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.
}
void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}
void count() {
tft.setTextColor(ST7735_WHITE); // setarea culorii fontului
t = rtc.getTime(); // citirea timpului
tft.setCursor ( 5, 120 ); // setarea poziției cursorului
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // curățarea zonei de afișare a timpului
tft.print(rtc.getTimeStr()); // afișarea valorilor orei
wdt_reset(); // resetarea temporizatorului de supraveghere în fiecare ciclu, adică o secundă
for (rc = 0; rc < 4; rc ++) // începutul ciclului de verificare a corespondenței stării intrărilor
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );
if (pumrcounter [rc] != pinState) { // și dacă nu corespunde, atunci
pumrcounter [rc] = pinState; // atribuirea variabilei stării bitului portului noului valor 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // pentru contorul la nivel scăzut schimbați GREEN cu BLUE
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // pentru contorul la nivel scăzut schimbați BLUE cu GREEN
pump [rc] += 1; // adăugăm un la contorul timpului de funcționare 1 secundă
}
}
k ++;
if ( k == 36 ) {
k = 0;
tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // curățarea zonei de afișare a timpului de funcționare
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // și data
tft.setCursor ( 60, 120 ); // setarea poziției cursorului
tft.print(rtc.getDateStr()); // afișarea datei pe ecran LCD
for (rc = 0; rc < 4; rc++) //afisarea valorilor de utilizare în întregi, zecimi și
{
tft.setCursor ( 30, rc * 10 + shift ); // pentru sutimi de oră cu un decalaj de 10 pixeli în jos pe ecran
tft.println(pump[rc] / m);
}
// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////
for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump[rc]);
address += sizeof(float); // incrementarea variabilei de adresare
}
}
// отправляем данные по радиоканалу из 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));
}
}
}
Unele observații finale. Numărătoarea începe atunci când nivelul logic este scăzut pe intrări.
Rezistențele de pull-up R2-R5 de 36 kΩ pentru varianta cu fotorezistori GL5516. În cazul unui optocuplor cu fototransistor și releu, folosiți 4.7-5.1 kΩ. Bootloaderul Arduino Nano v3.0 a fost înlocuit cu Arduino Uno prin programatorul TL866A pentru a funcționa corect cu temporizatorul de supraveghere. Fuzibilitățile au fost ajustate pentru a funcționa la o tensiune de peste 4.3 V. Circuitul extern de resetare R6 C3 nu a fost utilizat. În exemplul de program, frecvența emițătorului nu se încadrează în banda neautorizată, banda de 2.4 GHz este limitată la frecvențele 2400.0—2483.5 MHz.
Banda emițătorului E01-ML01DP05 cuprinde 2400-2525 MHz. Lățimea benzii unui canal este de 1 MHz, iar la setarea vitezei ca „RF24_2MBPS” va fi ocupat canalul specificat radio.setChannel(120) și următorul, deci banda va fi de 2 MHz.
Sursa: habr.com
