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

ابدأ في هذا الموقع على الرابط .

تبين أن الخيار الأكثر ملاءمة لاستخدام المعلومات المتعلقة ببدء التشغيل هو الخيار مع optocoupler PC817.

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

تحتوي الألواح على ثلاث دوائر متطابقة ، يتم وضع كل شيء في صناديق مصنوعة من بلاستيك ABS ، مقاس 100x100 مم.

optocoupler الصورة
بديل الصورة

عند توصيله بالمبتدئين بصمامات أشباه الموصلات ، فإن تيار التسريب الخاص بهم يكفي لفتح PC817 وستكون هناك عملية كاذبة مضادة. للقضاء على هذا الوضع بالتتابع ، تتم إضافة واحدة أخرى إلى دائرة LED optocoupler و LED مؤشر التشغيل. للقيام بذلك ، يتم فتح العبور J1 ولحام LED1 إضافي.

الجزء المتلقي مصنوع على

الجانب 1
بديل الصورة

الجانب 2
بديل الصورة

لوحة توصيل متصلة بـ ARDUINO MEGA 2560. لهذا الغرض ، يتم استخدام موصل من صفين في النهاية. يتم استخدام شاشة بدقة 240 × 400 كجهاز عرض معلومات.

HX8352B.
بديل الصورة

علاوة على ذلك ، يتم تفكيك الموصل إلى ICSP على لوحة الشاشة ولا يتم استخدام فتحة SD الصغيرة. الحقيقة هي أنه لا يمكن استخدام فتحة SD "الأصلية" بسبب وجود تعارض في ناقل SPI. تم استخدام قارئ بطاقة منفصل مع استقرار 3.3 فولت وشريحة عازلة مع ثلاث حالات من المخرجات 74LVS125A لبطاقة فلاش. هنا أشعل النار كان ينتظرني. مخزن مؤقت يحتوي على ثلاث حالات ، لكنه يعمل إما E01-ML01DP5 أو قارئ بطاقة. في تعليقات مكتبة SdFat ، رأيت تحذيرًا بشأن عدم التوافق مع الأجهزة الأخرى. تمت إزالة محول مستوى على TXS0108E واستبدالها لاعبا ، كما E01-ML01DP5 متسامح لإشارات 5V - لم يساعد. باستخدام مرسمة الذبذبات ، تم اكتشاف فقد إشارة على خط MISO عند توصيل قارئ البطاقة. عند الفحص الدقيق ، وجد أن مدخلات الإشارات التمكينية OE لـ 4 قنوات 74LVS125A كانت ملحومة ببساطة بسلك شائع ولا يمكن الحديث عن أي حالة ثالثة. تم استخدام رقاقة العازلة كمحول المستوى البدائي من 5V إلى 3.3V باستخدام المقاومات 3.3 KOhm متصلة في سلسلة مع خطوط الإشارة. بالإضافة إلى خط MISO. ناتجها السفلي ربما سحب الإشارات إلى الأرض. بعد تحديد أن الإشارة الممكّنة لخط MISO هي السن رقم 13 ، فقد تمزقت من المسار و

ملحوم
بديل الصورة

بين إخراج المدخلات (9) 74LVS125A لاختيار جهاز CS ومقاوم الإنهاء. الآن ، إذا لم يكن هناك وصول إلى بطاقة الذاكرة ، فسيتم تعطيل مخزن MISO المؤقت ولا يتعارض مع تشغيل جهاز آخر.

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

استقبال في العمل
بديل الصورة

لتوصيل الساعة بـ DS3231 ، يتم استخدام ناقل برنامج I2C (TWI).

