سیستم جمع آوری داده های مستقل محلی

این شرکت پست های مانیتورینگ NEKST-M را خریداری کرد که در داخل توسط Next Technologies تولید می شد. برای اطمینان از تجسم عملکرد واحدهای پمپاژ،
اعلام حریق و امنیتی، وجود ولتاژ در استارت، دمای اتاق، سطح آب اضطراری. قلب NEKST-M ATMEGA 1280 است و این واقعیت از نظر امکان ایجاد کیت خود برای نیازهای خاص دلگرم کننده است.

وظیفه ایجاد یک سیستم اعزام محلی کاملاً مستقل برای نیازهای خاص در کمترین زمان ممکن و با حداقل هزینه تعیین شد. اساس یک میکروکنترلر است. توسعه، ساخت، ایجاد شده توسط خود کارکنان.

این سیستم باید بدون وابستگی به شبکه های سلولی، سرورها، اینترنت و سیستم مجوز برای استفاده از منابع فرکانس رادیویی کار کند، از رایانه در عملکرد سیستم نظارت و کنترل استفاده نکند یا حداکثر به طور دوره ای از لپ تاپ استفاده کند، بدون دسترسی به اشیاء برای مدت طولانی (6-9 ماه). پیکربندی شبکه دارای ساختار شعاعی است. داده ها در یک نقطه جمع آوری می شوند و سپس از طریق کانال های ارتباطی معمولی یا به صورت نسخه چاپی برای پردازش ارسال می شوند.

سیستم باید ارائه دهد:

  • نظارت بر عملکرد واحدهای پمپاژ
  • اتوماسیون تکنولوژیکی
  • محافظت در برابر عواقب شرایط اضطراری
  • سیگنالینگ اضطراری
  • محاسبه زمان عملیات
  • محاسبه مقدار برق مصرفی
  • کنترل دمای تجهیزات
  • امنیتی و اعلام حریق
  • ثبت اطلاعات از راه دور دوره ای
  • الزامات آینده ناشناخته

شرایط کاری:

  • منطقه تحت پوشش 1 کیلومتر مربع.
  • دید مستقیم بین اجسام
  • دما از 50+ تا 50- درجه سانتیگراد
  • رطوبت تا 100%
  • رسوبات فعال بیولوژیکی (کپک، باکتری های کاهنده سولفات)
  • ارتعاش، نه بیشتر، ماشین های کلاس های 1-2 طبق GOST ISO 10816-1-97
  • محیط الکترومغناطیسی - سوئیچینگ موتورهای الکتریکی با کنتاکتورهای KT 6053، تجهیزات راه اندازی نرم RVS-DN، تجهیزات کنترل PID SIEMENS MICROMASTER، تابش در محدوده ISM و GSM با توجه به الزامات این دستگاه ها، جوشکاری قوس الکتریکی دستی در محل
  • ولتاژ بیش از حد شبکه، وقفه های کوتاه مدت در منبع تغذیه، ولتاژهای صاعقه ای، عدم تعادل فاز زمانی که سیم خط هوایی در شبکه های توزیع 6-10 کیلو ولت می شکند.

با وجود چنین الزامات سخت گیرانه ای، پیاده سازی در هنگام حل گام به گام مشکل بسیار ساده است.

با در نظر گرفتن همه چیز، برد "Arduino Nano 3.0" به "مغز" این طرح تبدیل شد. برد robotdyn دارای یک کنترلر ATMEGA 328 است که تثبیت کننده ولتاژ 3,3 ولت لازم برای
جریان 800 میلی آمپر و تبدیل به CH340G UART-USB.

اول از همه، شمارنده های ساعت کار به عنوان به روز ترین ها ایجاد شدند. کنتورهای صنعتی استفاده شده قبلی که روی PIC ها با مدار منبع تغذیه بدون ترانسفورماتور مونتاژ شده بودند، به دلیل افزایش ولتاژ در یک سال پس از کار شکست خوردند. فقط آنهایی که با منبع تغذیه 5 ولتی خانگی وصل شده اند دست نخورده باقی مانده اند. برای سرعت بخشیدن به نصب و تطبیق پذیری اتصال، سیگنالی در مورد وضعیت واحدها از پایانه های دستگاه سوئیچینگ گرفته می شود، یعنی. ثبت وجود ولتاژ فاز 1 با منبع تغذیه سه فاز 380 ولت. برای هماهنگی با کنترلر، از یک رله میانی با سیم پیچ 220 ولت یا یک اپتوکوپلر متشکل از یک LED و یک مقاومت نوری GL5516 یا یک اپتوکوپلر PC817 استفاده می شود. همه گزینه ها تست شدند. LED توسط یک ولتاژ تصحیح شده با محدودیت جریان با استفاده از دو خازن SVV22 که برای ولتاژ 630 ولت به صورت سری به هم متصل شده اند برای ایمنی در هنگام آزمایش تصادفی مدارها با مگاهم متر تغذیه می شود.
خواندن قرائت زمان عملیاتی با استفاده از صفحه نمایش LCD ST7735S، انتقال داده در زمان واقعی از طریق رادیو با استفاده از ماژول E01-ML01DP05 در فرکانس 2,4 مگاهرتز. این دستگاه حاوی تراشه nRF24L01+ و تقویت کننده ارسال/دریافت RFX2401C است.
توان خروجی تا 100 مگاوات آنتن های حلزونی که برای برد مورد نظر در ماشین حساب آنلاین طراحی شده اند سایت. انتخاب نوع آنتن با محرومیت از دریافت امواج منعکس شده منفرد از سازه های فلزی اطراف تعیین می شود. قطعات آنتن بر روی یک چاپگر سه بعدی چاپ می شوند. وضعیت فعلی شمارنده ها در EEPROM خود کنترلر ذخیره می شود و در صورت قطع برق غیر منتظره بازیابی می شود. فواصل زمانی برای شمارش توسط تراشه RTC DS3 در قالب یک ماژول با باتری پشتیبان ارائه می شود. منبع تغذیه از 3231 ماژول استفاده می کند، منبع پالس واقعی 3/220V HLK-PM5 01mA، یک مبدل از 600-1V به 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 سال خواهد بود. زمان انجام کار ممکن اما تضمین نشده می تواند بسیار طولانی تر باشد.

