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

ابدأ في هذا الموقع رابط.
تبين أن الخيار الأكثر ملاءمة لاستعادة المعلومات حول تشغيل المبدئ هو الخيار مع optocoupler PC817. رسم تخطيطيالنظام المحلي المستقل للحصول على البيانات (تابع)تحتوي الألواح على ثلاث دوائر متطابقة، كل شيء موضوع في صناديق بلاستيكية ABS مقاس 100x100 ملم. صور من optocouplersالنظام المحلي المستقل للحصول على البيانات (تابع) عند توصيلها بأجهزة بدء التشغيل ذات صمامات أشباه الموصلات، يكون تيار التسرب الخاص بها كافيًا لفتح PC817 وسيعمل العداد بشكل خاطئ. لاستبعاد مثل هذه الحالة يتم إضافة واحد آخر على التوالي إلى دائرة LED optocoupler ومؤشر التشغيل LED. للقيام بذلك، يتم فتح وصلة العبور J1 ويتم لحام LED LED1 إضافي.
الجزء المتلقي مصنوع على الجانب 1النظام المحلي المستقل للحصول على البيانات (تابع)الجانب 2النظام المحلي المستقل للحصول على البيانات (تابع)لوحة التطوير متصلة بـ ARDUINO MEGA 2560. لهذا، يتم استخدام موصل مزدوج الصف في النهاية. يتم استخدام شاشة بدقة 240 × 400، تحتوي على شاشة لمس مقاومة ومستشعر لدرجة الحرارة، كجهاز لعرض المعلومات. HX8352B.النظام المحلي المستقل للحصول على البيانات (تابع) علاوة على ذلك، تتم إزالة الموصل إلى ICSP الموجود على لوحة الشاشة ولا يتم استخدام فتحة micro SD. الحقيقة هي أنه لا يمكن استخدام مقبس SD "الأصلي" بسبب وجود تعارض في ناقل SPI. بالنسبة لبطاقة الفلاش، تم استخدام قارئ بطاقات منفصل، والذي يتضمن مثبتًا بجهد 3,3 فولت وشريحة عازلة بثلاث حالات إخراج 74LVS125A. هذا هو المكان الذي كان أشعل النار ينتظرني. مخزن مؤقت ثلاثي الحالات، ولكن إما E01-ML01DP5 أو قارئ البطاقة يعمل. في تعليقات المكتبة، رأى SdFat تحذيرًا بشأن عدم التوافق مع الأجهزة الأخرى. تمت إزالة محول المستوى الموجود على TXS0108E واستبداله بوصلات العبور، لأنه E01-ML01DP5 متسامح مع إشارات 5V - ولم يساعد. باستخدام راسم الذبذبات، تم الكشف عن فقدان الإشارة على خط MISO عند توصيل قارئ البطاقة. بعد الفحص الدقيق، وجد أن مدخلات إشارات التمكين لقنوات OE 4 الخاصة بـ 74LVS125A كانت ملحومة ببساطة بسلك مشترك ولا يمكن الحديث عن أي حالة ثالثة. تم استخدام الشريحة العازلة كمحول مستوى بدائي من 5 فولت إلى 3.3 فولت باستخدام مقاومات 3,3 كيلو أوم متصلة على التوالي مع خطوط الإشارة. باستثناء خط MISO. من المحتمل أن يكون مفتاح الإخراج السفلي قد جذب الإشارات إلى مستوى الأرض. بعد تحديد أن إشارة التمكين لخط MISO كانت رقم 13، تم فصلها عن المسار وملحومالنظام المحلي المستقل للحصول على البيانات (تابع)بين جهاز 9LVS74A CS، حدد طرف الإدخال (125) ومقاوم الإنهاء. الآن، إذا لم يكن هناك إمكانية الوصول إلى بطاقة الذاكرة، فسيتم تعطيل المخزن المؤقت MISO ولا يتداخل مع تشغيل جهاز آخر.مخطط مجلس التنميةالنظام المحلي المستقل للحصول على البيانات (تابع)جهاز الاستقبال قيد التشغيلالنظام المحلي المستقل للحصول على البيانات (تابع)يستخدم DS3231 ناقل برنامج I2C (TWI) لتوصيل الساعة.
برنامج اردوينو IDE// هام: يجب أن تكون مكتبة Adafruit_TFTLCD على وجه التحديد
// تم تكوينه إما لدرع TFT أو لوحة الاختراق.
// راجع التعليقات ذات الصلة في Adafruit_TFTLCD.h للإعداد.
// بواسطة فريق Open-Smart وفريق Catalex
//[البريد الإلكتروني محمي]
//محل: dx.com
// open-smart.aliexpress.com/store/1199788
// الوظيفة التجريبية: عرض الرسومات والشخصيات
// بيئة تطوير اردوينو: 1.6.5
// اللوحة: Arduino UNO R3، Arduino Mega2560، Arduino Leonardo

