نظام جمع البيانات المحلي المستقل

اشترت الشركة منشورات المراقبة 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، ومعدات التحكم SIEMENS MICROMASTER PID، والإشعاع في نطاق ISM وGSM وفقًا لمتطلبات هذه الأجهزة، واللحام القوسي اليدوي في الموقع
  • الجهد الزائد للشبكة، والانقطاعات قصيرة المدى في إمدادات الطاقة، والجهد الزائد البرق، وعدم توازن الطور عند انقطاع سلك الخط العلوي في شبكات التوزيع بجهد 6-10 كيلو فولت.

على الرغم من هذه المتطلبات الصارمة، فإن التنفيذ بسيط للغاية عند حل المشكلة خطوة بخطوة.

مع أخذ كل شيء في الاعتبار، أصبحت لوحة "Arduino Nano 3.0" هي "عقل" الخطة. تحتوي لوحة Robotdyn على وحدة تحكم ATMEGA 328، وهي مثبت الجهد الضروري بجهد 3,3 فولت
التيار 800 مللي أمبير ومحول إلى CH340G UART-USB.

بادئ ذي بدء، تم إنشاء عدادات ساعات العمل باعتبارها الأحدث. فشلت العدادات الصناعية المستخدمة سابقًا والتي تم تجميعها على PICs مع دائرة إمداد طاقة بدون محول بسبب ارتفاع الجهد خلال عام من التشغيل. فقط تلك المتصلة باستخدام مصادر طاقة 5 فولت محلية الصنع ظلت سليمة. لتسريع التثبيت وتعدد استخدامات الاتصال، يتم أخذ إشارة حول حالة الوحدات من أطراف أجهزة التبديل، أي. تسجيل وجود جهد المرحلة الأولى بمصدر طاقة ثلاثي الطور بقوة 1 فولت. للتنسيق مع وحدة التحكم، يتم استخدام مرحل وسيط بملف 380 فولت أو optocoupler يتكون من LED ومقاوم ضوئي GL220 أو optocoupler PC5516. تم اختبار جميع الخيارات. يتم تشغيل مؤشر LED بجهد مصحح مع تقييد التيار باستخدام مكثفين SVV817 مصممين لجهد 22 فولت متصلين على التوالي من أجل السلامة أثناء الاختبار العرضي للدوائر باستخدام مقياس الضخامة.
قراءة قراءات وقت التشغيل باستخدام شاشة LCD ST7735S، ونقل البيانات في الوقت الحقيقي عبر الراديو باستخدام وحدة E01-ML01DP05 بتردد 2,4 ميجاهرتز. يحتوي هذا الجهاز على شريحة nRF24L01+ ومضخم الإرسال/الاستقبال RFX2401C،
طاقة الإخراج تصل إلى 100 ميجاوات. هوائيات حلزونية مصممة للنطاق المطلوب في الآلة الحاسبة عبر الإنترنت сайта. يتم تحديد اختيار نوع الهوائي من خلال استبعاد استقبال الموجات المنعكسة بشكل فردي من الهياكل المعدنية المحيطة. تتم طباعة أجزاء الهوائي على طابعة ثلاثية الأبعاد. يتم تخزين الحالة الحالية للعدادات في EEPROM الخاص بوحدة التحكم نفسها ويتم استعادتها في حالة انقطاع التيار الكهربائي بشكل غير متوقع. يتم توفير الفواصل الزمنية للعد بواسطة شريحة RTC DS3 في شكل وحدة بها بطارية احتياطية. يستخدم مصدر الطاقة 3231 وحدات، مصدر النبض الفعلي 3/220 فولت HLK-PM5 01 مللي أمبير، محول من 600-1 فولت إلى 5 فولت HW-553 и معالج الرسوميات PowerVR - وحدة تحكم بالبطارية مع مخطط حماية ضد ماس كهربائى، الإفراط في التفريغ والشحن الزائد. تم شراء جميع المكونات على موقع 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 رتك (SDA، SCL)؛
الوقت ر؛

//#تعريف TFT_CS 10
#تعريف TFT_CS8
#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؛
بايت دبوس الدولة؛
مضخة طويلة غير موقعة [4]؛ // صفيف بقيم عداد 4 ثوانٍ
تعويم م = 3600.0؛
عنوان int غير الموقع = 0؛
int rc;// متغير للعدادات
مجموع طويل غير موقع = 0;
unsigned long sumsec = 0;
البايت ط = 0؛
بايت ك = 34؛
int غير الموقعة z = 0;
البايت ب = B00000001؛
عداد البايت [4] ؛ // مصفوفة لتخزين حالات الكائن، 1 - إيقاف، 0 - تشغيل.
بداية كثافة العمليات = 0؛ //

