Ettevõttele söödati kohaliku tootmise NEXST-M monitooringupostid, mis on toodetud „Next Technologies” poolt. See tagab pumpade agregaatide töö visualiseerimise,
tule- ja sissetungimishäiresignaale, pinget starterites, temperatuuri ruumis, hädaolukorra veetaset. NEXST-M-i keskuseks on ATMEGA 1280, mis avab võimaluse luua vajadustest lähtuv komplekt.
Eesmärk oli luua täielikult iseseisev lokaalset juhtimissüsteem võimalikult lühikese aja ja minimaalsete kuludega. Põhielemendiks on mikrokontroller, ja arendamine ning tootmine toimub ettevõtte enda töötajate poolt.
Süsteem peab töötama sõltumatult mobiilsetest võrkudest, serverite, interneti ja raadioressursside kasutamise loaga seotud süsteemide töö, mitte kasutada arvutikontrolli ja juhtimissüsteemi või maksimaalselt perioodiline sülearvutite kasutamine, ilma juurdepääsuta objektidele pikema aja jooksul (6-9 kuud). Võrgu konfiguratsioon on radiaalne. Andmed kogutakse ühes kohas ja edastatakse seejärel töötlemiseks tavakanalite kaudu või kindlas vormis.
Süsteem peab tagama:
- pumpade töö kontroll
- tehnilise automaatika
- hädaolukordade tagajärgede kaitse
- teavituse hädaolukordadest
- tööaja arvestus
- tarbitud elektrienergia koguse arvestus
- seadmete temperatuuri kontroll
- rahvuslik ja tulekahjusignalisatsioon
- perioodiline kaugteabe kogumine
- tulevikus teadmata nõuded
Töötamistingimused:
- katteala 1 km².
- otse nägemine objektide vahel
- temperatuur vahemikus +50 kuni -50 C
- niiskus kuni 100%
- bioloogiliselt aktiivsed jäägid (hallitus, sulfaate vähendavad bakterid)
- vibratsioon, mitte rohkem kui 1-2 klassi masinaid GOST ISO 10816-1-97 järgi
- elektromagnetiline keskkond - kontaktorite KT 6053, sujuva käivitamise seadmete RVS-DN, SIEMENS MICROMASTER PID-regulatsiooni seadmete vaheliste elektrimootorite lülitamine, ISM ja GSM sagedusala kiirgus vastavalt nende seadmete nõuetele, käsitsi kaarkeevitus objektis
- ülekõrge võrgupinge, lühiajalised elektrikatkestused, äikese ülepinge, faasi tasakaalu rikkumine juhe WL katkestamisel 6-10 kV jaotuvvõrkudes.
Hoolimata nii rangeid nõudeid on teostamine täiesti lihtne samm-sammult ülesande lahendamisel.
Kuna kõik arvesse võetakse, on kavandatud "aju" kaart "Arduino nano 3.0". Robotdyn'i kaart sisaldab ATMEGA 328 kontrollerit, vajalikke 3,3V pingeregulaatorit
800 mA voolu ja CH340G UART-USB muundurit.
Esiteks loodi töötluse loendurid, kuna need olid kõige актуальsemad. Varem kasutatud tööstuslikud loendurid, mis olid valmistatud PIC-ide põhjal, katkesid pingepiikide tõttu aasta jooksul. Ainult need, mis olid ühendatud oma valmistatud toiteallikaga 5V, jäid terved. Paigalduse kiirus ja universaalne ühendamine hõlbustatakse, kui signaal seadmete olekust võetakse kommutaatorite terminalidest, st 380V kolmefaasilise toite all 1. faasi pinget registreeritakse. Kontrolleriga kooskõlastamiseks kasutatakse vahepealset releed, mille mähis on 220V või optoülekannet, mis koosneb LED-ist ja fotoristori GL5516-st või optoülekandest PC817. Kõiki versioone on katsetatud töös. LED saadakse sirgjoonelisest pingest, voolutakistuse piiramiseks kasutatakse kahte 630V-le mõeldud CBB22 kondensaatorit, mis on ühendatud järjestikku, et kaitsta juhusliku mähkereostuse kontrollimise korral.
Tööaja lugemine ST7735S LCD ekraani abil, andmete edastamine raadiovahendi kaudu reaalajas E01-ML01DP05 mooduliga sagedusel 2,4 GHz. Seade sisaldab kiipi nRF24L01+ ja vastuvõtja-ülekande võimendit RFX2401C,
maksimaalne võimsus kuni 100 mW. Antennid on spiraalsed, arvutatud soovitud sagedusala jaoks veebikalkulaatoris . Antennide tüüp on valitud, et vältida ühekordselt peegelduvate lainetega vastuvõttu ümbritsevatest metallkonstruktsioonidest. Antennide detailid on välja prinditud 3D-printeriga. Loendurite praegune olek salvestatakse kontrollere EEPROM-i ja ootamatute toitekatkestuste korral taastatakse see. Ajaintervallide arvestamist tagab RTC mikroskeem DS3231 varupatareiga moodulina. Toiteallikas koosneb kolmest moodulist, nimelt impulssallikas 220/5V HLK-PM01 600mA, 1-5V muundur 5V ja — akuhaldur, millel on lühise, ülemäärase tühjenemise ja ülelaadimise eest. Kõik komponendid on ostetud Aliexpressi veebilehelt.
Katselauale
Neljakanaline loendur. Sissetulekutel on LC filtrid, et kaitsta Etherneti liini häirete eest. Kontrollitavate objektide olekuandmed loetakse pidevalt 1 korra sekundi jooksul ja kuvatakse värviga LCD-ekraanil. Andmete uuendamine ja kirjutamine mitte-jõuallika mällu toimub iga 36 sekundi järel. 36 sekundit on 1/100 tund, just sellises formaadis andmed on vajalikud. Iga 12 sekundi järel edastatakse teave töö seondumiste arvu kohta igas kontrollagregaatis. EEPROM-mälu talub piiratud arvu kirjutamis-kustutamis tsükleid, tootja andmetel kuni 100 000 korda. Halvimal juhul toimub pidev uuendamine vähemalt ühe mäluraku puhul. Ühe loenduri maht on 4 baiti, see on long formaadis number, 4 loendurit, kokku 16 baiti võtab üks kirjutamine. Mikroskeemi mälu pikkus on 1024 baiti, pärast 64 kirjutamist 4 loendurist algab kirjutamine uuesti. EEPROM raamatukogus ei toimu meetodi EEPROM.put korral kirjutamist, kui mäluraku väärtus vastab kirjutatavale teabele, seega ei toimu mälurakkude degradatsiooni. Lõppkokkuvõttes on garantii mälu tööaeg rohkem kui 7 aastat. Võimalik, kuid mitte garanteeritud tööaeg võib olla palju pikem.
Põhimõtteline skeem
Programm Arduino IDE-s//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 RF24 teegi jaoks,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Aeg 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]; // massiiv 4 sekundi arvestite väärtusega
float m = 3600.0;
unsigned int address = 0;
int rc; // muutuja arvestite jaoks
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // massiiv objektide olekute hoidmiseks, 1 - välja, 0 - sisse.
int start = 0; //
void setup() {
rtc.begin();
radio.begin(); // Käivitame nRF24L01+ töö
radio.setChannel(120); // andmeedastuse kanal (0 kuni 127).
radio.setDataRate(RF24_250KBPS); // andmeedastuskiirus (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // saatja võimsus (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Avame toru identifikaatoriga andmete edastamiseks
// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.
tft.initR(INITR_BLACKTAB); // ST7735S kiibi initsialiseerimine, must 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); // Lubage tekstil joone paremast servast välja voolata
tft.setRotation(2); // must PCB ja punane tft.setRotation(0) või mitte.
tft.fillScreen(ST7735_BLACK); // ekraani puhastamine
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // tarkvara tõukamine töötab, kõrge tase-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.
for (rc = 0; rc < 4; rc++)
{
tft.setCursor(3, rc * 10 + shift); // objekti kontrollpositsioonide numbrite väljund
tft.print(rc + 1);
}
tft.setCursor(12, 0); // 3 rea teksti väljund
tft.println("DEVELOPERS & BUILD"); // enda kiitmiseks
tft.setCursor (24, 10); // või kurja autoriõiguse märk
tft.print («DEVELOPER M.M.»);
tft.setCursor (28, 20);
tft.print («BUILD-ER D.D.»);
//восстановление данных/////////////////////////////////////////////////////////
for ( z = 0; z < 1023; z += 16 ) { // Läbib kõik EEPROMi rakud
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // nii, ilma for-tsüklita, vähem mahtu
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; // aadressi suurendamine järgmise ploki kirjutamiseks, mitte viimase salvestuse andmete üle kirjutamiseks
// конец восстановления данных////////////////////////////////////////////////////////////////
attachInterrupt(0, count, RISING); // pin D2, katkestuse töö lubamine, iga sekundi järel saabuvad
// импульсы от RTC DS3231 с выхода SQW
wdt_enable (WDTO_8S); // vahtkonna taimeri käivitamine, taaskäivitab kontrolleri, kui see hangub, aeg,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.
}
void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}
void count() {
tft.setTextColor(ST7735_WHITE); // fondi värvi seadmine
t = rtc.getTime(); // aja lugemine
tft.setCursor ( 5, 120 ); // kursori asukoha seadmine
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // aja kuvamisala puhastamine
tft.print(rtc.getTimeStr()); // kellaaegade väljund
wdt_reset(); // vahtkonna taimeri lähtestamine iga tsükli, st. sekundi jooksul
for (rc = 0; rc < 4; rc ++) // sisse-/väljaoleku kontrollimise tsükli algus
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );
if (pumrcounter [rc] != pinState) { // ja kui see ei vasta, siis
pumrcounter [rc] = pinState; // muutuja porti bitiseisundi uue väärtuse 1/0 määramine
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // madalal tasemel kokku lugemiseks vaheta GREEN siniseks
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // madalal tasemel kokku lugemiseks vaheta BLUE roheliseks
pump [rc] += 1; // lisame töötamise aega 1 sekund
}
}
k ++;
if ( k == 36 ) {
k = 0;
tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // puhastame töötamisaja väljundpiirkonna
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // ja kuupäeva
tft.setCursor ( 60, 120 ); // kursorisätte asukoht
tft.print(rtc.getDateStr()); // kuupäeva väljund LCD ekraanile
for (rc = 0; rc < 4; rc ++) // näitab töötamise näitajaid tervik-, kümnend- ja
{
tft.setCursor ( 30, rc * 10 + shift ); // tunni kümnend- ja sadade osade allapoole nihutamine 10 pikslit
tft.println(pump [rc] / m);
}
// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////
for (rc = 0; rc < 4; rc ++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // muutujate salvestamise aadressi inkrement
}
}
// отправляем данные по радиоканалу из 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));
}
}
}
Mõned tähelepanekud lõpus. Arvumine toimub madalal loogilisel tasemel sisenditel.
R2-R5 tõmbe takistid 36 kΩ GL5516 fotoresistoritega variandi jaoks. Fototransistori optopaaride ja relee korral kasutage 4,7–5,1 kΩ. Arduino Nano v3.0 laadija on asendatud Arduino Uno'ga TL866A programmeerija abil, et tagada kellatimeri korrektne töö. Fuse’id on reguleeritud tööks pingel üle 4,3 V. Välist taaskäivituse ahelat R6 C3 ei kasutatud. Näidisprogrammi edastussagedus ei vasta litsentseerimata sagedusvahemikule, vahemik 2,4 GHz on piiratud sagedustega 2400.0—2483.5 MHz.
E01-ML01DP05 edastussagedus on 2400–2525 MHz. Ühe kanali ribalaius on 1 MHz, kui kiirus on seadistatud „RF24_2MBPS”, on määratud radio.setChannel(120) kanal ja järgmine kanal, st riba on 2 MHz.
Allikas: habr.com
