Деректер жинаудың жергілікті автономды жүйесі

Компания «Next Technologies» компаниясы отандық өндірген NEKST-M бақылау посттарын сатып алды. Сорғы қондырғыларының жұмысын визуалды түрде қамтамасыз ету үшін,
өрт және күзет дабылдары, стартерлерде кернеудің болуы, бөлме температурасы, апаттық су деңгейі. NEKST-M жүрегі ATMEGA 1280 болып табылады және бұл факт нақты қажеттіліктерге арналған жеке жиынтықты жасау мүмкіндігі тұрғысынан жігерлендіреді.

Ең қысқа мерзімде және ең аз шығынмен нақты қажеттіліктер үшін толық автономды жергілікті диспетчерлік жүйені құру міндеті қойылды. Негізі микроконтроллер болып табылады. Даму, өндіріс, қызметкерлердің өздері жасаған.

Жүйе ұялы байланыс желілеріне, серверлерге, Интернетке және радиожиілік ресурстарын пайдалану бойынша лицензиялау жүйесіне тәуелділіксіз жұмыс істеуі, бақылау және басқару жүйесінің жұмысында компьютерлерді пайдаланбауы немесе ең көп дегенде, ноутбуктарды мерзімді түрде пайдаланбауы керек. объектілерді ұзақ уақыт бойы (6-9 ай). Желі конфигурациясының радиалды құрылымы бар. Деректер бір нүктеде жиналады, содан кейін кәдімгі байланыс арналары арқылы өңдеуге жіберіледі немесе қағазға көшіріледі.

Жүйе мыналарды қамтамасыз етуі керек:

  • сорғы қондырғыларының жұмысын қадағалау
  • технологиялық автоматтандыру
  • төтенше жағдайлардың зардаптарынан қорғау
  • апаттық сигнал беру
  • жұмыс уақытын есептеу
  • тұтынылатын электр энергиясының мөлшерін есептеу
  • жабдықтың температурасын бақылау
  • қауіпсіздік және өрт дабылы
  • ақпаратты мерзімді қашықтан жазу
  • белгісіз болашақ талаптар

Жұмыс шарты:

  • қамту ауданы 1 шаршы км.
  • объектілер арасындағы тікелей көріну
  • температура +50-ден -50 С-қа дейін
  • ылғалдылық 100% дейін
  • биологиялық белсенді шөгінділер (зең, сульфатты төмендететін бактериялар)
  • діріл, артық емес, ГОСТ ISO 1-2-10816 бойынша 1-97 класты машиналар
  • электромагниттік орта – КТ 6053 контакторларымен электр қозғалтқыштарын ауыстырып қосу, RVS-DN жұмсақ іске қосу жабдығы, SIEMENS MICROMASTER PID басқару жабдығы, осы құрылғыларға қойылатын талаптарға сәйкес ISM және GSM диапазонындағы сәулелену, орнында қолмен доғалық дәнекерлеу.
  • желінің шамадан тыс кернеуі, электрмен жабдықтаудағы қысқа мерзімді үзілістер, найзағайдың шамадан тыс кернеуі, 6-10 кВ тарату желілерінде әуе желісінің сымы үзілген кездегі фазалық теңгерімсіздік.

Осындай қатаң талаптарға қарамастан, мәселені кезең-кезеңімен шешу кезінде іске асыру өте қарапайым.

Барлығын ескере отырып, «Arduino Nano 3.0» тақтасы жоспардың «миы» болды. Robotdyn тақтасында ATMEGA 328 контроллері бар, қажетті 3,3 В кернеу тұрақтандырғышы
ток 800 мА және түрлендіргіш CH340G UART-USB.

