Mahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi)

Ushbu saytda boshlang aloqa.
Starterni yoqish haqidagi ma'lumotni olishning eng qulay varianti PC817 optokuplli variant bo'lib chiqdi. O'chirish sxemasiMahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi)Plitalar uchta bir xil sxemani o'z ichiga oladi, hamma narsa 100x100 mm o'lchamdagi ABS plastik qutilariga joylashtirilgan. Optokupllarning fotosuratiMahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi) Yarimo'tkazgichli vanalar bilan ishga tushirish moslamalariga ulanganda, ularning qochqin oqimi PC817 ni ochish uchun etarli va hisoblagich noto'g'ri ishga tushadi. Bunday vaziyatni istisno qilish uchun yana bittasi optokupl LED va ish ko'rsatkichi LED sxemasiga ketma-ket qo'shiladi. Buning uchun J1 jumper ochiladi va qo'shimcha LED LED1 lehimlanadi.
Qabul qiluvchi qism ustida amalga oshiriladi tomoni 1Mahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi)tomoni 2Mahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi)ARDUINO MEGA 2560 ga ulangan ishlab chiqish platasi. Buning uchun oxirida ikki qatorli ulagich ishlatiladi. Axborotni ko'rsatish moslamasi sifatida rezistiv sensorli ekran va harorat sensori bo'lgan 240x400 o'lchamli ekran ishlatiladi. HX8352B.Mahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi) Bundan tashqari, ekran kartasidagi ICSP ulagichi olib tashlanadi va micro SD uyasi ishlatilmaydi. Gap shundaki, SPI avtobusidagi ziddiyat tufayli "mahalliy" SD rozetkasidan foydalanib bo'lmaydi. Fleshli karta uchun 3,3V stabilizator va 74LVS125A uchta chiqish holatiga ega bufer chipini o'z ichiga olgan alohida kartani o'quvchi ishlatilgan. Bu yerda rake meni kutayotgan edi. Uch holatli bufer, lekin E01-ML01DP5 yoki kartani o'quvchi ishladi. Kutubxona sharhlarida SdFat boshqa qurilmalar bilan mos kelmasligi haqida ogohlantirishni ko'rdi. TXS0108E-dagi darajadagi konvertor olib tashlandi va o'rniga jumperlar o'rnatildi, chunki E01-ML01DP5 5V signallariga toqat qiladi - bu yordam bermadi. Osiloskop yordamida kartani o'quvchi ulanganda MISO liniyasida signal yo'qolishi aniqlandi. Ehtiyotkorlik bilan tekshirilgandan so'ng, 4LVS74A ning OE 125 kanallarining yoqish signallarining kirishlari oddiy simga lehimlanganligi va uchinchi holat haqida gap bo'lishi mumkin emasligi aniqlandi. Bufer chipi signal liniyalari bilan ketma-ket ulangan 5 KŌ rezistorlar yordamida 3.3V dan 3,3V gacha bo'lgan ibtidoiy darajadagi konvertor sifatida ishlatilgan. MISO liniyasidan tashqari. Uning chiqish pastki kaliti, ehtimol, signallarni yer darajasiga tortdi. MISO liniyasining yoqish signali 13-pin ekanligini aniqlab, u trekdan uzilib qoldi valehimlanganMahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi)9LVS74A CS qurilmasi o'rtasida kirish pinini (125) va tugatish qarshiligini tanlang. Endi, agar xotira kartasiga kirish imkoni bo'lmasa, MISO buferi o'chiriladi va boshqa qurilmaning ishlashiga xalaqit bermaydi.Rivojlanish paneli diagrammasiMahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi)Qabul qiluvchi ishlamoqdaMahalliy avtonom ma'lumotlarni yig'ish tizimi (davomi)DS3231 soatni ulash uchun dasturiy ta'minot I2C avtobusidan (TWI) foydalanadi.
Arduino IDE dasturi// MUHIM: Adafruit_TFTLCD KUTUBXONASI MAXSUS BO'LDI
// TFT QALQON YOKI UZISH BOSHLASH UCHUN SOZLANGAN.
// SOZLASH UCHUN Adafruit_TFTLCD.h SAYFASIDA TEAKLI MUHAMMOTLARNI QARING.
//Open-Smart Team va Catalex Team tomonidan
//[elektron pochta bilan himoyalangan]
//Do'kon: dx.com
// open-smart.aliexpress.com/store/1199788
//Namoyish funktsiyasi: Grafiklarni, belgilarni ko'rsatish
//Arduino IDE: 1.6.5
// Kengash: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Kengash: OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2 dyuymli TFT:
// 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:
// 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

#o'z ichiga oladi // Asosiy grafik kutubxonasi
//#shu jumladan // Uskunaga xos kutubxona
#o'z ichiga oladi
MCUFRIEND_kbv tft;
#include "SdFat.h" // SdFat kutubxonasidan foydalaning
SdFat SD;
SdFile fayli;
myFile fayli;
#SD_CS_PIN SSni aniqlang

