Sistemi lokal i përvetësimit të të dhënave autonome (vazhdim)

Filloni në këtë faqe по ссылке.
Opsioni më i përshtatshëm për marrjen e informacionit në lidhje me ndezjen e starterit doli të ishte opsioni me optocoupler PC817. Diagrami i qarkutSistemi lokal i përvetësimit të të dhënave autonome (vazhdim)Pllakat përmbajnë tre qarqe identike, gjithçka është e vendosur në kuti plastike ABS, me përmasa 100x100 mm. Foto e optoçiftuesveSistemi lokal i përvetësimit të të dhënave autonome (vazhdim) Kur lidhen me pajisjet e ndezjes me valvola gjysmëpërçuese, rryma e tyre e rrjedhjes është e mjaftueshme për të hapur PC817 dhe numëruesi do të aktivizohet gabimisht. Për të përjashtuar një situatë të tillë një tjetër i shtohet në seri qarkut të LED-it të optoçiftit dhe LED treguesit të funksionimit. Për ta bërë këtë, hapet kërcyesi J1 dhe ngjitet një LED LED1 shtesë.
Pjesa marrëse është bërë në ana 1Sistemi lokal i përvetësimit të të dhënave autonome (vazhdim)ana 2Sistemi lokal i përvetësimit të të dhënave autonome (vazhdim)Pllaka zhvillimore e lidhur me ARDUINO MEGA 2560. Për këtë përdoret një lidhës me dy rreshta në fund. Një ekran me rezolucion 240x400, me një ekran me prekje rezistente dhe një sensor të temperaturës, përdoret si një pajisje për shfaqjen e informacionit. HX8352B.Sistemi lokal i përvetësimit të të dhënave autonome (vazhdim) Për më tepër, lidhësi me ICSP në tabelën e ekranit hiqet dhe foleja micro SD nuk përdoret. Fakti është se priza "amtare" SD nuk mund të përdoret për shkak të një konflikti në autobusin SPI. Për kartën flash, u përdor një lexues i veçantë i kartave, i cili përfshinte një stabilizues 3,3 V dhe një çip buffer me tre gjendje dalje 74LVS125A. Pikërisht këtu më priste raketa. Një tampon me tre gjendje, por funksionoi ose E01-ML01DP5 ose lexuesi i kartave. Në komentet e bibliotekës, SdFat pa një paralajmërim për papajtueshmërinë me pajisjet e tjera. Konvertuesi i nivelit në TXS0108E u hoq dhe u zëvendësua me kërcyes, sepse E01-ML01DP5 është tolerant ndaj sinjaleve 5V - nuk ndihmoi. Duke përdorur një oshiloskop, një humbje sinjali u zbulua në linjën MISO kur ishte lidhur një lexues kartash. Pas ekzaminimit të kujdesshëm, u zbulua se hyrjet e sinjaleve aktivizuese të kanaleve OE 4 të 74LVS125A thjesht ishin ngjitur në një tel të përbashkët dhe nuk mund të flitej për ndonjë gjendje të tretë. Çipi i tamponit u përdor si një konvertues primitiv i nivelit nga 5V në 3.3V duke përdorur rezistorë 3,3 KΩ të lidhur në seri me linjat e sinjalit. Përveç linjës MISO. Ndërprerësi i tij i poshtëm i daljes ndoshta tërhoqi sinjale në nivelin e tokës. Pasi konstatoi se sinjali i aktivizimit të linjës MISO ishte pin 13, ai u shkëput nga pista dhesalduarSistemi lokal i përvetësimit të të dhënave autonome (vazhdim)midis pajisjes 9LVS74A CS zgjidhni pinin e hyrjes (125) dhe rezistencës së përfundimit. Tani, nëse nuk ka qasje në kartën e kujtesës, buferi MISO është i çaktivizuar dhe nuk ndërhyn në funksionimin e një pajisjeje tjetër.Diagrami i bordit të zhvillimitSistemi lokal i përvetësimit të të dhënave autonome (vazhdim)Marrësi në funksionSistemi lokal i përvetësimit të të dhënave autonome (vazhdim)DS3231 përdor një autobus softuer I2C (TWI) për të lidhur orën.
Programi Arduino IDE// E RËNDËSISHME: BIBLIOTEKA Adafruit_TFTLCD DUHET TË JETË VEÇANTË
// I KONFIGUAR OSE PËR MBROJTËN TFT OSE PËR BORDIN E PARAQITJES.
// SHIH KOMENTET RELEVANT NË Adafruit_TFTLCD.h PËR KONFIGURIM.
//nga Open-Smart Team dhe Catalex Team
//[email mbrojtur]
//Dyqani: dx.com
// open-smart.aliexpress.com/store/1199788
//Funksioni Demo: Shfaq grafika, karaktere
//Arduino IDE: 1.6.5
// Bordi: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#përfshi // Biblioteka grafike bazë
//#përfshi // Bibliotekë specifike për harduerin
#përfshi
MCUFRIEND_kbv tft;
#include "SdFat.h" // Përdorni bibliotekën SdFat
SdFat SD;
skedar SdFile;
Skedari myFile;
#define SD_CS_PIN SS