Ең алдымен, жұмыс уақытының есептегіштері ең заманауилар ретінде құрылды. Трансформаторсыз қоректендіру тізбегі бар PIC-де жиналған бұрын қолданылған өнеркәсіптік есептегіштер жұмыс істеген бір жыл ішінде кернеудің жоғарылауына байланысты істен шықты. Үйде жасалған 5 В қуат көздерін пайдаланып қосылғандар ғана өзгеріссіз қалды. Орнатуды және қосылудың әмбебаптығын жылдамдату үшін коммутациялық құрылғылардың терминалдарынан блоктардың күйі туралы сигнал алынады, яғни. 1В үш фазалы қоректендіру көзімен 380-фазалық кернеудің болуын тіркеу. Контроллермен үйлестіру үшін 220 В орамасы бар аралық реле немесе жарық диоды мен GL5516 фоторезисторынан немесе PC817 оптикалық қосқыштан тұратын оптикалық қосқыш қолданылады. Барлық нұсқалар сынақтан өтті. Жарық диодты токты шектеуі бар түзетілген кернеумен электр тізбектерін мегаомметрмен кездейсоқ сынау кезінде қауіпсіздік үшін тізбектей қосылған 22 В кернеуге арналған екі SVV630 конденсаторы қолданылады.
ST7735S СКД экраны арқылы жұмыс уақытының көрсеткіштерін оқу, 01 МГц жиілікте E01-ML05DP2,4 модулі арқылы радио арқылы деректерді нақты уақытта жіберу. Бұл құрылғыда nRF24L01+ чипі және RFX2401C жіберу/қабылдау күшейткіші бар,
шығыс қуаты 100 мВт дейін. Онлайн калькулятордағы қажетті диапазонға арналған бұрандалы антенналар сайт. Антенна түрін таңдау қоршаған металл құрылымдардан бір рет шағылысқан толқындарды қабылдауды болдырмау арқылы анықталады. Антенна бөліктері 3D принтерде басып шығарылады. Есептегіштердің ағымдағы күйі контроллердің EEPROM-ында сақталады және күтпеген жерден электр қуатының үзілуі кезінде қалпына келтіріледі. Санау үшін уақыт интервалдары резервтік батареясы бар модуль түрінде DS3231 RTC чипімен қамтамасыз етіледі. Қуат көзі 3 модульді пайдаланады, нақты импульс көзі 220/5 В HLK-PM01 600 мА, 1-5 В-тан 5 В-қа дейінгі түрлендіргіш. ЖЖ-553 и 03962A - батарея контроллері бар схема қысқа тұйықталудан, артық разрядтан және артық зарядтан қорғау. Барлық компоненттер Aliexpress веб-сайтында сатып алынды.

Нан тақтасыДеректер жинаудың жергілікті автономды жүйесі
4 арналы есептегіш. Кірістерде бұралған жұп байланыс желісі арқылы кедергілерден қорғау үшін LC сүзгілері бар. Басқару объектілерінің күйі туралы деректер тұрақты түрде секундына бір рет оқылады және СКД экранында түрлі-түсті түрде көрсетіледі. Көрсеткіштер әр 1 секунд сайын жаңартылып, тұрақты жадқа жазылады. 36 секунд сағаттың 36/1 бөлігін құрайды, бұл деректер талап етілетін пішім. Әр 100 секунд сайын. әрбір басқару блогы үшін жұмыс секундтарының саны туралы ақпарат беріледі. EEPROM жадында өндірушінің айтуы бойынша 12 100000 рет жазуды өшіру циклдарының шектеулі саны бар. Ең нашар нұсқа - кем дегенде бір ұяшық үнемі жаңартылып тұратын кезде. 1-ші санауыштың көлемі 4 байт, бұл ұзын форматты нөмір, 4 есептегіш, барлығы 16 байт бір жазба алады. Микросұлба жадының ұзындығы 1024 байт, 64 есептегіштің 4 жазбасынан кейін жазу басынан басталады. EEPROM кітапханасында EEPROM.put әдісі жазылмайды; егер ұяшықтың мәні мен жазылған ақпарат сәйкес келсе, ұяшықтардың деградациясы болмайды. Нәтижесінде жадтың кепілдік берілген жұмыс уақыты 7 жылдан асады. Мүмкін, бірақ кепілдік берілмеген жұмыс уақыты әлдеқайда ұзағырақ болуы мүмкін.

