Локален автономен систем за стекнување податоци

Компанијата купи NEKST-M мониторинг места, произведени дома од страна на Next Technologies. За да се обезбеди визуелизација на работата на пумпните единици,
противпожарни и безбедносни аларми, присуство на напон при стартери, собна температура, ниво на вода за итни случаи. Срцето на NEKST-M е ATMEGA 1280 и овој факт е охрабрувачки во однос на можноста да креирате сопствен комплет за специфични потреби.

Беше поставена задача да се создаде целосно автономен локален диспечерски систем за специфични потреби во најкус можен рок и со минимални трошоци. Основата е микроконтролер. Развој, производство, креирано од самите вработени.

Системот мора да работи без зависност од мобилните мрежи, серверите, интернетот и системот за лиценцирање за користење на радиофреквенциските ресурси, да не користи компјутери во работата на системот за следење и контрола или, најмногу, периодично да користи лаптопи, без пристап до предмети долго време (6-9 месеци). Мрежната конфигурација има радијална структура. Податоците се собираат во еден момент, а потоа се испраќаат на обработка преку редовни комуникациски канали или како печатена копија.

Системот мора да обезбеди:

  • следење на работата на пумпните единици
  • технолошка автоматизација
  • заштита од последици од вонредни услови
  • сигнализација за итни случаи
  • пресметка на времето на работа
  • пресметување на количината на потрошена електрична енергија
  • контрола на температурата на опремата
  • безбедност и противпожарен аларм
  • периодично далечинско снимање на информации
  • непознати идни барања

Работните услови:

  • површина на покриеност 1 км.
  • директна видливост помеѓу предметите
  • температура од +50 до -50 C
  • влажност до 100%
  • биолошки активни наслаги (мувла, бактерии кои намалуваат сулфати)
  • вибрации, не повеќе, на машини од класи 1-2 според ГОСТ ИСО 10816-1-97
  • електромагнетна средина - префрлување на електрични мотори со контактори KT 6053, опрема за меко стартување RVS-DN, контролна опрема SIEMENS MICROMASTER PID, зрачење во опсегот ISM и GSM според барањата за овие уреди, рачно лачно заварување на лице место
  • прекумерен мрежен напон, краткотрајни прекини во напојувањето, громобрански пренапони, фазна нерамнотежа при прекин на жица на надземна линија во дистрибутивните мрежи од 6-10 kV.

И покрај таквите строги барања, имплементацијата е прилично едноставна при решавање на проблемот чекор по чекор.

Земајќи сè во предвид, таблата „Arduino Nano 3.0“ стана „мозокот“ на планот. Плочката robotdyn има контролер ATMEGA 328, потребниот стабилизатор на напон од 3,3 V за
струја 800 mA и конвертор во CH340G UART-USB.

Најпрво беа креирани бројачи за работно време како најсовремени. Претходно користените индустриски броила собрани на PIC со коло за напојување без трансформатор откажаа поради напонски бранови во рок од една година од работењето. Само оние што се поврзани со помош на домашни напојувања од 5V останаа недопрени. За да се забрза инсталацијата и разновидноста на поврзувањето, се зема сигнал за состојбата на единиците од терминалите на преклопните уреди, т.е. регистрација на присуство на 1-ви фазен напон со трифазен напојување од 380V. За координација со контролорот, се користи средно реле со намотување 220V или оптоспојувач составен од LED и фотоотпорник GL5516 или оптоспојувач PC817. Сите опции беа тестирани. ЛЕР се напојува со коригиран напон со ограничување на струјата со помош на два кондензатори SVV22 дизајнирани за напон од 630V поврзани во серија за безбедност при случајно тестирање на кола со мегометар.
Читање отчитувања на работното време со помош на LCD екранот ST7735S, пренос на податоци во реално време преку радио со помош на модулот E01-ML01DP05 на фреквенција од 2,4 MHz. Овој уред го содржи чипот nRF24L01+ и засилувачот за пренос/примање RFX2401C,
излезна моќност до 100 mW. Спирални антени дизајнирани за саканиот опсег во онлајн калкулаторот страница. Изборот на типот на антена се одредува со исклучување на приемот на единечно рефлектираните бранови од околните метални конструкции. Деловите од антената се печатат на 3D печатач. Тековната состојба на бројачите се складира во EEPROM на самиот контролер и се враќа во случај на неочекуван прекин на струја. Временските интервали за броење ги обезбедува RTC чипот DS3231 во форма на модул со резервна батерија. Напојувањето користи 3 модули, вистински извор на пулс 220/5V HLK-PM01 600mA, конвертор од 1-5V на 5V HW-553 и 03962A - контролер за батерии со шема заштита од краток спој, прекумерно празнење и преполнување. Сите компоненти се купени на веб-страницата на Aliexpress.

