Տեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն)

Սկսեք այս կայքում по ссылке.
Ստարտերը միացնելու մասին տեղեկություններ ստանալու ամենահարմար տարբերակը պարզվեց, որ PC817 օպտոկապլերի տարբերակն է: միացման դիագրամՏեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն)Տախտակները պարունակում են երեք միանման սխեմաներ, ամեն ինչ տեղադրված է ABS պլաստմասե տուփերում, 100x100 մմ չափսի: Օպտոկապլերների լուսանկարՏեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն) Երբ միացված է մեկնարկային սարքերին կիսահաղորդչային փականներով, դրանց արտահոսքի հոսանքը բավարար է PC817-ը բացելու համար, և հաշվիչը սխալ կաշխատի: Նման իրավիճակը բացառելու համար ևս մեկը հաջորդաբար ավելացվում է օպտիկազուգորդիչ LED-ի շղթային և շահագործման ցուցիչի LED-ին: Դա անելու համար բացվում է Jumper J1-ը և զոդվում է լրացուցիչ LED LED1:
Ընդունող մասը պատրաստված է կողմ 1Տեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն)կողմ 2Տեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն)զարգացման տախտակ միացված է ARDUINO MEGA 2560-ին: Դրա համար վերջում օգտագործվում է երկշարք միակցիչ: Որպես տեղեկատվության ցուցադրման սարք օգտագործվում է 240x400 լուծաչափով էկրան, որն ունի դիմադրողական սենսորային էկրան և ջերմաստիճանի ցուցիչ։ HX8352B.Տեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն) Ավելին, էկրանի տախտակի վրա ICSP-ի միակցիչը հանվում է, և միկրո SD բնիկը չի օգտագործվում: Փաստն այն է, որ «հայրենի» SD վարդակից չի կարող օգտագործվել SPI ավտոբուսի կոնֆլիկտի պատճառով: Ֆլեշ քարտի համար օգտագործվել է առանձին քարտի ընթերցող, որը ներառում էր 3,3V կայունացուցիչ և բուֆերային չիպ երեք ելքային վիճակով՝ 74LVS125A: Այստեղ էր ինձ սպասում փոցխը։ Երեք վիճակի բուֆեր, բայց կամ E01-ML01DP5 կամ քարտի ընթերցիչը աշխատել է: Գրադարանի մեկնաբանություններում SdFat-ը տեսավ նախազգուշացում այլ սարքերի հետ անհամատեղելիության մասին: TXS0108E-ի մակարդակի փոխարկիչը հանվել է և փոխարինվել է ցատկողներով, քանի որ E01-ML01DP5-ը հանդուրժող է 5V ազդանշանների նկատմամբ, դա չօգնեց: Օքսիլոսկոպի միջոցով MISO գծում ազդանշանի կորուստ է հայտնաբերվել, երբ միացված է քարտի ընթերցիչը: Մանրակրկիտ ուսումնասիրության արդյունքում պարզվել է, որ 4LVS74A-ի OE 125 ալիքների միացնող ազդանշանների մուտքերը պարզապես զոդվել են ընդհանուր մետաղալարով, և որևէ երրորդ վիճակի մասին խոսք լինել չի կարող: Բուֆերային չիպը օգտագործվել է որպես պարզունակ մակարդակի փոխարկիչ՝ 5V-ից մինչև 3.3V՝ օգտագործելով 3,3 KΩ լարման ռեզիստորներ, որոնք միացված են ազդանշանային գծերի հետ սերիայով: Բացառությամբ MISO գծի: Նրա ելքային ներքևի անջատիչը, հավանաբար, ազդանշաններ է գրավել դեպի գետնի մակարդակ: Որոշելով, որ MISO գծի միացման ազդանշանը 13-րդ փինն է, այն պոկվել է երթուղուց ևզոդվածՏեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն)9LVS74A CS սարքի միջև ընտրեք մուտքային փին (125) և ավարտական ​​ռեզիստորի միջև: Այժմ, եթե հիշողության քարտին հասանելիություն չկա, MISO բուֆերն անջատված է և չի խանգարում այլ սարքի աշխատանքին:Զարգացման տախտակի դիագրամՏեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն)Ընդունիչը գործում էՏեղական ինքնավար տվյալների հավաքագրման համակարգ (շարունակություն)DS3231-ը ժամացույցը միացնելու համար օգտագործում է ծրագրային I2C ավտոբուս (TWI):
Arduino IDE ծրագիր// ԿԱՐԵՎՈՐ Է. Adafruit_TFTLCD գրադարանը պետք է լինի հատուկ
// ԿԱԶՄԱՎՈՐՎԱԾ Է ԿԱՄ TFT SHIELD-Ի ԿԱՄ ԲԱԽՏԱԿԱՆ ՏԱՂԱՏԻ ՀԱՄԱՐ:
// ԿԱՐԳԱՎՈՐՄԱՆ ՀԱՄԱՐ ՏԵՍ ՀԱՄԱՊԱՏԱՍԽԱՆ ՄԵԿՆԱԲԱՆՈՒԹՅՈՒՆՆԵՐԸ Adafruit_TFTLCD.h-ում:
//Open-Smart Team-ի և Catalex Team-ի կողմից
//[էլեկտրոնային փոստով պաշտպանված]
//Խանութ: dx.com
// open-smart.aliexpress.com/store/1199788
//Դեմո ֆունկցիա՝ ցուցադրել գրաֆիկա, նիշ
//Arduino IDE: 1.6.5
// Տախտակ՝ Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Տախտակ:OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
// 3.2 դյույմ 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