Электр схемасыДеректер жинаудың жергілікті автономды жүйесі
Arduino IDE ішіндегі бағдарлама//12 328 байт (38%)

#қосу // Негізгі графикалық кітапхана
#қосу // Аппараттық құралға арналған кітапхана
# қосу
#қосу
# қосу
#қосу
#қосу
RF24 радиосы(9, 10); // RF24 кітапханасымен жұмыс істеуге арналған радиообъекті,
// және PIN нөмірлері nRF24L01+ (CE, CSN)
#қосу
DS3231 rtc(SDA, SCL);
Уақыт t;

//#TFT_CS 10 анықтаңыз
#TFT_CS 8 анықтау
#define TFT_RST -1 // оны Arduino қалпына келтіруге де қосуға болады
// бұл жағдайда #define пин кодын -1 мәніне орнатыңыз!
//#define TFT_DC 9 // DC=RS=A0 - пәрменді немесе деректер регистрін таңдауға арналған белгілеу опциялары.
#TFT_DC 3 анықтау

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// 2-нұсқа: кез келген түйреуіштерді пайдаланыңыз, бірақ сәл баяуырақ!
#define TFT_SCLK 13 // бұларды өзіңізге ұнайтын түйреуіштер етіп орнатыңыз!
#define TFT_MOSI 11 // бұларды өзіңізге ұнайтын түйреуіштер етіп орнатыңыз!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#қосу

байт ығысу = 52;
байт pinState;
unsigned long pump[4];// 4 секунд санауыш мәндері бар массив
float m = 3600.0;
қол қойылмаған int мекенжайы = 0;
int rc;// санағыштар үшін айнымалы
unsigned long sumprim = 0;
таңбаланбаған ұзын сомсек = 0;
байт i = 0;
байт k = 34;
unsigned int z = 0;
байт b = B00000001;
byte pumrcounter[4]; // нысан күйлерін сақтауға арналған массив, 1 - өшірулі, 0 - қосулы.
int бастау = 0; //

жарамсыз орнату () {

rtc.begin();
radio.begin(); // nRF24L01+ жұмысын бастаңыз
radio.setChannel(120); // деректер арнасы (0-ден 127-ге дейін).
radio.setDataRate(RF24_250KBPS); // деректерді беру жылдамдығы (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // таратқыш қуаты (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Деректерді тасымалдау үшін идентификаторы бар құбырды ашыңыз

// Уақытты орнату үшін қажетті жолдарды түсіндірмеңіз
//rtc.setDOW(1); // Апта күндері
//rtc.setTime(21, 20, 0); // Уақыт, 24 сағат пішімінде.
//rtc.setDate(29, 10, 2018); // Күні, 29 қазан 2018 ж

tft.initR(INITR_BLACKTAB); // ST7735S чипін инициализациялау, қара қойынды
// Егер сіз 1.44 дюймдік TFT қолдансаңыз, осы инициализаторды пайдаланыңыз (түсініктеме алу).
//tft.initR(INITR_144GREENTAB); // ST7735S чипін, ҚЫЗЫЛ rcB қойындысын инициализациялаңыз
tft.setTextWrap(жалған); // Мәтіннің оң жақ шетінен өтуіне рұқсат етіңіз
tft.setRotation( 2 ); // BLACK PCB және RED tft.setRotation(0) үшін немесе жоқ.
tft.fillScreen(ST7735_BLACK); // таза экран

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // бағдарламалық қамтамасыз етуді қатайту жұмыс істейді, жоғары деңгей -
// бақыланатын объектілер «жұмыс істемейді», «4» барлық 1 жоғары D портына жазылады, есептеу жүргізілмейді.

үшін ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + ауысым ); // басқару объектілерінің позиция нөмірлерін көрсету
tft.print(rc + 1);
}

