Mahalliy avtonom ma'lumotlarni yig'ish tizimi

Kompaniya Next Technologies tomonidan mahalliy ishlab chiqarilgan NEKST-M monitoring postlarini sotib oldi. Nasos agregatlarining ishlashini vizual tarzda ta'minlash uchun,
yong'in va xavfsizlik signallari, boshlang'ichlarda kuchlanish mavjudligi, xona harorati, favqulodda suv darajasi. NEKST-M ning yuragi ATMEGA 1280 bo'lib, bu haqiqat muayyan ehtiyojlar uchun o'z to'plamingizni yaratish imkoniyati nuqtai nazaridan dalda beradi.

Muayyan ehtiyojlar uchun eng qisqa vaqt ichida va minimal xarajat evaziga to‘liq avtonom mahalliy dispetcherlik tizimini yaratish vazifasi qo‘yildi. Buning asosi mikrokontrollerdir. Rivojlanish, ishlab chiqarish, xodimlarning o'zlari tomonidan yaratilgan.

Tizim uyali aloqa tarmoqlariga, serverlarga, Internetga va radiochastota resurslaridan foydalanish boʻyicha litsenziyalash tizimiga bogʻliq boʻlmasdan ishlashi, monitoring va boshqaruv tizimining ishlashida kompyuterlardan foydalanmasligi yoki koʻpi bilan vaqti-vaqti bilan noutbuklardan foydalanmasligi kerak. ob'ektlarni uzoq vaqt davomida (6-9 oy). Tarmoq konfiguratsiyasi radial tuzilishga ega. Ma'lumotlar bir vaqtning o'zida to'planadi va keyin oddiy aloqa kanallari orqali yoki qog'oz nusxada qayta ishlash uchun yuboriladi.

Tizim quyidagilarni ta'minlashi kerak:

  • nasos agregatlarining ishlashini nazorat qilish
  • texnologik avtomatlashtirish
  • favqulodda vaziyatlarning oqibatlaridan himoya qilish
  • favqulodda signalizatsiya
  • ish vaqtini hisoblash
  • iste'mol qilinadigan elektr energiyasini hisoblash
  • uskunalar haroratini nazorat qilish
  • xavfsizlik va yong'in signalizatsiyasi
  • ma'lumotlarni davriy masofadan yozib olish
  • noma'lum kelajakdagi talablar