#o'z ichiga oladi // SPI avtobusi bilan ishlash uchun kutubxonani ulang
#o'z ichiga oladi // RF24 kutubxonasidan sozlamalar faylini ulang
#o'z ichiga oladi // nRF24L24+ bilan ishlash uchun kutubxonani ulang
RF24 radiosi (47, 49);

#o'z ichiga oladi

DS3231 rtc(27, 25);
Vaqt t;

uint16_t r = 6000;
uint32_t k = 0;

o'zgaruvchan imzosiz uzoq ma'lumotlar;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

uint8_t quvur;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//**************************************************** ****************//
// Agar siz OPEN-SMART TFT sindirish taxtasidan foydalansangiz //
// 5V-3.3V darajadagi konvertatsiya qilish sxemasini qo'shishni tavsiya qilamiz.
// Albatta siz 5V/3.3V quvvat kaliti bilan OPEN-SMART UNO qora versiyasidan foydalanishingiz mumkin,
// siz shunchaki 3.3V ga o'tishingiz kerak.
// LCD uchun boshqaruv pinlari istalgan raqamli yoki
// analog pinlar... lekin biz analog pinlardan foydalanamiz, chunki bu bizga imkon beradi
//——————————————--|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO qora
// 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

// Ba'zi umumiy 16 bitli rang qiymatlariga odam o'qiy oladigan nomlarni tayinlang:
#define BLACK 0x0000
#define BLUE 0x001F
#QIZIL 0xF800 ni aniqlang
#GREEN 0x07E0 ni aniqlang
#CYAN 0x07FF ni aniqlang
#MAGENTA 0xF81F ni aniqlang
#SARI 0xFFE0ni aniqlang
#OQ 0xFFFFni aniqlang
#define GRAY 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Agar qalqon ishlatilsa, barcha boshqaruv va ma'lumotlar liniyalari o'rnatiladi va
// oddiyroq deklaratsiya ixtiyoriy ravishda ishlatilishi mumkin:
// Adafruit_TFTLCD tft;
uint16_t g_identifikatori;

String dataString;
//String numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//String *numfileMonth="1.txt" (sizeof (numfileMonth));
////////////////////////////////////////////// /////////////////

bekor o'rnatish (bekor) {

rtc.begin();

// Vaqtni belgilash uchun kerakli satrlarni izohdan olib tashlang
// rtc.setDOW(6); // Hafta kuni
// rtc.setTime(22, 04, 0); // Vaqt, 24 soatlik formatda.
// rtc.setDate(4, 5, 2019); // Sana, 29 yil 2018 oktyabr