#ներառում // Հիմնական գրաֆիկական գրադարան
//#ներառում // Սարքավորման հատուկ գրադարան
#ներառում
MCUFRIEND_kbv tft;
#include «SdFat.h» // Օգտագործեք SdFat գրադարանը
SdFat SD;
SdFile ֆայլ;
Ֆայլ myFile;
#define SD_CS_PIN SS

#ներառում // Միացրեք գրադարանը SPI ավտոբուսի հետ աշխատելու համար
#ներառում // Միացրեք կարգավորումների ֆայլը RF24 գրադարանից
#ներառում // Միացրեք գրադարանը nRF24L24+-ի հետ աշխատելու համար
RF24 ռադիո (47, 49);

#ներառում

DS3231 rtc (27, 25);
Ժամանակը t;

uint16_t r = 6000;
uint32_t k = 0;

անկայուն չստորագրված երկար տվյալներ;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

uint8_t խողովակ;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ ****************//
// Եթե օգտագործում եք OPEN-SMART TFT breakout board //
// Խորհուրդ ենք տալիս ավելացնել 5V-3.3V մակարդակի փոխակերպման միացում:
// Իհարկե կարող եք օգտագործել OPEN-SMART UNO սև տարբերակը 5V/3.3V հոսանքի անջատիչով,
// Ձեզ պարզապես անհրաժեշտ է անցնել 3.3 Վ-ի:
// LCD-ի հսկիչ կապերը կարող են վերագրվել ցանկացած թվային կամ
// անալոգային կապում...բայց մենք կօգտագործենք անալոգային կապում, քանի որ դա մեզ թույլ է տալիս
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Սեւ
// 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

// Նշանակե՛ք մարդկանց համար ընթեռնելի անուններ որոշ ընդհանուր 16-բիթանոց գունային արժեքների.
#սահմանել BLACK 0x0000
#սահմանել BLUE 0x001F
#սահմանել RED 0xF800
#սահմանել ԿԱՆԱՉ 0x07E0
#սահմանել CYAN 0x07FF
#սահմանել MAGENTA 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 dataString;
//String numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//Տող *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 (ՍԵՎ);
tft.setTextColor (ՍՊԻՏԱԿ);
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);