Ish sharoitlari:

  • qamrov maydoni 1 kv.km.
  • ob'ektlar orasidagi to'g'ridan-to'g'ri ko'rinish
  • harorat +50 dan -50 C gacha
  • namlik 100% gacha
  • biologik faol konlar (mog'or, sulfat kamaytiruvchi bakteriyalar)
  • GOST ISO 1-2-10816 bo'yicha 1-97 toifali mashinalarning tebranishi, ortiq emas
  • elektromagnit muhit - KT 6053 kontaktorlari bilan elektr motorlarini almashtirish, RVS-DN yumshoq ishga tushirish uskunasi, SIEMENS MICROMASTER PID nazorat qilish uskunasi, ushbu qurilmalarga qo'yiladigan talablarga muvofiq ISM va GSM diapazonidagi nurlanish, saytda qo'lda boshq payvandlash
  • ortiqcha tarmoq kuchlanishi, elektr ta'minotidagi qisqa muddatli uzilishlar, chaqmoqning haddan tashqari kuchlanishi, 6-10 kV kuchlanishli tarqatish tarmoqlarida havo liniyasi simi uzilishida fazalar muvozanati.

Bunday qat'iy talablarga qaramay, muammoni bosqichma-bosqich hal qilishda amalga oshirish juda oddiy.

Har bir narsani hisobga olgan holda, "Arduino Nano 3.0" taxtasi rejaning "miyasi" bo'ldi. Robotdyn platasida ATMEGA 328 kontroller mavjud, u uchun zarur bo'lgan 3,3V kuchlanish stabilizatori.
joriy 800 mA va CH340G UART-USB ga konvertor.

Avvalo, eng dolzarb hisoblagichlar sifatida ish soatlari hisoblagichlari yaratildi. Transformatorsiz elektr ta'minoti sxemasiga ega bo'lgan PIC-larda yig'ilgan ilgari ishlatilgan sanoat hisoblagichlari ishlagandan keyin bir yil ichida kuchlanishning ko'tarilishi tufayli muvaffaqiyatsizlikka uchradi. Faqat uy qurilishi 5V quvvat manbalari yordamida ulanganlar saqlanib qoldi. O'rnatishni tezlashtirish va ulanishning ko'p qirrali bo'lishi uchun birliklarning holati haqida signal kommutatsiya qurilmalarining terminallaridan olinadi, ya'ni. 1V uch fazali quvvat manbai bilan 380-fazali kuchlanish mavjudligini ro'yxatdan o'tkazish. Tekshirish moslamasi bilan muvofiqlashtirish uchun 220V o'rashli oraliq o'rni yoki LED va GL5516 fotorezistor yoki PC817 optokupllaridan tashkil topgan optokupl ishlatiladi. Barcha variantlar sinovdan o'tkazildi. LED megohmmetr bilan zanjirlarni tasodifiy sinovdan o'tkazishda xavfsizlik uchun ketma-ket ulangan 22V kuchlanish uchun mo'ljallangan ikkita SVV630 kondansatkichlari yordamida oqim cheklovi bilan rektifikatsiya qilingan kuchlanish bilan quvvatlanadi.
ST7735S LCD displey yordamida ish vaqti ko'rsatkichlarini o'qish, 01 MGts chastotada E01-ML05DP2,4 moduli yordamida radio orqali real vaqtda ma'lumotlarni uzatish. Ushbu qurilma nRF24L01+ chipini va RFX2401C uzatish/qabul qiluvchi kuchaytirgichni o'z ichiga oladi.
chiqish quvvati 100 mVt gacha. Onlayn kalkulyatorda kerakli diapazon uchun mo'ljallangan spiral antennalar sayt. Antenna turini tanlash atrofdagi metall konstruktsiyalardan yakka aks ettirilgan to'lqinlarni qabul qilishni istisno qilish bilan belgilanadi. Antenna qismlari 3D printerda chop etiladi. Hisoblagichlarning joriy holati kontrollerning o'zida EEPROM-da saqlanadi va kutilmagan elektr uzilishida tiklanadi. Hisoblash uchun vaqt oralig'i RTC chipi DS3231 tomonidan zaxira akkumulyatorli modul shaklida taqdim etiladi. Quvvat manbai 3 moduldan foydalanadi, haqiqiy impuls manbai 220/5V HLK-PM01 600mA, 1-5V dan 5V gacha bo'lgan konvertor. HW-553 и 03962A - batareya boshqaruvchisi bilan namuna qisqa tutashuvdan, ortiqcha zaryaddan va ortiqcha zaryaddan himoya qilish. Barcha komponentlar Aliexpress veb-saytida sotib olingan.

Non taxtasiMahalliy avtonom ma'lumotlarni yig'ish tizimi
4 kanalli hisoblagich. O'ralgan juftlik aloqa liniyasi orqali shovqinlardan himoya qilish uchun kirishlarda LC filtrlari mavjud. Boshqarish ob'ektlarining holati to'g'risidagi ma'lumotlar doimiy ravishda soniyada bir marta o'qiladi va LCD displeyda rangli ko'rsatiladi. O'qishlar har 1 soniyada yangilanadi va doimiy xotirada qayd etiladi. 36 soniya soatning 36/1 qismini tashkil etadi, bu ma'lumotlar talab qilinadigan formatdir. Har 100 soniyada. har bir boshqaruv bloki uchun ish soniyalar soni haqida ma'lumot uzatiladi. EEPROM xotirasi cheklangan miqdordagi yozishni o'chirish tsikliga ega, ishlab chiqaruvchiga ko'ra, 12 100000 marta. Eng yomon variant - kamida bitta hujayra doimiy ravishda yangilanib turishi. 1-hisoblagichning hajmi 4 bayt, bu uzun formatli raqam, 4 ta hisoblagich, jami 16 baytni bitta yozuv egallaydi. Chip xotirasining uzunligi 1024 baytni tashkil qiladi, 64 ta hisoblagichning 4 ta yozuvidan so'ng, yozish qaytadan boshlanadi. EEPROM kutubxonasida EEPROM.put usuli yozilmaydi; agar katakning qiymati va yozilayotgan ma'lumotlar mos kelsa, hujayralar degradatsiyasi bo'lmaydi. Natijada, kafolatlangan xotira ishlash muddati 7 yildan ortiq bo'ladi. Mumkin bo'lgan, ammo kafolatlanmagan ish vaqti ancha uzoqroq bo'lishi mumkin.

Elektr sxemasiMahalliy avtonom ma'lumotlarni yig'ish tizimi
Arduino IDE da dastur//12 328 bayt (38%)

#o'z ichiga oladi // Asosiy grafik kutubxonasi
#o'z ichiga oladi // Uskunaga xos kutubxona
# shu jumladan
#o'z ichiga oladi
# shu jumladan
#o'z ichiga oladi
#o'z ichiga oladi
RF24 radiosi (9, 10); // RF24 kutubxonasi bilan ishlash uchun radio ob'ekti,
// va pin raqamlari nRF24L01+ (CE, CSN)
#o'z ichiga oladi
DS3231 rtc (SDA, SCL);
Vaqt t;

//#TFT_CS 10 ni aniqlang
#TFT_CS 8 ni aniqlang
#define TFT_RST -1 // siz buni Arduino resetiga ham ulashingiz mumkin
// u holda ushbu #define pinini -1 ga qo'ying!
//#define TFT_DC 9 // DC=RS=A0 - buyruq yoki ma'lumotlar registrini tanlash uchun belgilash variantlari.
#TFT_DC ni aniqlang 3

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

// Variant 2: har qanday pinlardan foydalaning, lekin biroz sekinroq!
#define TFT_SCLK 13 // ularni o'zingiz yoqtirgan pinlar qilib belgilang!
#define TFT_MOSI 11 // ularni o'zingiz yoqtirgan pinlar qilib sozlang!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#o'z ichiga oladi

bayt siljishi = 52;
bayt pinState;
unsigned long pump[4];// 4 soniya hisoblagich qiymatlari bilan massiv
float m = 3600.0;
imzosiz int manzili = 0;
int rc;// hisoblagichlar uchun o'zgaruvchi
unsigned long sumprim = 0;
unsigned long sumsek = 0;
bayt i = 0;
bayt k = 34;
unsigned int z = 0;
bayt b = B00000001;
bayt pumrcounter[4]; // ob'ekt holatlarini saqlash uchun massiv, 1 - o'chirilgan, 0 - yoqilgan.
int start = 0; //

bekor o'rnatish () {

rtc.begin();
radio.begin(); // nRF24L01+ ishini boshlash
radio.setChannel(120); // ma'lumotlar kanali (0 dan 127 gacha).
radio.setDataRate(RF24_250KBPS); // ma'lumotlarni uzatish tezligi (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // transmitter quvvati (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Ma'lumotlarni uzatish uchun identifikator bilan quvurni oching

// Vaqtni belgilash uchun kerakli satrlarni izohdan olib tashlang
//rtc.setDOW(1); // Hafta kuni
//rtc.setTime(21, 20, 0); // Vaqt, 24 soatlik formatda.
//rtc.setDate(29, 10, 2018); // Sana, 29 yil 2018 oktyabr

tft.initR(INITR_BLACKTAB); // ST7735S chipini ishga tushiring, qora yorliq
// Agar siz 1.44 dyuymli TFT dan foydalanayotgan bo'lsangiz, ushbu ishga tushirgichdan foydalaning (sharhni bekor qiling).
//tft.initR(INITR_144GREENTAB); // ST7735S chipini ishga tushiring, RED rcB yorlig'i
tft.setTextWrap(noto'g'ri); // Matnni o'ng chetidan o'tkazishga ruxsat bering
tft.setRotation( 2 ); // BLACK PCB va RED tft.setRotation(0) uchun yoki yo'q.
tft.fillScreen(ST7735_BLACK); // toza ekran

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // dasturiy ta'minotni kuchaytirish ishlamoqda, yuqori daraja -
// boshqariladigan ob'ektlar "ishlamaydi", "4" barcha 1 ta katta D portiga yoziladi, hisoblash amalga oshirilmaydi.

uchun ( rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + siljish); // boshqaruv ob'ektlarining pozitsiya raqamlarini ko'rsatish
tft.print (rc + 1);
}

