Жергиликтүү өз алдынча маалымат чогултуу системасы

Компания 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,3V чыңалуу стабилизатору
учурдагы 800 мА жана конвертер CH340G UART-USB.

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

Нан тактасыЖергиликтүү өз алдынча маалымат чогултуу системасы
4 каналдуу эсептегич. Киргизүүлөрдө чыйратылган жуп байланыш линиясы аркылуу тоскоолдуктардан коргоо үчүн LC чыпкалары бар. Башкаруу объектилеринин абалы жөнүндө маалыматтар секундасына бир жолу үзгүлтүксүз окулат жана LCD дисплейде түстүү көрсөтүлөт. Окуулар ар бир 1 секунд сайын жаңыртылып, туруксуз эстутумга жазылат. 36 секунд сааттын 36/1үн түзөт, бул маалымат талап кылынган формат. Ар 100 секунд. ар бир башкаруу блогунун иштөө секундунун саны жөнүндө маалымат берилет. EEPROM эс тутумунда жазууну өчүрүү циклдарынын чектелген саны бар, өндүрүүчүнүн айтымында, 12 100000 жолу. Эң начар вариант - жок дегенде бир клетка тынымсыз жаңыланып турганда. 1-эсептегичтин көлөмү 4 байт, бул узун форматтуу номер, 4 эсептегич, бардыгы 16 байт бир жазууну ээлейт. Чиптин эс тутумунун узундугу 1024 байт; 64 эсептегичтин 4 жазуусунан кийин жазуу кайра башталат. EEPROM китепканасында EEPROM.put ыкмасы жазылбайт, эгер уячанын мааниси менен жазылган маалымат дал келсе, клеткалардын деградациясы болбойт. Натыйжада, кепилденген эс иштөө убактысы 7 жылдан ашык болот. Мүмкүн болгон, бирок кепилденбеген жумуш убактысы алда канча узагыраак болушу мүмкүн.

Электр схемасыЖергиликтүү өз алдынча маалымат чогултуу системасы
Arduino IDEдеги программа//12 байт (328%)

#киргизүү // Негизги графикалык китепкана
#киргизүү // Аппараттык спецификалык китепкана
# камтыйт
#киргизүү
# камтыйт
#киргизүү
#киргизүү
RF24 радио(9, 10); // RF24 китепканасы менен иштөө үчүн радио объект,
// жана пин номерлери nRF24L01+ (CE, CSN)
#киргизүү
DS3231 rtc(SDA, SCL);
Time t;

//# TFT_CS 10 аныктоо
#аныктоо TFT_CS 8
#define TFT_RST -1 // сиз муну Arduino баштапкы абалга келтирүүгө да туташтыра аласыз
// бул учурда, бул #define PIN коюңуз -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;
unsigned long sumsek = 0;
байт i = 0;
байт k = 34;
unsigned int z = 0;
байт b = B00000001;
byte 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); // таза экран

DDRD = DDRD | 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("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, pump[0]); // ошондуктан, for цикли жок, көлөмү азыраак
EEPROM.get(z+4, насос[1]);
EEPROM.get(z+8, насос[2]);
EEPROM.get(z+12, насос[3]);

// 4 эсептегичтин суммасына жаңы кийинки маанини дайындоо
sumprim = (насос [0] + насос [1] + насос [2] + насос [3]);

// sumprim өзгөрмөсүндөгү 4 эсептегичтин суммасынын жаңы маанисин өзгөрмөнүн мурунку мааниси менен салыштырат
// сумсек жана мурунку сумма жаңы суммадан аз же барабар болсо, жаңы чоңу же барабары дайындалат
// сумсек мааниси.

if (sumsec <= sumprim) {
sumsec = sumprim; //

//жана учурдагы маани z дарек өзгөрмөсүнө дайындалат, z 16 мааниден турган 4 байттык блоктун башталышынын дареги
// эсептегичтер бир убакта жазылган (анткени портту сурамжылоодо анын бардык 8 биттери бир убакта жазылат,
// анын ичинде биздин керектүү жогорку 4 бит порт D).
адрес = z;
}
}

// 16 катталган эсептегич маанилердин 4 байттык блоктун башталышынын дареги боюнча eeprom эс тутумуна дагы бир жолу кирүү
// акыркы, б.а. тоңуп калгандыктан өчүрүүдөн же кайра жүктөөдөн мурунку маанилер. Акыркы жаздыруу
// эсептегич маанилерди 4 өзгөрмөлүү массивге киргизиңиз.

EEPROM.get(дареги, насос[0]);
EEPROM.get(дареги + 4, насос[1]);
EEPROM.get(дареги + 8, насос[2]);
EEPROM.get(дареги + 12, насос[3]);

дарек += 16; //акыркы жазуунун маалыматтарын кайра жазбастан кийинки блокту жазуу үчүн даректи көбөйтүү

//маалыматтарды калыбына келтирүү аяктайт////////////////////////////////////////// //////////////////

attachInterrupt(0, count, RISING); // PIN D2, үзгүлтүктөрдү иштетүү, секунд сайын келет
// RTC DS3231ден SQW чыгышынан импульстар

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 ыйгаруу
}
// түстү башкаруу объекттеринин абалын көрсөтүү
// BLUE - бул учурдагы экрандын (же китепкананын?) кичинекей катасы, RGB жана BGR аралашып кеткен.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // төмөнкү деңгээлдеги эсептөө үчүн ЖАШЫЛды КӨК кылып өзгөртүңүз
башка} {
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()); // ЖК экранында датаны көрсөтүү

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

// "чийки" иштөө сааттарынын маанилерин (секунд менен) EEPROMга жазуу //////////////////////////////////////

үчүн (rc = 0; rc < 4; rc++)
{
EEPROM.put(дареги, насос [rc]);
address += sizeof(float); // жазуу дареги өзгөрмөсүн көбөйтүү
}
}

// канча байт жөнөтүлүшү керектигин көрсөткөн маалыматтардан радиоканал аркылуу маалыматтарды жөнөтүү.
if ((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 МГц болот.

Source: www.habr.com

Комментарий кошуу