tft.setCursor(12, 0); // мәтіннің 3 жолын шығару
tft.println («ӘЗІРУШІЛЕР ЖӘНЕ ҚҰРУ»); // жақын адамдарыңды мақтау
tft.setCursor(24, 10); // немесе жаман авторлық құқық
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//деректерді қалпына келтіру/////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Саланың барлық ұяшықтары арқылы қайталанады
//және 4 сорғы айнымалысының массивіне жазады, әрбір санауыш үшін 4 байт, өйткені
// белгісі жоқ ұзын айнымалы. 4 есептегіш бар, барлық 4-тің бір жазбасы 16 байтты алады.
EEPROM.get(z, сорғы[0]); // сондықтан, for циклі жоқ, көлемі аз
EEPROM.get(z+4, сорғы[1]);
EEPROM.get(z+8, сорғы[2]);
EEPROM.get(z+12, сорғы[3]);

// 4 есептегіштің қосындысы үшін жаңа келесі мәнді тағайындау
сумприм = (сорғы [0] + сорғы [1] + сорғы [2] + сорғы [3]);

// жиынтық айнымалыдағы 4 санауыш қосындысының жаңа мәнін айнымалыдағы алдыңғы мәнмен салыстырады
// сомсек және алдыңғы қосынды жаңа қосындыдан аз немесе оған тең болса, жаңа үлкен немесе тең тағайындалады
// сомсек мәні.

егер (sumsec <= sumprim ) {
sumsec = sumprim; //

//және ағымдағы мән z мекенжай айнымалысына тағайындалады, z - 16 мәннен тұратын 4 байттық блоктың басының мекенжайы
// есептегіштер бір уақытта жазылған (себебі портты сұрау кезінде оның барлық 8 биттері бір уақытта жазылады,
// D портының қажетті жоғары 4 битімен қоса).
мекенжай = z;
}
}

// 16 жазылған есептегіш мәндердің 4 байт блогының басындағы мекенжайдағы eeprom жадына тағы бір рет қол жеткізу
// соңғы, яғни. қатып қалуға байланысты өшіру немесе қайта жүктеу алдындағы мәндер. Соңғысын жазу
// мәндерді 4 айнымалы массивке санау сорғы.

EEPROM.get(мекен-жайы, сорғы[0]);
EEPROM.get(мекенжай + 4, сорғы[1]);
EEPROM.get(мекенжай + 8, сорғы[2]);
EEPROM.get(мекенжай + 12, сорғы[3]);

мекенжайы += 16; //соңғы жазбаның деректерін қайта жазбай келесі блокты жазу үшін адресті ұлғайту

//деректерді қалпына келтіру аяқталуы///////////////////////////////////////// //////////////////

attachInterrupt(0, санау, RISING); // D2 пин, үзулерді қосу, секунд сайын келеді
// SQW шығысынан RTC DS3231 импульстері

wdt_enable(WDTO_8S); // күзетші таймерді іске қосыңыз, қатып қалған жағдайда контроллерді қайта жүктеңіз, уақыт,
// ол үшін таймерді қалпына келтіру пәрменін шығару керек wdt_reset( және қалыпты жұмыс кезінде қайта жүктеуден аулақ болыңыз - 8 сек.
// сынақтар үшін мәнді 8 секундтан аз етіп орнату ұсынылмайды.Бұл жағдайда таймерді қалпына келтірген жөн.
// серпілу және бұл секунд сайын болады.

}

бос цикл () {
// бос цикл, мұнда электр қозғалтқышының ашық фазалық жұмысын бақылау болады
}