Даска за лебЛокален автономен систем за стекнување податоци
4-канален бројач. Постојат LC филтри на влезовите за заштита од пречки преку комуникациска линија со изопачени парови. Податоците за состојбата на контролните објекти постојано се читаат еднаш во секунда и се прикажуваат во боја на LCD-екранот. Читањата се ажурираат и се снимаат во неиспарлива меморија на секои 1 секунди. 36 секунди е 36/1 од час, ова е форматот во кој се бараат податоците. На секои 100 секунди. се пренесуваат информации за бројот на секунди на работа за секоја контролна единица. EEPROM меморијата има ограничен број циклуси за бришење запишување, според производителот, 12 пати. Најлошата опција е кога барем една ќелија постојано се ажурира. Волуменот на првиот бројач е 100000 бајти, ова е број со долг формат, 1 бројачи, вкупно 4 бајти е окупирана од еден запис. Должината на меморијата на чипот е 4 бајти; по 16 записи од 1024 бројачи, снимањето ќе започне одново. Во библиотеката EEPROM, методот EEPROM.put не пишува; ако вредноста на ќелијата и информациите што се пишуваат се совпаѓаат, нема да има деградација на ќелиите. Како резултат на тоа, гарантираното време на работа на меморијата ќе биде повеќе од 64 години. Времето на можна, но незагарантирана работа може да биде многу подолго.

Дијаграм на колаЛокален автономен систем за стекнување податоци
Програма во Arduino IDE//12 бајти (328%)

#вклучи // Основна графичка библиотека
#include // Специфична библиотека за хардвер
# вклучи
#include
# вклучи
#include
#include
RF24 радио (9, 10); // радио објект за работа со библиотеката RF24,
// и пиновите nRF24L01+ (CE, CSN)
#вклучи
DS3231 rtc (SDA, SCL);
Време t;

//#дефинирај TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // исто така можете да го поврзете ова со ресетирањето на Arduino
// во тој случај, поставете го овој #define пин на -1!
//#define TFT_DC 9 // DC=RS=A0 - опции за означување за избор на команда или регистар на податоци.
#define 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;
неозначена долга пумпа[4];// низа со бројачи од 4 секунди
плови m = 3600.0;
непотпишана int адреса = 0;
int rc;// променлива за бројачи
непотпишан долг сумприм = 0;
непотпишан долг сумек = 0;
бајт i = 0;
бајт k = 34;
неозначен int z = 0;
бајт b = B00000001;
бајти pumrcounter[4]; // низа за складирање на состојби на објектот, 1 - исклучено, 0 - вклучено.
int start = 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 чип, RED rcB таб
tft.setTextWrap(false); // Дозволете текстот да истекува од десниот раб
tft.setRotation(2); // за BLACK PCB и RED tft.setRotation(0) или не.
tft.fillScreen(ST7735_BLACK); // чист екран

ДДРД = ДДРД | B00000000;
PORTD = PORTD | B11110000; // затегнувањето на софтверот работи, високо ниво -
// контролираните објекти „не работат“, „4“ е напишано на сите 1 високи порти D, не се јавува броење.

за ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // прикажување на броеви на позиции на контролните објекти
tft.print(rc + 1);
}

tft.setCursor(12, 0); // излез 3 реда текст
tft.println("ПРОВИЖНИЦИ И ГРАДЕТЕ"); // да се пофалиш себеси сакани
tft.setCursor(24, 10); // или злобни авторски права
tft.print ("програмер М.М.");
tft.setCursor(28, 20);
tft.print ("BUILD-ER D.D.");

//обновување податоци///////////////////////////////////////////////////////////////////// ///////////

за ( z = 0; z < 1023; z += 16 ) { // Се повторува низ сите ќелии на индустријата
//и запишува во низа од 4 променливи на пумпата, 4 бајти за секој бројач, бидејќи
// непотпишана долга променлива. Има 4 бројачи, еден запис од сите 4 зема 16 бајти.
EEPROM.get(z, пумпа[0]); // така, без јамката за, помал волумен
EEPROM.get(z+4, пумпа[1]);
EEPROM.get(z+8, пумпа[2]);
EEPROM.get(z+12, пумпа[3]);

// доделување нова следна вредност за збир од 4 бројачи
sumprim = (пумпа [0] + пумпа [1] + пумпа [2] + пумпа [3]);

// ја споредува новата вредност на збирот од 4 бројачи во променливата sumprim со претходната вредност во променливата
// sumsec и ако претходната сума е помала или еднаква на новата сума, се доделува новата поголема или еднаква
// sumsec вредност.

ако ( sumsec <= sumprim ) {
sumsec = сумприм; //

//и сегашната вредност z е доделена на променливата адреса, z е адресата на почетокот на блок од 16 бајти од 4 вредности
// бројачи снимени во исто време (од кога се избира порта, сите 8 бита од него се напишани истовремено,
// вклучувајќи ги нашите неопходни високи 4 бита на портата D).
адреса = z;
}
}