tft.setCursor(12, 0); // 3 qatorli matn chiqarish
tft.println("ISHLAB CHIQISHLAR VA QURISH"); // o'zingizni yaqinlaringizni maqtash uchun
tft.setCursor(24, 10); // yoki yomon mualliflik huquqi
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//ma'lumotlarni tiklash/////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Sanoatning barcha kataklari boʻylab takrorlanadi
//va 4 ta nasos o'zgaruvchilari massiviga yozadi, har bir hisoblagich uchun 4 bayt, chunki
// belgisiz uzun o'zgaruvchi. 4 ta hisoblagich mavjud, 4 tasining bitta yozuvi 16 baytni oladi.
EEPROM.get(z, nasos[0]); // shunday, for tsiklisiz, kamroq hajm
EEPROM.get(z+4, nasos[1]);
EEPROM.get(z+8, nasos[2]);
EEPROM.get(z+12, nasos[3]);

// 4 ta hisoblagich yig'indisi uchun yangi keyingi qiymatni belgilash
sumprim = (nasos [0] + nasos [1] + nasos [2] + nasos [3]);

// yig'indisi o'zgaruvchisidagi 4 ta hisoblagich yig'indisining yangi qiymatini o'zgaruvchidagi oldingi qiymat bilan solishtiradi
// sumsek va agar oldingi yig'indi yangi summadan kichik yoki unga teng bo'lsa, yangi kattaroq yoki teng bo'ladi.
// sumsek qiymati.