Serial.begin (2000000);
//////// Ekranni ishga tushirish
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(to'g'ri);
/////////////////Nomlar, jihozlar aksessuarlari, tashkilot nomi chiqishi
tft.fillScreen(Qora);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("ISHLAB CHIQISHLAR VA QURISH");
tft.setCursor(30, 20);
tft.print (utf8rus("Konstruktor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
kechikish (2000);

radio.begin(); // nRF24L01+ ishini boshlash
radio.setChannel(120); // Ma'lumotni qabul qilish kanalini belgilang (0 dan 127 gacha)
radio.setDataRate(RF24_250KBPS); // Ma'lumot uzatish tezligini belgilang (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Transmitter quvvatini belgilang (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Ma'lumot olish uchun 1 ta uzatuvchi 1xAABBCCDD0 identifikatori bilan 11 quvurni oching
// Ma'lumot olish uchun 2xAABBCCDD2 transmitter identifikatorli 0-trubkani oching
radio.startListening(); // Qabul qilgichni yoqing, ochiq quvurlarni tinglashni boshlang
// radio.stopListening();
////////Xizmat ma'lumotlarining chiqishi
tft.fillScreen(Qora);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////SD kartani ishga tushirishni boshlang
Serial.println("Boshlang'ich SD-karta");
tft.println("Dastlabki SD-karta");
tft.setCursor(8, 10);
////////Kartani ishga tushirish
agar (!SD.begin(SD_CS_PIN)) {
Serial.println("boshlang'ich muvaffaqiyatsiz!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(Qora);
tft.println("Boshlang'ich bajarilmadi!");
qaytish;
}
tft.setTextColor(WHITE);
Serial.println("boshlash tugallandi");
tft.println("Initializatsiya tugallandi");
kechikish (2000);
////////Vaqt va sanani o'qish va ularni o'zgaruvchilarga belgilash
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Ko'rish uchun sana o'zgarishini kutmaslik uchun sanani majburan chiqarish
tft.setCursor(180, 0); // kursor o'rnini o'rnatish
tft.fillRect(178, 0, 65, 7, GRAY); // vaqtni chiqarish maydonini tozalash
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Boshqaruv obyektlarining nomini chiqarish
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
////////Jurnal faylini yaratish va yaratishga urinish natijasini chiqarish
tft.setTextSize(1);
tft.setCursor(130, 10); // agar log fayli 2.txt yaratilsa, faylga yozish davom etadi
agar (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open (perv, FILE_WRITE); // agar 2.txt fayli mavjud bo'lmasa, u yaratiladi
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

bo'sh halqa (bekor) {
////////MAQOMOTI port monitoriga jurnalni chiqarish so'rovi mavjudligini tekshirish
agar (Serial.available() > 0) {
agar (1 == Serial.read());
////////Va "1" qabul qilingan bo'lsa, u holda chiqish
Fayl myFile = SD.open(perv);
// agar fayl mavjud bo'lsa, unga yozing:
agar (mening faylim) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
boshqa {
Serial.println(".txt ochishda xatolik");
}
}
////////O'qish vaqti
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Agar vaqt o'zgargan bo'lsa, yangi soat ko'rsatkichlarini ko'rsating
agar (time_sec_prev != t.sec) {
tft.setCursor(120, 0); // kursor o'rnini o'rnatish
tft.fillRect(118, 0, 50, 7, GRAY); // vaqtni chiqarish maydonini tozalash
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // soat ko'rsatkichlarini chiqarish
time_sec_prev = t.sec;
}
////////Agar sana o'zgargan bo'lsa, yangi sanani ko'rsating
agar (time_day_prev != t.date) {
tft.setCursor(180, 0); // kursor o'rnini o'rnatish
tft.fillRect(178, 0, 65, 7, GRAY); // sanani ko'rsatish maydonini tozalash
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // sanani ko'rsatish
time_day_prev = t.date;
}
////////Agar radio qabul qilish mavjud bo'lsa, u holda
agar (radio.available(&pipe)) {
////////qabul qilish buferi to'lganligini tekshirish,
radio.read(&data, sizeof(ma'lumotlar));
////////agar kerakli transmitter manzili mavjud bo'lsa, u holda
agar (quvur == 1) {
////////aniqlash uchun nollarning sinxronlash ketma-ketligini kutish
//ma'lumotlar blokining boshlanishi
agar (ma'lumotlar == 0000) {
rc = 0;
} Else {
rc++;
}
////////Hisoblagich qiymatlarini yozib olish va ularni soatning 10 va 100 qismida hisoblash
agar (rc == 1) {
leb_1 = ma'lumotlar / 3600.0;
}

agar (rc == 2) {
leb_2 = ma'lumotlar / 3600.0;
}

agar (rc == 3) {
leb_3 = ma'lumotlar / 3600.0;
}

agar (rc == 4) {
leb_4 = ma'lumotlar / 3600.0;
}
}
}
r++;
k++; // shunchaki hisoblagich
//////// Ma'lumotlarni ma'lum davriylik bilan yangilash
agar (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;
}
////////Har 10 daqiqada SD-dagi jurnalga ma'lumotlarni yozing.
agar ((t.min % 10 == 0) && ( t.sek == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(Qora);
////////.csv formatida satr yaratish
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Faylga yozish va yozish jarayoni natijalarini chiqarish
myFile = SD.open (perv, FILE_WRITE); // “2.txt” nomli fayl bo'lmasa, u yaratiladi.
agar (mening faylim) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, YASIL);
tft.println("SD OK");
Serial.println("SD OK");
kechikish (900); // kechikish, aks holda soniya o'tmaguncha 13 ta bir xil o'qishni yozadi
} Else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Belgilarni aylantirish dasturi/* Rus shriftlarini UTF-8 dan Windows-1251 ga qayta kodlash */

String utf8rus (String manbai)
{
int i,k;
String maqsadi;
unsigned char n;
char m[2] = { '0', ' ' };

k = manba.uzunlik(); i = 0;

esa (i <k) {
n = manba[i]; i++;

agar (n >= 0xC0) {
kalit (n) {
0xD0 holati: {
n = manba[i]; i++;
agar (n == 0x81) { n = 0xA8; sindirish; }
agar (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
sindirish;
}
0xD1 holati: {
n = manba[i]; i++;
agar (n == 0x91) { n = 0xB8; sindirish; }
agar (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
sindirish;
}
}
}
m[0] = n; maqsad = maqsad + String(m);
}
qaytish maqsadi;
}Adafruit_GFX kutubxonasidan foydalangan holda kirill yozuvi uchun belgilarni transkodlash dasturi asosiy dastur bilan bir xil papkaga joylashtirilgan. Bundan tashqari, Adafruit_GFX da glcdfont.c faylini boshqa shrift bilan almashtirishingiz kerak. u zarur almashtirish bilan kutubxona. Russifikatsiya haqida ko'proq ma'lumotni Internetda osongina topish mumkin.
Xulosa qilib aytganda, tizim umidlarni oqladi, uskunaning ishlash vaqtini kuzatish osonroq bo'ldi. Hamma narsa non taxtalarida yig'ilgan bo'lsa ham, ish haqida darhol shikoyatlar yo'q. Birinchi elementlar olti oydan ortiq vaqt davomida ishladi va qishdan omon qoldi. Eng so'nggi dizayn U 9-martdan boshlab 5 ta boshqariladigan bloklar uchun ishlamoqda va uning yordamida ish vaqti rasman ro‘yxatga olinmoqda.

Manba: www.habr.com

a Izoh qo'shish