#përfshi // Lidhni bibliotekën për të punuar me autobusin SPI
#përfshi // Lidhni skedarin e cilësimeve nga biblioteka RF24
#përfshi // Lidhni bibliotekën për të punuar me nRF24L24+
radio RF24 (47, 49);

#përfshi

DS3231 rtc(27, 25);
Koha t;

uint16_t r = 6000;
uint32_t k = 0;

të dhëna të gjata të paqëndrueshme të panënshkruara;
noton leb_1;
noton leb_2;
noton leb_3;
noton leb_4;

tub uint8_t;
int rc = 0;

uint8_t time_sec_prev;
uint8_t koha_dita_prev;

//************************************************ ****************/ /
// Nëse përdorni tabelën OPEN-SMART TFT //
// Ju rekomandojmë të shtoni qarkun e konvertimit të nivelit 5V-3.3V.
// Sigurisht që mund të përdorni versionin OPEN-SMART UNO Black me çelësin e energjisë 5V/3.3V,
// ju vetëm duhet të kaloni në 3.3V.
// Kunjat e kontrollit për LCD mund t'i caktohen çdo dixhital ose
// kunjat analoge...por ne do të përdorim kunjat analoge pasi kjo na lejon
//——————————————-|
// Breakout TFT - Arduino UNO / Mega2560 / OPEN-SMART UNO E zezë
// 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

// Caktoni emra të lexueshëm nga njeriu për disa vlera të zakonshme të ngjyrave 16-bit:
#define BLACK 0x0000
#define BLU 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define VERDHA 0xFFE0
#define WHITE 0xFFFF
#define GRI 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Nëse përdorni mburojën, të gjitha linjat e kontrollit dhe të të dhënave janë të fiksuara, dhe
// mund të përdoret opsionalisht një deklaratë më e thjeshtë:
// Adafruit_TFTLCD tft;
uint16_t g_identifikues;

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