agar (sumsek <= sumprim ) {
sumsec = sumprim; //

//va joriy qiymat z manzil o'zgaruvchisiga tayinlangan, z - 16 ta qiymatdan iborat 4 baytli blok boshining manzili
// bir vaqtning o'zida qayd etilgan hisoblagichlar (chunki portni so'rashda uning barcha 8 biti bir vaqtning o'zida yoziladi,
// D portining kerakli yuqori 4 bitini o'z ichiga oladi).
manzil = z;
}
}

// eeprom xotirasiga yana 16 ta qayd etilgan hisoblagich qiymatlarining 4 baytlik blokining boshidagi manzilga kirish
// oxirgi, ya'ni. muzlatish tufayli o'chirish yoki qayta ishga tushirishdan oldingi qiymatlar. Eng so'nggini yozib olish
// hisoblagich qiymatlarini 4 ta o'zgaruvchidan iborat qatorga kiriting.

EEPROM.get(manzil, nasos[0]);
EEPROM.get(manzil + 4, nasos[1]);
EEPROM.get(manzil + 8, nasos[2]);
EEPROM.get(manzil + 12, nasos[3]);

manzil += 16; //oxirgi yozuv ma'lumotlarini qayta yozmasdan keyingi blokni yozish uchun manzilni oshirish

//ma'lumotlarni qayta tiklash tugaydi///////////////////////////////////////// //////////////////

attachInterrupt(0, sanoq, ko'tarilmoqda); // PIN D2, uzilishlarni yoqing, har soniyada keling
// SQW chiqishidan RTC DS3231 dan impulslar

wdt_enable(WDTO_8S); // kuzatuv taymerini ishga tushiring, muzlab qolganda kontrollerni qayta yoqing, vaqt,
// buning uchun taymerni qayta o'rnatish buyrug'ini berishingiz kerak wdt_reset( va normal ish paytida qayta yuklashdan saqlaning - 8 sek.
// Sinovlar uchun qiymatni 8 soniyadan kamroq qilib qo'yish tavsiya etilmaydi, bu holda taymer qayta o'rnatiladi.
// jerking va bu har soniyada sodir bo'ladi.

}

void loop () {
// bo'sh tsikl, bu erda elektr motorining ochiq fazali ishlashi ustidan nazorat bo'ladi
}