// уште еднаш пристап до меморијата eeprom на адресата на почетокот на блок од 16 бајти од 4 снимени вредности на бројачот
// последно, т.е. вредности пред исклучување или рестартирање поради замрзнување. Снимање на најновото
// Вредностите на бројачот во низа од 4 променливи пумпа.

EEPROM.get(адреса, пумпа[0]);
EEPROM.get(адреса + 4, пумпа[1]);
EEPROM.get(адреса + 8, пумпа[2]);
EEPROM.get(адреса + 12, пумпа[3]);

адреса += 16; //зголемување на адресата за запишување на следниот блок без презапишување на податоците од последниот запис

//крај на обновувањето на податоците///////////////////////////////////////////////////////////// //////////////////

attachInterrupt(0, count, RISING); // пин D2, овозможи прекини, доаѓа секоја секунда
// пулсира од RTC DS3231 од излезот SQW

wdt_enable (WDTO_8S); // вклучете го тајмерот за надзор, рестартирајте го контролорот во случај на замрзнување, време,
// за што треба да ја издадете командата за ресетирање на тајмерот wdt_reset( и да избегнете рестартирање при нормално работење - 8 сек.
// за тестови не се препорачува да се постави вредноста на помалку од 8 секунди. Во овој случај, по можност тајмерот се ресетира
// грчење, и тоа се случува секоја секунда.

}

празнина јамка () {
// празен циклус, тука ќе има контрола над отворената фаза на работа на електричниот мотор
}

празнини () {

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 );

ако (pumrcounter [rc] != pinState) { // и ако не се совпаѓа, тогаш
pumrcounter[rc] = pinState; // доделување на променливата за статус на бит на портата нова вредност 1/0
}
// индикација за состојбата на објектите за контрола на бојата
// BLUE е мала грешка на постоечкиот екран (или библиотека?), RGB и BGR се измешани.
ако (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // за броење на ниско ниво сменете го ЗЕЛЕНОТО во СИНО
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // за броење на ниско ниво сменете го СИНО во ЗЕЛЕНО
пумпа [rc] += 1; // додадете 1 секунда на бројачот за време на работа
}
}

k++;
ако (k == 36) {
k = 0;

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // чистење на областа за прикажување на работното време
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // и датуми

tft.setCursor(60, 120); // поставување на позицијата на курсорот
tft.print(rtc.getDateStr()); // прикажување на датумот на LCD екранот

за (rc = 0; rc <4; rc ++) // излезни работни часови во целина, десетинки и
{
tft.setCursor ( 30, rc * 10 + shift ); // стотинки од час со поместување на екранот надолу за 10 пиксели
tft.println (пумпа [rc] / m);
}

// пишување „необработени“ вредности на работни часови (во секунди) во EEPROM ////////////////////////////

за (rc = 0; rc <4; rc++)
{
EEPROM.put(адреса, пумпа [rc]);
адреса += sizeof(float); // зголемување на променливата адреса за пишување
}
}

// испратете податоци преку радио каналот од податоци што покажуваат колку бајти треба да се испратат.
ако ((k == 6 ) || (k == 18 ) || (k == 30 )) {

непотпишан долги податоци;

radio.write(&start, sizeof(start));

за (i = 0; i <4; i++) {
податоци = пумпа [i ];
radio.write( &податоци, sizeof(податоци));
}
}
}

Неколку белешки на крајот. Броењето се случува на ниско логичко ниво на влезовите.

Отпорите за повлекување R2-R5 се 36 kOhm за опцијата со фотоотпорници GL5516. Во случај на фототранзисторски оптоспојувач и реле, поставете го на 4,7-5,1 kOhm. Подигнувачот Arduino Nano v3.0 беше заменет со Arduino Uno со помош на програмерот TL866A за правилно функционирање на тајмерот за чувар. Осигурувачите се поправени да работат на напон над 4,3 V. Надворешното коло за ресетирање R6 C3 не се користеше. Во програмата за примероци, фреквенцијата на предавателот не одговара на нелиценцираниот опсег; опсегот од 2,4 MHz е ограничен на фреквенции од 2400.0-2483.5 MHz.

Опсегот на предавателот E01-ML01DP05 е 2400-2525 MHz. Пропусниот опсег на еден канал е 1 MHz, при поставување на брзината како „RF24_2MBPS“ наведениот канал radio.setChannel(120) и следниот ќе биде зафатен, т.е. опсегот ќе биде 2 MHz.

Извор: www.habr.com

Додадете коментар