برنامج اردوينو IDE
// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY // CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD. // SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP. //by Open-Smart Team and Catalex Team //catalex_inc@163.com //Store: http://dx.com // https://open-smart.aliexpress.com/store/1199788 //Demo Function: Display graphics, characters //Arduino IDE: 1.6.5 // Board: Arduino UNO R3, Arduino Mega2560,Arduino Leonardo // Board:OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560 //3.2INCH TFT: // https://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 //OPEN-SMART UNO R3 5V / 3.3V: // https://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 #include <Adafruit_GFX.h> // Core graphics library //#include <Adafruit_TFTLCD.h> // Hardware-specific library #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft; #include "SdFat.h" // Use the SdFat library SdFat SD; SdFile file; File myFile; #define SD_CS_PIN SS #include <SPI.h> //       SPI #include <nRF24L01.h> //      RF24 #include <RF24.h> //      nRF24L01+ RF24 radio(47, 49); #include <DS3231.h> DS3231 rtc(27, 25); Time t; uint16_t r = 6000; uint32_t k = 0; volatile unsigned long data; float leb_1; float leb_2; float leb_3; float leb_4; uint8_t pipe; int rc = 0; uint8_t time_sec_prev; uint8_t time_day_prev; //***********************************************// // If you use OPEN-SMART TFT breakout board // // Reconmmend you to add 5V-3.3V level converting circuit. // Of course you can use OPEN-SMART UNO Black version with 5V/3.3V power switch, // you just need switch to 3.3V. // The control pins for the LCD can be assigned to any digital or // analog pins...but we'll use the analog pins as this allows us to //----------------------------------------| // TFT Breakout -- Arduino UNO / Mega2560 / OPEN-SMART UNO Black // GND -- GND // 3V3 -- 3.3V // CS -- A3 // RS -- A2 // WR -- A1 // RD -- A0 // RST -- RESET // LED -- GND // DB0 -- 8 // DB1 -- 9 // DB2 -- 10 // DB3 -- 11 // DB4 -- 4 // DB5 -- 13 // DB6 -- 6 // DB7 -- 7 // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define GRAY 0x8C51 #define GRAYD 0x39E7 //Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); // If using the shield, all control and data lines are fixed, and // a simpler declaration can optionally be used: // Adafruit_TFTLCD tft; uint16_t g_identifier; String dataString; //String numfileMonth ="1.txt"; char perv [] = {"2.txt"}; //String *numfileMonth="1.txt" (sizeof (numfileMonth)); /////////////////////////////////////////////////////////////////// void setup(void) { 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(true); ////////////////// ,  ,   tft.fillScreen(BLACK); tft.setTextColor(WHITE); tft.setTextSize(2); tft.setCursor (8, 0); tft.println ("DEVELOPERS & BUILD" ); tft.setCursor (30, 20); tft.print (utf8rus(" .." )); tft.setCursor (40, 40); tft.print (utf8rus(" .." )); delay (2000); radio.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); //  1    1  0xAABBCCDD11,    //  2    2  0xAABBCCDD22,    radio.startListening (); //  ,     // radio.stopListening (); ////////   tft.fillScreen(BLACK); tft.setCursor (8, 0); tft.setTextSize(1); ////////  SD  Serial.println("Initial SD card"); tft.println("Initial SD card"); tft.setCursor (8, 10); ////////  if (!SD.begin(SD_CS_PIN)) { Serial.println("initial failed!"); tft.fillRect ( 8 , 10 , 85 , 7 , RED); tft.setTextColor(BLACK); tft.println("Initial failed!"); return; } tft.setTextColor(WHITE); Serial.println("initialization done"); tft.println("Initialization done"); delay (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(" I")); ////////        tft.setTextSize(1); tft.setCursor(130, 10); //    2.txt ,       if (SD.exists (perv)) { //tft.setCursor(0, 90); tft.println(perv); Serial.println(perv); } else { myFile = SD.open(perv, FILE_WRITE); //   2.txt ,     myFile.close(); tft.println(perv); Serial.println(perv); } } void loop(void) { ////////       -  if (Serial.available() > 0) { ////////    ,       File myFile = SD.open(perv); // if the file is available, write to it: if (myFile) { while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } else { Serial.println("error opening .txt"); } } ////////  t = rtc.getTime(); tft.setTextColor(WHITE); ////////  ,      if ( 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; } ////////  ,     if ( 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; } ////////  ,  if (radio.available(&pipe)) { ////////   , radio.read(&data, sizeof(data)); ////////    ,  if (pipe == 1) { ////////      //   if ( data == 0000 ) { rc = 0; } else { rc ++; } ////////       10  100-   if ( rc == 1 ) { leb_1 = data / 3600.0; } if ( rc == 2 ) { leb_2 = data / 3600.0; } if ( rc == 3 ) { leb_3 = data / 3600.0; } if ( rc == 4 ) { leb_4 = data / 3600.0; } } } r ++; k ++; //   ////////       if ( r >= 6500) { tft.setTextSize(2); tft.fillRect ( 0 , 41 , 180 , 64 , GRAYD); Serial.println ("Lebedki I"); 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 (k); r = 0; } ////////     SD  10 . if ((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" - ,    . if (myFile) { myFile.println(dataString); myFile.close(); tft.fillRect ( 198 , 8 , 42 , 10 , GREEN); tft.println("SD OK"); Serial.println("SD OK"); delay (900); // ,   13  ,     } else { tft.fillRect ( 198 , 8 , 42 , 10 , RED); tft.println("SD ERR"); Serial.println("SD ERR"); } } } 

برنامج ترميز الأحرف
 /* Recode russian fonts from UTF-8 to Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB8; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F break; } } } m[0] = n; target = target + String(m); } return target; } 

يتم وضع برنامج تحويل الأحرف للإخراج السيريلي بواسطة مكتبة Adafruit_GFX في نفس المجلد مثل البرنامج الرئيسي. تحتاج أيضًا إلى استبدال ملف glcdfont.c بخط مختلف في Adafruit_GFX. هنا المكتبة مع استبدال المطلوبة. يمكن البحث بسهولة عن الترويس على الإنترنت.

للتلخيص ، سأقول إن النظام حقق التوقعات ، أصبح من السهل مراقبة وقت تشغيل المعدات. على الرغم من أن كل شيء يتم تجميعه على ألواح ، لا توجد شكاوى حول العمل على وجه الاستعجال.

تعمل العناصر الأولى منذ أكثر من ستة أشهر ونجت من الشتاء. يعمل أحدث تصميم لـ 9 وحدات خاضعة للمراقبة منذ 5 مارس وهو بالفعل تسجيل وقت العمل الرسمي.

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


All Articles