نظام الحصول على البيانات المحلية المستقلة

استمرار هذه المادة
اشترت الشركة وظائف مراقبة NEXT-M للإنتاج المحلي NEXT Technologies. لضمان التصور لتشغيل وحدات الضخ ،
إنذار الحريق ، والجهد في البداية ، ودرجة حرارة الغرفة ، ومستوى المياه في حالات الطوارئ. قلب NEXT-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.3V اللازم
800 مللي أمبير الحالية وتحويلها إلى CH340G UART-USB.

بادئ ذي بدء ، تم إنشاء عدادات وقت التشغيل على أنها الأكثر صلة. في السابق ، فشلت العدادات الصناعية المستخدمة سابقًا والتي تم جمعها على بلدان جزر المحيط الهادئ مع دائرة تزويد الطاقة غير القابلة للتحويل من ارتفاع التيار الكهربائي خلال عام التشغيل. بقي فقط سليمة بمساعدة من امدادات الطاقة المنزلية ل 5 V سليمة. لتسريع عملية التثبيت وعالمية التوصيل ، يتم أخذ إشارة على حالة الوحدات من أطراف أجهزة التبديل ، أي تسجيل وجود المرحلة الأولى من الجهد مع 380V امدادات الطاقة على ثلاث مراحل. للتنسيق مع وحدة التحكم ، يتم استخدام مرحل وسيط مع لف 220 فولت أو optocoupler يتكون من LED و photoresistor GL5516 أو optocouple PC817. تم اختبار جميع الخيارات. يتم تشغيل LED بواسطة جهد مصحح مع تحديد التيار باستخدام المكثفات CBB22 المصممة للجهد من 630V ومتصلة في سلسلة للسلامة أثناء الفحص العشوائي للدوائر مع megohmmeter.
قراءة وقت التشغيل باستخدام شاشة LCD ST7735S ، ونقل البيانات في الوقت الحقيقي عبر الأثير باستخدام وحدة E01-ML01DP05 بتردد 2.4 ميجا هرتز. يحتوي هذا الجهاز على شريحة + nRF24L01 ومضخم استقبال واستقبال RFX2401C ،
انتاج الطاقة تصل إلى 100 ميغاواط. هوائيات دوامة مصممة للنطاق المطلوب في الحاسبة عبر الإنترنت للموقع . يرجع اختيار نوع الهوائي إلى استبعاد استقبال الموجات المنعكسة من الهياكل المعدنية المحيطة. تتم طباعة أجزاء الهوائي على طابعة ثلاثية الأبعاد. يتم تخزين الحالة الحالية للعدادات في EEPROM لوحدة التحكم نفسها وتتم استعادتها في حالة انقطاع التيار الكهربائي بشكل غير متوقع. يتم توفير الفواصل الزمنية للعد بواسطة شريحة RTC DS3231 في شكل وحدة نمطية مع بطارية احتياطية. يتم استخدام ثلاث وحدات في وحدة تزويد الطاقة ، ومصدر النبض HLK-PM01 600mA 220 / 5V نفسه ، ومحول HW-553 و 03962A من 1-5V إلى 5V هي وحدة تحكم البطارية مع دائرة حماية ضد الدائرة القصيرة ، والإفراط في الشحن الزائد. تم شراء جميع المكونات على موقع Aliexpress.

مجلس النماذج
بديل الصورة

4 قنوات مضادة. عند المدخلات توجد فلاتر LC للحماية من التداخل على خط اتصال الزوج الملتوي. تتم قراءة البيانات المتعلقة بحالة عناصر التحكم باستمرار مرة واحدة في الثانية ، ويتم عرضها بالألوان على شاشة LCD. يتم تحديث القراءات وتسجيلها في ذاكرة غير متقلبة كل 36 ثانية. 36 ثانية ، أي 1/100 ساعة ، وفي هذا التنسيق تكون البيانات مطلوبة. كل 12 ثانية يتم نقل المعلومات على عدد ثواني العملية لكل وحدة التحكم. تحتوي ذاكرة EEPROM على عدد محدود من دورات محو الكتابة ، وفقًا لما ذكرته الشركة المصنعة ، 100،000 مرة. أسوأ خيار هو عندما يتم تحديث خلية واحدة على الأقل باستمرار. حجم العداد الأول هو 4 بايت ، وهذا رقم تنسيق طويل ، 4 عدادات ، أي ما مجموعه 16 بايت يستغرق سجل واحد. يبلغ طول ذاكرة الشريحة 1024 بايت ، وبعد 64 إدخالًا من 4 عدادات ، سيبدأ التسجيل من جديد. في مكتبة EEPROM ، لا تسجل طريقة EEPROM.put ، إذا كانت قيمة الخلية والمعلومات التي تتم كتابتها متطابقة ، فلن يكون هناك أي تدهور للخلايا. نتيجة لذلك ، فإن مدة تشغيل الذاكرة المضمونة ستكون أكثر من 7 سنوات. يمكن أن يكون وقت العمل الممكن ، لكن غير المبرر ، أطول من ذلك بكثير.

مخطط الدائرة
بديل الصورة

برنامج في اردوينو IDE
// 12 328 بايت (38 ٪)