void count() {

tft.setTextColor(ST7735_WHITE); // қаріп түсін орнату
t = rtc.getTime(); // оқу уақыты
tft.setCursor(5, 120); // курсор орнын орнату
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // уақыт шығару аймағын тазалау
tft.print(rtc.getTimeStr()); // сағат көрсеткіштерін шығару

wdt_reset(); // бақылаушыны әр цикл сайын, яғни секунд сайын қалпына келтіріңіз

үшін (rc = 0; rc < 4; rc ++) // кіріс күйінің сәйкестігін тексеру циклінің басы
// порт биттері D портының биттерінің алдыңғы оқу күйіне
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // және сәйкес келмесе, онда
pumrcounter[rc] = pinState; // порт бит күйінің айнымалы мәніне жаңа 1/0 мәнін тағайындау
}
// түсті басқару объектілерінің күйінің көрсеткіші
// КӨК - бар экранның (немесе кітапхананың?) кішкене ақауы, RGB және BGR араласқан.
егер (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + ауысым)), 7, 7, ST7735_BLUE); // төмен деңгейлі санау үшін ЖАСЫЛды КӨК етіп өзгертіңіз
} Тағы {
tft.fillRect(15, ((rc * 10 + ауысым)), 7, 7, ST7735_GREEN); // төмен деңгейлі санау үшін КӨКТІ ЖАСЫЛ етіп өзгертіңіз
сорғы [rc] += 1; // жұмыс уақытының есептегішіне 1 секунд қосыңыз
}
}

k++;
егер (k == 36) {
k = 0;

tft.fillRect(30, ауысым, 97, 40, ST7735_BLACK); // жұмыс уақытын көрсету аймағын тазалау
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // және күндер

tft.setCursor(60, 120); // курсор орнын орнату
tft.print(rtc.getDateStr()); // СКД экранында күнді көрсету

үшін (rc = 0; rc < 4; rc ++) //барлық жұмыс сағаттарын шығару, ондық және
{
tft.setCursor ( 30, rc * 10 + shift ); // экранның 10 пиксельге төмен жылжуымен сағаттың жүзден бір бөлігі
tft.println(сорғы [rc] / м);
}

// EEPROM-ға «шикі» жұмыс уақытының мәндерін (секундтармен) жазу /////////////////////////////////////

үшін (rc = 0; rc < 4; rc++)
{
EEPROM.put(мекен-жай, сорғы [rc]);
адрес += sizeof(float); // жазу мекенжайының айнымалы мәнін ұлғайту
}
}

// қанша байтты жіберу керектігін көрсететін деректерден радиоарна арқылы деректерді жіберу.
егер ((k == 6 ) || (k == 18 ) || (k == 30 )) {

қол қойылмаған ұзын деректер;

radio.write(&бастау, sizeof(бастау));

үшін (i = 0; i < 4; i++) {
деректер = сорғы [i ];
radio.write( &деректер, sizeof(деректер));
}
}
}

Соңында бірнеше ескертулер. Санау кірістерде төмен логикалық деңгейде орын алады.

GL2 фоторезисторлары бар опция үшін R5-R36 тарту кедергілері 5516 кОм құрайды. Фототранзисторлы оптопар және реле жағдайында 4,7-5,1 кОм-ға орнатылады. Arduino Nano v3.0 жүктеушісі бақылау таймерінің дұрыс жұмыс істеуі үшін TL866A бағдарламалаушысы арқылы Arduino Uno-ға ауыстырылды. Сақтандырғыштар 4,3 В жоғары кернеулерде жұмыс істеу үшін түзетілген. R6 C3 сыртқы қалпына келтіру тізбегі пайдаланылмаған. Үлгі бағдарламада таратқыш жиілігі лицензияланбаған диапазонға сәйкес келмейді, 2,4 МГц диапазоны 2400.0-2483.5 МГц жиіліктермен шектелген.

E01-ML01DP05 таратқышының диапазоны 2400-2525 МГц. Бір арнаның өткізу қабілеті 1 МГц, жылдамдықты «RF24_2MBPS» ретінде орнату кезінде көрсетілген radio.setChannel(120) арнасы және келесісі бос болады, яғни. жолағы 2 МГц болады.

Ақпарат көзі: www.habr.com

пікір қалдыру