// اللوحة: OPEN-SMART UNO R3 5V / 3.3V، Arduino UNO R3، Arduino Mega2560
// 3.2 بوصة تي اف تي:
// www.aliexpress.com/store/product/3-2-TFT-LCD-Display-module-Touch-Screen-Shield-board-onboard-temperature-sensor-w-Touch-Pen/1199788_32755473754.html?spm=2114.12010615.0.0.bXDdc3
// مفتوح-ذكي UNO R3 5V / 3.3V:
// www.aliexpress.com/store/product/OPEN-SMART-5V-3-3V-Compatible-UNO-R3-CH340G-ATMEGA328P-Development-Board-with-USB-Cable-for/1199788_32758607490.html?spm=2114.12010615.0.0.ckMTaN

#يشمل // مكتبة الرسومات الأساسية
//#يشمل // مكتبة خاصة بالأجهزة
#يشمل
MCUFRIEND_kbv tft;
#include "SdFat.h" // استخدم مكتبة SdFat
سدفات سد؛
ملف سد.
ملف myFile ؛
#تعريف SD_CS_PIN SS

#يشمل // قم بتوصيل المكتبة للعمل مع ناقل SPI
#يشمل // قم بتوصيل ملف الإعدادات من مكتبة RF24
#يشمل // قم بتوصيل المكتبة للعمل مع nRF24L24+
راديو RF24 (47، 49)؛

#يشمل

DS3231 رتك (27، 25)؛
الوقت ر؛

uint16_t r = 6000;
uint32_t ك = 0;

البيانات الطويلة المتقلبة غير الموقعة؛
تعويم leb_1؛
تعويم leb_2؛
تعويم leb_3؛
تعويم leb_4؛

uint8_t الأنابيب؛
كثافة العمليات RC = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//*************************************************** *******************/ /
// إذا كنت تستخدم لوحة فرعية OPEN-SMART TFT //
// ننصحك بإضافة دائرة تحويل مستوى 5V-3.3V.
// بالطبع يمكنك استخدام الإصدار الأسود OPEN-SMART UNO مع مفتاح الطاقة 5V/3.3V،
// تحتاج فقط إلى التبديل إلى 3.3 فولت.
// يمكن تعيين دبابيس التحكم الخاصة بشاشات الكريستال السائل إلى أي شاشة رقمية أو
// الدبابيس التناظرية...ولكننا سنستخدم الدبابيس التناظرية لأن هذا يسمح لنا بذلك
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO أسود
// جي إن دي - جي إن دي
// 3V3 - 3.3V
//CS - A3
// آر إس - A2
// دبليو آر - A1
// أردي - A0
// RST - إعادة تعيين
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// قم بتعيين أسماء يمكن قراءتها بواسطة الإنسان لبعض قيم الألوان الشائعة ذات 16 بت:
#تعريف الأسود 0x0000
#تعريف الأزرق 0x001F
#تعريف الأحمر 0xF800
#تعريف الأخضر 0x07E0
# تعريف سماوي 0x07FF
#تعريف أرجواني 0xF81F
#تعريف الأصفر 0xFFE0
#تعريف الأبيض 0xFFFF
# تعريف الرمادي 0x8C51
#تعريف الرمادي 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// في حالة استخدام الدرع، يتم إصلاح جميع خطوط التحكم والبيانات، و
// يمكن استخدام إعلان أبسط اختياريًا:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

سلسلة بيانات سلسلة؛
//String numfileMonth = "1.txt";
شار بيرف [] = {"2.txt"};
//String *numfileMonth="1.txt" (sizeof (numfileMonth));
////////////////////////////////////////////////// /////////////////

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

rtc.begin();

// لضبط الوقت، قم بإلغاء تعليق الأسطر الضرورية
// rtc.setDOW(6); // يوم من الأسبوع
// rtc.setTime(22, 04, 0); // الوقت بتنسيق 24 ساعة.
// rtc.setDate(4, 5, 2019); // التاريخ 29 أكتوبر 2018