bekor hisoblash() {

tft.setTextColor(ST7735_WHITE); // shrift rangini o'rnating
t = rtc.getTime(); // o'qish vaqti
tft.setCursor(5, 120); // kursor o'rnini o'rnatish
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // vaqtni chiqarish maydonini tozalash
tft.print(rtc.getTimeStr()); // soat ko'rsatkichlarini chiqarish

wdt_reset(); // har bir tsiklda, ya'ni soniyada qo'riqchi itni qayta o'rnating

uchun (rc = 0; rc < 4; rc ++) // kirish holatining muvofiqligini tekshirish siklining boshlanishi
// port bitlarini D port bitlarining oldingi o'qish holatiga
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // va agar mos kelmasa, u holda
pumrcounter[rc] = pinState; // port bit holati o'zgaruvchisiga yangi qiymatni belgilash 1/0
}
// rangni boshqarish ob'ektlarining holatini ko'rsatish
// BLUE - mavjud ekranning (yoki kutubxona?) kichik xatosi, RGB va BGR aralashtiriladi.
agar (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + siljish)), 7, 7, ST7735_BLUE); // past darajadagi hisoblash uchun YASHIL ni KO‘K ga o‘zgartiring
} Else {
tft.fillRect(15, ((rc * 10 + siljish)), 7, 7, ST7735_GREEN); // past darajadagi hisoblash uchun KO'Kni Yashilga o'zgartiring
nasos [rc] += 1; // ish vaqti hisoblagichiga 1 soniya qo'shing
}
}

k++;
agar (k == 36) {
k = 0;

tft.fillRect(30, siljish, 97, 40, ST7735_BLACK); // ish vaqtini ko'rsatish maydonini tozalash
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // va sanalar

tft.setCursor(60, 120); // kursor o'rnini o'rnatish
tft.print(rtc.getDateStr()); // LCD displeyda sanani ko'rsatish

uchun (rc = 0; rc < 4; rc ++) // ish soatlarini butun, o'ndan bir va
{
tft.setCursor ( 30, rc * 10 + shift ); // ekranni 10 pikselga pastga siljish bilan soatning yuzdan bir qismi
tft.println (nasos [rc] / m);
}

// EEPROM-ga "xom" ish soatlari qiymatlarini (soniyalarda) yozish ////////////////////////////

uchun (rc = 0; rc < 4; rc++)
{
EEPROM.put(manzil, nasos [rc]);
manzil += sizeof(float); // yozish manzili o'zgaruvchisini oshirish
}
}

// qancha bayt yuborilishi kerakligini ko'rsatuvchi ma'lumotlardan radiokanal orqali ma'lumotlarni yuborish.
agar ((k == 6 ) || (k == 18 ) || (k == 30 )) {

imzolanmagan uzun ma'lumotlar;

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

uchun (i = 0; i < 4; i++) {
ma'lumotlar = nasos [i];
radio.write( &data, sizeof(ma'lumotlar));
}
}
}

Oxirida bir nechta eslatma. Hisoblash kirishlarda past mantiqiy darajada sodir bo'ladi.

R2-R5 tortishish qarshiliklari GL36 fotorezistorlari bilan variant uchun 5516 kOhm. Fototransistorli optokupl va o'rni holatida 4,7-5,1 kOm ga o'rnatiladi. Arduino Nano v3.0 yuklash moslamasi qo'riqchi taymerining to'g'ri ishlashi uchun TL866A dasturchisi yordamida Arduino Uno bilan almashtirildi. Sigortalar 4,3 V dan yuqori kuchlanishlarda ishlash uchun tuzatilgan. R6 C3 tashqi qayta o'rnatish davri ishlatilmadi. Namuna dasturida transmitter chastotasi litsenziyalanmagan diapazonga mos kelmaydi, 2,4 MGts diapazoni 2400.0-2483.5 MGts chastotalar bilan cheklangan.

E01-ML01DP05 transmitterining diapazoni 2400-2525 MGts. Bir kanalning tarmoqli kengligi 1 MGts ni tashkil qiladi, tezlikni "RF24_2MBPS" sifatida o'rnatishda belgilangan radio.setChannel(120) kanali va keyingisi band bo'ladi, ya'ni. diapazon 2 MGts bo'ladi.

Manba: www.habr.com

a Izoh qo'shish