radio.begin(); // Սկսեք աշխատանքը nRF24L01+
radio.setChannel(120); // Նշեք տվյալների ընդունման ալիքը (0-ից 127)
radio.setDataRate (RF24_250KBPS); // Նշեք տվյալների փոխանցման արագությունը (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
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 հաղորդիչ ID 2xAABBCCDD0-ով
radio.startListening(); // Միացրեք ընդունիչը, սկսեք լսել բաց խողովակները
// radio.stopListening();
////////Ծառայության տեղեկատվության ելք
tft.fillScreen (ՍԵՎ);
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 (ՍԵՎ);
tft.println («Սկզբնական ձախողվեց»);
վերադառնալ.
}
tft.setTextColor (ՍՊԻՏԱԿ);
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 ("Winches I"));
////////Մատյան ֆայլի ստեղծում և ստեղծման փորձի արդյունքի դուրսբերում
tft.setTextSize (1);
tft.setCursor (130, 10); // եթե log file 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) {
////////Ստուգում է COM պորտի մոնիտորին գրանցամատյան դուրս բերելու հարցումի առկայությունը
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Իսկ եթե «1»-ն ընդունված է, ապա ելքը
Ֆայլ myFile = SD.open(perv);
// եթե ֆայլը հասանելի է, գրեք դրան.
եթե (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
Else {
Serial.println ("սխալ բացել .txt");
}
}
////////Ընթերցանության ժամանակ
t = rtc.getTime ();
tft.setTextColor (ՍՊԻՏԱԿ);
////////Եթե ժամը փոխվել է, ապա ցուցադրեք ժամացույցի նոր ընթերցումները
եթե (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));
////////եթե առկա է անհրաժեշտ հաղորդիչի հասցեն, ապա
եթե (խողովակ == 1) {
//////// սպասում է զրոների համաժամացման հաջորդականությանը որոշելու համար
// տվյալների բլոկի սկիզբ
եթե (տվյալներ == 0000) {
rc = 0;
} {Else
rc ++;
}
////////Հաշվիչի արժեքների գրանցում և դրանց հաշվարկ ժամի 10-րդ և 100-րդ ժամում
եթե (rc == 1) {
leb_1 = տվյալներ / 3600.0;
}

եթե (rc == 2) {
leb_2 = տվյալներ / 3600.0;
}

եթե (rc == 3) {
leb_3 = տվյալներ / 3600.0;
}

եթե (rc == 4) {
leb_4 = տվյալներ / 3600.0;
}
}
}
r++;
k++; // պարզապես հաշվիչ
//////// Տվյալների թարմացում որոշակի պարբերականությամբ
եթե ( r >= 6500) {
tft.setTextSize (2);
tft.fillRect(0, 41, 180, 64, GRAYD);
Serial.println («Լեբեդկի 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 րոպեն մեկ:
եթե ((t.min % 10 == 0) && (t.sec == 0)) {
tft.setTextSize (1);
tft.setCursor (200, 10);
tft.setTextColor (ՍԵՎ);
////////Տողերի ստեղծում .csv ձևաչափով
Տողային dataString = Տող (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Գրել ֆայլում և դուրս բերել գրելու գործընթացի արդյունքները
myFile = SD.open (perv, FILE_WRITE); // եթե «2.txt» անունով ֆայլ չկա, այն կստեղծվի:
եթե (myFile) {
myFile.println (dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println ("SD OK");
Serial.println ("SD OK");
ուշացում (900); // հետաձգում, հակառակ դեպքում գրանցում է 13 նույնական ընթերցումներ, մինչև մեկ վայրկյան չանցնի
} {Else
tft.fillRect(198, 8, 42, 10, RED);
tft.println («SD ERR»);
Serial.println («SD ERR»);
}
}
}Նիշերի փոխակերպման ծրագիր/* Վերակոդավորել ռուսերեն տառատեսակները UTF-8-ից Windows-1251 */

String utf8rus (Լարի աղբյուր)
{
int i,k;
Լարային թիրախ;
անստորագիր char n;
char m[2] = { '0', ' ' };

k = source.length(); i = 0;

մինչդեռ (i < k) {
n = աղբյուր[i]; i++;

եթե (n >= 0xC0) {
անջատիչ (n) {
պատյան 0xD0: {
n = աղբյուր[i]; i++;
եթե (n == 0x81) {n = 0xA8; ընդմիջում; }
եթե (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
կոտրել.
}
պատյան 0xD1: {
n = աղբյուր[i]; i++;
եթե (n == 0x91) {n = 0xB8; ընդմիջում; }
եթե (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
կոտրել.
}
}
}
m[0] = n; թիրախ = թիրախ + Տող (մ);
}
վերադարձի թիրախ;
}Adafruit_GFX գրադարանի օգտագործմամբ կիրիլյան ելքի համար նիշերի տրանսկոդավորման ծրագիրը տեղադրվում է հիմնական ծրագրի հետ նույն պանակում: Դուք նաև պետք է փոխարինեք glcdfont.c ֆայլը Adafruit_GFX-ում այլ տառատեսակով: Այստեղ գրադարան՝ անհրաժեշտ փոխարինմամբ։ Ռուսականացման մասին լրացուցիչ տեղեկություններ կարելի է հեշտությամբ գտնել ինտերնետում:
Ամփոփելու համար ասեմ, որ համակարգը արդարացրեց սպասելիքները, ավելի հեշտ է դարձել վերահսկել սարքավորումների շահագործման ժամանակը: Չնայած ամեն ինչ հավաքված է հացատախտակների վրա, աշխատանքի վերաբերյալ անմիջապես դժգոհություններ չկան: Առաջին տարրերն աշխատում են ավելի քան վեց ամիս և գոյատևել են ձմռանը: Վերջին դիզայն Այն գործում է մարտի 9-ից 5 կառավարվող ստորաբաժանումների համար, և դրա օգտագործման ժամկետը պաշտոնապես գրանցվում է:

Source: www.habr.com

Добавить комментарий