إعداد باطل () {

rtc.begin();
راديو.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 بوصة
//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 | ب00000000;
بورت = بورت | B11110000؛ // تشديد البرمجيات يعمل، مستوى عال -
// الكائنات التي يتم التحكم فيها "لا تعمل"، تتم كتابة "4" على جميع المنافذ الأربعة الرئيسية 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 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 عدادات
sumprim = (مضخة [0] + مضخة [1] + مضخة [2] + مضخة [3])؛

// يقارن القيمة الجديدة لمجموع 4 عدادات في المتغير sumprim مع القيمة السابقة في المتغير
// sumsec وإذا كان المجموع السابق أقل من أو يساوي المجموع الجديد، يتم تعيين الأكبر أو يساوي الجديد
// قيمة سامسيك.

إذا (سومسيك <= سومبريم) {
sumsec = sumprim; //

// ويتم تعيين القيمة الحالية z لمتغير العنوان، z هو عنوان بداية كتلة مكونة من 16 بايت مكونة من 4 قيم
// العدادات المسجلة في نفس الوقت (حيث أنه عند استقصاء المنفذ، تتم كتابة جميع البتات الثمانية منه في وقت واحد،
// بما في ذلك 4 بتات عالية ضرورية من المنفذ D).
العنوان = ض؛
}
}

// الوصول مرة أخرى إلى ذاكرة eeprom على عنوان بداية كتلة مكونة من 16 بايت من 4 قيم عداد مسجلة
// الأخير، أي القيم قبل إيقاف التشغيل أو إعادة التشغيل بسبب التجميد. تسجيل الأحدث
// عداد القيم في مجموعة من 4 متغيرات يتم ضخها.

EEPROM.get(address, Pump[0]);
EEPROM.get(address + 4, Pump[1]);
EEPROM.get(address + 8, Pump[2]);
EEPROM.get(address + 12, Pump[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(); // إعادة تعيين الوكالة الدولية للطاقة في كل دورة، أي ثانية

for (rc = 0; rc < 4; rc ++) // بداية الدورة للتحقق من امتثال حالة الإدخال
// بتات المنفذ إلى حالة القراءة السابقة لبتات المنفذ D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // وإذا لم يكن متطابقًا، إذن
pumrcounter[rc] = pinState; // تعيين متغير حالة بت المنفذ بقيمة جديدة 1/0
}
// إشارة إلى حالة كائنات التحكم في اللون
// BLUE هو خلل صغير في الشاشة الموجودة (أو المكتبة؟)، ويتم خلط RGB وBGR.
إذا (pinState == ( ب << RC )) {
tft.fillRect(15, ((rc * 10 + Shift))), 7, 7, ST7735_BLUE); // لحساب المستوى المنخفض قم بتغيير اللون الأخضر إلى اللون الأزرق
{} آخر
tft.fillRect(15, ((rc * 10 + Shift))), 7, 7, ST7735_GREEN); // لحساب المستوى المنخفض قم بتغيير اللون الأزرق إلى اللون الأخضر
مضخة [rc] += 1; // أضف ثانية واحدة إلى عداد وقت التشغيل
}
}

ك++;
إذا (ك == 36) {
ك = 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] / م);
}

// كتابة قيم ساعات التشغيل "الأولية" (بالثواني) إلى EEPROM //////////////////////////////

لـ (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, Pump [rc]);
عنوان += sizeof(float); // زيادة متغير عنوان الكتابة
}
}

// إرسال البيانات عبر قناة الراديو من البيانات التي تشير إلى عدد البايتات التي يجب إرسالها.
إذا ((ك == 6 ) || (ك == 18 ) || (ك == 30 )) {

بيانات طويلة غير موقعة؛

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

لـ (i = 0; i < 4; i++) {
البيانات = مضخة [i]؛
radio.write( &data, sizeof( data));
}
}
}

بعض الملاحظات في النهاية. يحدث العد عند مستوى منطقي منخفض عند المدخلات.

تبلغ مقاومة السحب R2-R5 36 كيلو أوم للخيار مع المقاومات الضوئية GL5516. في حالة جهاز optocoupler والترانزستور الضوئي ، يتم ضبطه على 4,7-5,1 كيلو أوم. تم استبدال محمل الإقلاع Arduino Nano v3.0 بـ Arduino Uno باستخدام مبرمج TL866A للتشغيل الصحيح لمؤقت المراقبة. تم تصحيح المصهرات لتعمل عند جهد أعلى من 4,3 فولت. ولم يتم استخدام دائرة إعادة الضبط الخارجية R6 C3. في برنامج العينة، لا يتوافق تردد جهاز الإرسال مع النطاق غير المرخص؛ يقتصر نطاق 2,4 ميجاهرتز على الترددات 2400.0-2483.5 ميجاهرتز.

نطاق جهاز الإرسال E01-ML01DP05 هو 2400-2525 ميجا هرتز. عرض النطاق الترددي لقناة واحدة هو 1 ميجا هرتز، عند ضبط السرعة على "RF24_2MBPS"، سيتم شغل قناة radio.setChannel(120) المحددة والقناة التالية، أي. سيكون النطاق 2 ميجا هرتز.

المصدر: www.habr.com

إضافة تعليق