مدارسیستم جمع آوری داده های مستقل محلی
برنامه در آردوینو IDE//12 بایت (328%)

#عبارتند از // کتابخانه گرافیکی هسته
#عبارتند از // کتابخانه مخصوص سخت افزار
#عبارتند از
#عبارتند از
#عبارتند از
#عبارتند از
#عبارتند از
رادیو RF24 (9، 10); // شیء رادیویی برای کار با کتابخانه RF24،
// و شماره پین ​​nRF24L01+ (CE، CSN)
#عبارتند از
DS3231 rtc (SDA، SCL)؛
زمان t;

//#define TFT_CS 10
#تعریف TFT_CS 8
#define TFT_RST -1 // همچنین می توانید این را به تنظیم مجدد آردوینو متصل کنید
// در این صورت، پین #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;
آرایه پمپ طولانی بدون علامت[4];// با مقادیر شمارنده 4 ثانیه
float m = 3600.0;
آدرس int بدون امضا = 0;
متغیر int rc;// برای شمارنده ها
sumprim طولانی بدون علامت = 0;
sumsec طولانی بدون علامت = 0;
بایت i = 0;
بایت k = 34;
int بدون علامت z = 0;
بایت b = B00000001;
بایت pumrcounter[4]; // آرایه برای ذخیره وضعیت های شی، 1 - خاموش، 0 - روشن.
int start = 0; //

void setup () {

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، زبانه سیاه را مقداردهی اولیه کنید
// اگر از TFT 1.44 اینچی استفاده می کنید، از این اولیه ساز (uncomment) استفاده کنید
//tft.initR(INITR_144GREENTAB); // یک تراشه ST7735S، برگه RED rcB را مقداردهی اولیه کنید
tft.setTextWrap(false); // اجازه دهید متن از لبه سمت راست خارج شود
tft.setRotation( 2 ); // برای PCB سیاه و قرمز و 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");

//بازیابی اطلاعات////////////////////////////////////////////// ///////////

برای ( 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 شمارنده
sumprim = (پمپ [0] + پمپ [1] + پمپ [2] + پمپ [3]);

// مقدار جدید مجموع 4 شمارنده در متغیر sumprim را با مقدار قبلی در متغیر مقایسه می کند.
// sumsec و اگر مجموع قبلی کمتر یا مساوی با مجموع جدید باشد، بزرگتر یا مساوی جدید تخصیص داده می شود.
// مقدار sumsec.

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

//و مقدار فعلی 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 ثانیه تنظیم کنید در این صورت ترجیحاً تایمر تنظیم مجدد شود.
// تکان، و هر ثانیه اتفاق می افتد.

}

void loop () {
// چرخه خالی، در اینجا کنترل بر عملکرد فاز باز موتور الکتریکی وجود خواهد داشت
}

تعداد خالی () {

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); // برای شمارش سطح پایین BLUE را به سبز تغییر دهید
پمپ [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( &data, sizeof( data));
}
}
}

چند نکته در پایان شمارش در یک سطح منطقی پایین در ورودی ها رخ می دهد.

مقاومت های کششی R2-R5 برای گزینه با مقاومت نوری GL36 5516 کیلو اهم است. در مورد اپتوکوپلر و رله فوتو ترانزیستور، روی 4,7-5,1 کیلو اهم تنظیم کنید. بوت لودر Arduino Nano v3.0 با Arduino Uno با استفاده از برنامه نویس TL866A برای عملکرد صحیح تایمر Watchdog جایگزین شد. فیوزها اصلاح شده اند تا در ولتاژهای بالاتر از 4,3 ولت کار کنند. مدار تنظیم مجدد خارجی R6 C3 استفاده نشده است. در برنامه نمونه، فرکانس فرستنده با محدوده بدون مجوز مطابقت ندارد؛ محدوده 2,4 مگاهرتز به فرکانس های 2400.0-2483.5 مگاهرتز محدود می شود.

برد فرستنده E01-ML01DP05 2400-2525 مگاهرتز است. پهنای باند یک کانال 1 مگاهرتز است، هنگام تنظیم سرعت به عنوان "RF24_2MBPS" کانال مشخص شده radio.setChannel(120) و کانال بعدی اشغال می شود، یعنی. باند 2 مگاهرتز خواهد بود.

منبع: www.habr.com

اضافه کردن نظر