konfigurimi i pavlefshëm (i pavlefshëm) {

rtc.begin();

// Për të vendosur kohën, hiqni komentet e rreshtave të nevojshëm
// rtc.setDOW (6); // Ditë të javës
// rtc.setTime (22, 04, 0); // Koha, në format 24 orë.
// rtc.setDate(4, 5, 2019); // Data, 29 tetor 2018

Serial.fillo (2000000);
//////// Inicializimi i ekranit
tft.fillim(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437 (e vërtetë);
//////////////////Prodhimi i emrave, aksesorët e pajisjeve, emri i organizatës
tft.fillScreen(ZI);
tft.setTextNgjyra (BARDHË);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("ZHVILLUESIT & NDËRTIMI");
tft.setCursor(30, 20);
tft.print (utf8rus ("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus ("Turner I.I." ));
vonesë (2000);

radio.begin(); // Filloni punën nRF24L01+
radio.setChannel(120); // Specifikoni kanalin e marrjes së të dhënave (nga 0 në 127)
radio.setDataRate (RF24_250KBPS); // Specifikoni shpejtësinë e transferimit të të dhënave (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Specifikoni fuqinë e transmetuesit (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Hap 1 tub me identifikuesin e 1 transmetuesit 0xAABBCCDD11, për të marrë të dhëna
// Hapni tubin 2 me ID të transmetuesit 2xAABBCCDD0 për të marrë të dhëna
radio.startDëgjoje(); // Ndizni marrësin, filloni të dëgjoni tubacionet e hapura
// radio.stopDëgjuar();
////////Dalja e informacionit të shërbimit
tft.fillScreen(ZI);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Filloni inicializimin e kartës SD
Serial.println ("Karta fillestare SD");
tft.println ("Karta fillestare SD");
tft.setCursor(8, 10);
////////Inicializimi i kartës
nëse (!SD.begin(SD_CS_PIN)) {
Serial.println ("fillimi dështoi!");
tft.fillRect(8, 10, 85, 7, KUQ);
tft.setTextNgjyra(ZEZE);
tft.println ("Fillimi dështoi!");
kthim;
}
tft.setTextNgjyra (BARDHË);
Serial.println("initializimi u krye");
tft.println("Inicializimi u krye");
vonesë (2000);
////////Leximi i orës dhe datës dhe caktimi i tyre në variabla
t = rtc.getTime();
koha_sek_para = t.sek;
koha_dita_para = t.data;
////////Nxjerr me forcë datën në mënyrë që të mos presësh që data të ndryshojë për shfaqje
tft.setCursor(180, 0); // vendosja e pozicionit të kursorit
tft.fillRect(178, 0, 65, 7, GRI); // pastrimi i zonës së daljes së kohës
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Nxjerr emrin e objekteve të kontrollit
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus ("Winches I"));
////////Krijimi i një skedari regjistri dhe nxjerrja e rezultatit të përpjekjes së krijimit
tft.setTextSize(1);
tft.setCursor(130, 10); // nëse krijohet skedari log 2.txt, atëherë shkrimi në skedar do të vazhdojë
nëse (SD.ekziston(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Seriali.println(perv);
} Tjetër {
myFile = SD.open(perv, FILE_WRITE); // nëse skedari 2.txt nuk ekziston, ai do të krijohet
myFile.close();
tft.println(perv);
Seriali.println(perv);
}
}

lak i pavlefshëm (i pavlefshëm) {
////////Kontrollimi i ekzistencës së një kërkese për të nxjerrë një regjistër në monitorin e portit COM
nëse (Serial.available() > 0) {
nëse (1 == Serial.lexo());
////////Dhe nëse pranohet "1", atëherë dalja
Skedari myFile = SD.open(perv);
// nëse skedari është i disponueshëm, shkruani në të:
nëse (myFile) {
ndërsa (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
tjetër {
Serial.println ("gabim në hapjen e .txt");
}
}
////////Koha e leximit
t = rtc.getTime();
tft.setTextNgjyra (BARDHË);
////////Nëse ora ka ndryshuar, atëherë shfaqni leximet e reja të orës
nëse ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // vendosja e pozicionit të kursorit
tft.fillRect(118, 0, 50, 7, GRI); // pastrimi i zonës së daljes së kohës
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // leximet e orës dalëse
koha_sek_para = t.sek;
}
////////Nëse data ka ndryshuar, atëherë shfaqni datën e re
nëse (time_dita_prev != t.data) {
tft.setCursor(180, 0); // vendosja e pozicionit të kursorit
tft.fillRect(178, 0, 65, 7, GRI); // Pastro zonën e shfaqjes së datës
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // shfaq leximet e datës
koha_dita_para = t.data;
}
////////Nëse disponohet marrja e radios, atëherë
nëse (radio.disponohet(&tub)) {
////////duke kontrolluar nëse buferi i pranimit është plot,
radio.lexo(&data, sizeof(data));
////////nëse adresa e kërkuar e transmetuesit është e disponueshme, atëherë
nëse (tub == 1) {
////////në pritje të një sekuence sinkronizuese të zerave për të përcaktuar
//fillimi i bllokut të të dhënave
nëse (të dhënat == 0000) {
rc = 0;
} Tjetër {
rc++;
}
////////Regjistrimi i vlerave të numëruesit dhe llogaritja e tyre në 10 dhe 100 të orës
nëse (rc == 1) {
leb_1 = të dhëna / 3600.0;
}

nëse (rc == 2) {
leb_2 = të dhëna / 3600.0;
}

nëse (rc == 3) {
leb_3 = të dhëna / 3600.0;
}

nëse (rc == 4) {
leb_4 = të dhëna / 3600.0;
}
}
}
r++;
k++; // vetëm një banak
//////// Përditësimi i të dhënave me një periodicitet të caktuar
nëse ( 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);
Seriali.println(k);
r = 0;
}
////////Shkruani të dhëna në regjistrin në SD çdo 10 minuta.
nëse ((t.min % 10 == 0) && (t.sek == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextNgjyra(ZEZE);
////////Krijimi i një vargu në formatin .csv
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Shkruani në një skedar dhe nxirrni rezultatet e procesit të shkrimit
myFile = SD.open(perv, FILE_WRITE); // nëse nuk ka skedar me emrin "2.txt", ai do të krijohet.
nëse (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println ("SD OK");
Serial.println("SD OK");
vonesë (900); // vonesë, përndryshe regjistron 13 lexime identike derisa të kalojë një sekondë
} Tjetër {
tft.fillRect(198, 8, 42, 10, KUQ);
tft.println ("SD ERR");
Serial.println("SD ERR");
}
}
}Programi i konvertimit të karaktereve/* Rikodoni fontet ruse nga UTF-8 në Windows-1251 */

String utf8rus (burimi i vargut)
{
int i,k;
Objektivi i vargut;
char n e panënshkruar;
char m[2] = { '0', ' ' };

k = burimi.gjatësia(); i = 0;

ndërsa (i < k) {
n = burimi[i]; i++;

nëse (n >= 0xC0) {
kaloni (n) {
rasti 0xD0: {
n = burimi[i]; i++;
nëse (n == 0x81) { n = 0xA8; pushim; }
nëse (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
pushim;
}
rasti 0xD1: {
n = burimi[i]; i++;
nëse (n == 0x91) { n = 0xB8; pushim; }
nëse (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
pushim;
}
}
}
m[0] = n; objektiv = objektiv + String(m);
}
objektivi i kthimit;
}Programi i transkodimit të karaktereve për daljen cirilike duke përdorur bibliotekën Adafruit_GFX vendoset në të njëjtën dosje me programin kryesor. Ju gjithashtu duhet të zëvendësoni skedarin glcdfont.c në Adafruit_GFX me një font tjetër. Këtu bibliotekë me zëvendësimin e kërkuar. Më shumë informacion rreth Rusifikimit mund të gjenden lehtësisht në internet.
Për ta përmbledhur, do të them që sistemi i përmbushi pritjet, është bërë më e lehtë të monitorohet koha e funksionimit të pajisjeve. Edhe pse gjithçka është montuar në dërrasa buke, nuk ka ankesa të menjëhershme për punën. Elementët e parë kanë më shumë se gjashtë muaj që punojnë dhe i kanë mbijetuar dimrit. Dizajni më i fundit Ajo funksionon për 9 njësi të kontrolluara që nga data 5 mars dhe koha e funksionimit po regjistrohet zyrtarisht duke e përdorur atë.

Burimi: www.habr.com

Shto një koment