Serial.begin (2000000) ؛
//////// تهيئة الشاشة
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(صحيح);
//////////////////إخراج الأسماء، ملحقات المعدات، اسم المنظمة
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("المطورون والبناء");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
التأخير (2000) ؛

راديو.begin(); // بدء العمل nRF24L01+
radio.setChannel(120); // حدد قناة استقبال البيانات (من 0 إلى 127)
radio.setDataRate(RF24_250KBPS); // حدد معدل نقل البيانات (RF24_250KBPS، RF24_1MBPS، RF24_2MBPS)، RF24_1MBPS - 1 ميجابت/ثانية
radio.setPALevel(RF24_PA_MAX); // حدد طاقة جهاز الإرسال (RF24_PA_MIN=-18dBm، RF24_PA_LOW=-12dBm، RF24_PA_HIGH=-6dBm، RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // افتح أنبوبًا واحدًا بمعرف جهاز إرسال واحد 1xAABBCCDD1 لتلقي البيانات
// افتح الأنبوب 2 بمعرف جهاز الإرسال 2xAABBCCDD0 لتلقي البيانات
radio.startListening(); // قم بتشغيل جهاز الاستقبال، وابدأ في الاستماع إلى الأنابيب المفتوحة
// radio.stopListening();
////////إخراج معلومات الخدمة
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
//////// ابدأ في تهيئة بطاقة SD
Serial.println("بطاقة SD الأولية");
tft.println("بطاقة SD الأولية");
tft.setCursor(8, 10);
////////تهيئة البطاقة
إذا (!SD.begin(SD_CS_PIN)) {
Serial.println ("فشل الأولي!")؛
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("فشل الأولي!");
العودة؛
}
tft.setTextColor(WHITE);
Serial.println("تم التهيئة");
tft.println("تم التهيئة");
التأخير (2000) ؛
////////قراءة الوقت والتاريخ وتخصيصهما للمتغيرات
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
//////// قم بإخراج التاريخ قسراً حتى لا تنتظر تغيير التاريخ للعرض
tft.setCursor(180, 0); // تحديد موضع المؤشر
tft.fillRect(178, 0, 65, 7, GRAY); // مسح منطقة إخراج الوقت
tft.setTextSize(1);
tft.print(rtc.getDateStr());
//////// إخراج اسم كائنات التحكم
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("الروافع أنا"));
//////// إنشاء ملف سجل وإخراج نتيجة محاولة الإنشاء
tft.setTextSize(1);
tft.setCursor(130, 10); // إذا تم إنشاء ملف السجل 2.txt، فستستمر الكتابة إلى الملف
إذا (SD. موجود (المنحرف)) {
//tft.setCursor(0, 90);
println(perv);
Serial.println(perv);
{} آخر
myFile = SD.open(perv, FILE_WRITE); // إذا كان الملف 2.txt غير موجود، فسيتم إنشاؤه
myFile.close () ،
println(perv);
Serial.println(perv);
}
}