# تضمين <Adafruit_GFX.h> // مكتبة الرسومات الأساسية
#include <Adafruit_ST7735.h> // مكتبة خاصة بالأجهزة
# تضمين <SPI.h>
# تضمين <EEPROM.h>
# تشمل <Wire.h>
# تتضمن <nRF24L01.h>
# تضمين <RF24.h>
راديو RF24 (9 ، 10) ؛ كائن راديو // للعمل مع مكتبة RF24 ،
// والرقم السريري nRF24L01 + (CE ، CSN)
# تتضمن <DS3231.h>
DS3231 rtc (SDA ، SCL) ؛
الوقت ر ؛

// # حدد TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // يمكنك أيضًا توصيل هذا بإعادة تعيين Arduino
/ / في هذه الحالة ، قم بتعيين رقم التعريف الشخصي هذا على -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) ؛
# تضمين <avr / wdt.h>

تحول البايت = 52 ؛
بايت pinState.
مضخة طويلة غير موقعة [4] ؛ / / مجموعة مع 4 ثواني التهم
تعويم م = 3600.0 ؛
عنوان int غير موقَّع = 0 ؛
كثافة العمليات RC ؛ // متغير للعدادات
sumprim طويلة غير موقعة = 0 ؛
sumsec طويلة غير موقعة = 0؛
البايتة = 0 ؛
بايت ك = 34 ؛
unigned int z = 0؛
البايتة = 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) ؛ // افتح الأنبوب مع المعرف لنقل البيانات

// لضبط الوقت ، uncomment الأسطر اللازمة
//rtc.setDOW(1)؛ // يوم الأسبوع
//rtc.setTime(21، 20، 0)؛ // الوقت ، في شكل 24 ساعة.
//rtc.setDate(29، 10، 2018)؛ // التاريخ ، 29 أكتوبر 2018

tft.initR (INITR_BLACKTAB) ؛ // تهيئة شريحة ST7735S ، علامة تبويب سوداء
/ / استخدم أداة التهيئة هذه (uncomment) إذا كنت تستخدم 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 ؛ // يعمل تشديد البرامج ، مستوى عال
// الكائنات التي تتم مراقبتها "لا تعمل" ، تتم كتابة "1" على جميع المنافذ الأربعة العليا في D ، ولا يذهب الحساب.

لـ (rc = 0 ؛ rc <4 ؛ rc ++)
{
tft.setCursor (3 ، rc * 10 + shift) ؛ // عرض عدد المواضع من عناصر التحكم
tft.print (rc + 1) ؛
}

tft.setCursor (12، 0)؛ // إخراج 3 أسطر من النص
tft.println ("DEVELOPERS & BUILD")؛ // للاشادة بأحبائك
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، pump [0])؛ // لذلك ، دون حلقة ، حجم أقل
EEPROM.get (z + 4، pump [1])؛
EEPROM.get (z + 8 ، مضخة [2]) ؛
EEPROM.get (z + 12 ، مضخة [3]) ؛

// تعيين قيمة تالية جديدة لمجموع عدادات 4 ×
سومبريم = (مضخة [0] + مضخة [1] + مضخة [2] + مضخة [3]) ؛

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

if (sumsec <= sumprim) {
سومسيك = سومبريم //

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

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

EEPROM.get (العنوان ، المضخة [0]) ؛
EEPROM.get (عنوان + 4 ، مضخة [1]) ؛
EEPROM.get (عنوان + 8 ، مضخة [2]) ؛
EEPROM.get (عنوان + 12 ، مضخة [3]) ؛

عنوان + = 16 ؛ زيادة العنوان لكتابة الكتلة التالية دون الكتابة فوق بيانات السجل الأخير

// end of recovery recovery /////////////////////////////////////////////// ///////////////////

attachInterrupt (0، count، RISING)؛ // pin D2 ، قم بتمكين العملية المقاطعة ، كل ثانية يصلون إليها
// نبضات من RTC DS3231 من خرج SQW

wdt_enable (WDTO_8S) ؛ / / بدء مؤقت الوكالة الدولية للطاقة ، إعادة تمهيد وحدة تحكم في حالة حدوث تعليق ، والوقت ،
// التي تحتاج إلى إرسال الأمر wdt_reset timer 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.
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 إلى GREEN
مضخة [rc] + = 1 ؛ / / أضف ثانية واحدة إلى عداد وقت التشغيل
}
}

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

// record قيم وقت التشغيل "الأولية" (بالثواني) في EEPROM ////////////////////////////

لـ (rc = 0 ؛ rc <4 ؛ rc ++)
{
EEPROM.put (العنوان ، المضخة [rc]) ؛
عنوان + = sizeof (تعويم) ؛ // زيادة متغير عنوان السجل
}
}

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

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

radio.write (& start ، sizeof (start)) ؛

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

بعض التعليقات في النهاية. يذهب الحساب عند مستوى منطقي منخفض عند المدخلات.
مقاومة التعليق R2-R5 36 كيلو أوم للنسخة باستخدام GL5516 مقاوم الضوء. في حالة محولات الضوئيات والمرحلات الكهروضوئية ، قم بتوفير 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" القناة المحددة للإذاعة. قناة القناة (120) والقناة التالية ، أي ، ستشغل الفرقة ستكون 2 ميغاهيرتز.
تمديد

Source: https://habr.com/ru/post/ar447168/


All Articles