حلقة باطلة (باطلة) {
//////// التحقق من وجود طلب لإخراج السجل إلى شاشة منفذ COM
إذا (Serial.available() > 0) {
إذا (1 == Serial.read());
//////// وإذا تم قبول "1"، فسيتم الإخراج
ملف myFile = SD.open(perv);
// إذا كان الملف متاحًا، فاكتب فيه:
إذا (ملفي) {
بينما (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close () ،
}
آخر {
Serial.println("خطأ في فتح ملف .txt");
}
}
////////وقت القراءة
t = rtc.getTime();
tft.setTextColor(WHITE);
////////إذا تغير الوقت، قم بعرض قراءات الساعة الجديدة
إذا (time_sec_prev != t.sec) {
tft.setCursor(120, 0); // تحديد موضع المؤشر
tft.fillRect(118, 0, 50, 7, GRAY); // مسح منطقة إخراج الوقت
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // قراءات ساعة الإخراج
time_sec_prev = t.sec;
}
////////إذا تغير التاريخ، قم بعرض التاريخ الجديد
إذا (time_day_prev != t.date) {
tft.setCursor(180, 0); // تحديد موضع المؤشر
tft.fillRect(178, 0, 65, 7, GRAY); // مسح منطقة عرض التاريخ
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // عرض قراءات التاريخ
time_day_prev = t.date;
}
////////إذا كان استقبال الراديو متاحًا، إذن
إذا (راديو. متاح (& الأنابيب)) {
//////// التحقق مما إذا كان مخزن الاستلام المؤقت ممتلئًا،
radio.read(&data, sizeof(data));
////////إذا كان عنوان جهاز الإرسال المطلوب متاحًا، إذن
إذا (الأنبوب == 1) {
////////في انتظار تحديد تسلسل متزامن للأصفار
// بداية كتلة البيانات
إذا (البيانات == 0000) {
اتفاقية روتردام = 0;
{} آخر
RC++;
}
////////تسجيل قيم العداد وحسابها في جزء من 10 و100 من الساعة
إذا (اتفاقية روتردام == 1) {
leb_1 = البيانات / 3600.0؛
}

إذا (اتفاقية روتردام == 2) {
leb_2 = البيانات / 3600.0؛
}

إذا (اتفاقية روتردام == 3) {
leb_3 = البيانات / 3600.0؛
}

إذا (اتفاقية روتردام == 4) {
leb_4 = البيانات / 3600.0؛
}
}
}
ص++;
ك++; // مجرد عداد
//////// تحديث البيانات بشكل دوري معين
إذا (ص >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GRAYD);
Serial.println("ليبيدكي الأول");
tft.setCursor(0, 41);
tft.println(leb_1);
Serial.println(leb_1);
tft.println(leb_2);
Serial.println(leb_2);
tft.println(leb_3);
Serial.println(leb_3);
tft.println(leb_4);
Serial.println(leb_4);
Serial.println(ك);
ص = 0؛
}
////////اكتب البيانات إلى السجل على SD كل 10 دقائق.
إذا ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////إنشاء سلسلة بتنسيق .csv
String dataString = String (rtc.getDateStr()) + "، "+(rtc.getTimeStr()) + "، " + (leb_1) + "، " + (leb_2)
+ "، " + (leb_3) + "، " + (leb_4) + "، "؛
//////// الكتابة إلى ملف وإخراج نتائج عملية الكتابة
myFile = SD.open(perv, FILE_WRITE); // إذا لم يكن هناك ملف اسمه "2.txt"، فسيتم إنشاؤه.
إذا (ملفي) {
myFile.println(dataString);
myFile.close () ،
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println("موافق SD");
Serial.println("SD موافق");
تأخير (900)؛ // تأخير، وإلا فإنه يسجل 13 قراءة متطابقة حتى مرور ثانية واحدة
{} آخر
tft.fillRect(198, 8, 42, 10, RED);
tft.println("خطأ SD");
Serial.println("خطأ SD");
}
}
}برنامج تحويل الحروف/* إعادة ترميز الخطوط الروسية من UTF-8 إلى Windows-1251 */

سلسلة utf8rus (مصدر السلسلة)
{
كثافة العمليات ط، ك؛
هدف السلسلة؛
حرف غير موقعة ن؛
شار m[2] = { '0', ' ' };

ك = المصدر. الطول ()؛ أنا = 0؛

بينما (ط < ك) {
ن = المصدر[i]; أنا++;

إذا (ن >= 0xC0) {
التبديل (ن) {
الحالة 0xD0: {
ن = المصدر[i]; أنا++;
إذا (ن == 0x81) { ن = 0xA8؛ استراحة؛ }
إذا (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
كسر؛
}
الحالة 0xD1: {
ن = المصدر[i]; أنا++;
إذا (ن == 0x91) { ن = 0xB8؛ استراحة؛ }
إذا (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
كسر؛
}
}
}
م[0] = ن; الهدف = الهدف + سلسلة (م)؛
}
هدف العودة؛
}يتم وضع برنامج تحويل ترميز الأحرف للإخراج السيريلي باستخدام مكتبة Adafruit_GFX في نفس المجلد مع البرنامج الرئيسي. تحتاج أيضًا إلى استبدال ملف glcdfont.c في Adafruit_GFX بخط مختلف. ومن المكتبة مع الاستبدال المطلوب. يمكن العثور بسهولة على مزيد من المعلومات حول الترويس على الإنترنت.
لتلخيص، سأقول أن النظام يرقى إلى مستوى التوقعات، وأصبح من الأسهل مراقبة وقت تشغيل المعدات. على الرغم من أن كل شيء يتم تجميعه على ألواح التجارب، إلا أنه لا توجد شكاوى فورية حول العمل. تعمل العناصر الأولى منذ أكثر من ستة أشهر وقد نجت من الشتاء. أحدث تصميم تم تشغيله لـ 9 وحدات خاضعة للرقابة منذ 5 مارس ويتم تسجيل وقت التشغيل رسميًا باستخدامه.

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

إضافة تعليق