Lokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje)

Začnite na tem mestu по ссылке.
Najbolj priročna možnost za pridobivanje informacij o vklopu zaganjalnika se je izkazala za možnost z optičnim spojnikom PC817. Shematski diagramLokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje)Plošče vsebujejo tri enaka vezja, vse je vloženo v škatle iz ABS plastike, velikosti 100x100 mm. Fotografija optičnih sklopnikovLokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje) Ko so priključeni na zagonske naprave s polprevodniškimi ventili, je njihov tok uhajanja zadosten za odpiranje PC817 in števec se bo napačno sprožil. Da bi izključili takšno situacijo še ena je zaporedno dodana v vezje LED optičnega sklopnika in LED indikacije delovanja. Da bi to naredili, odpremo mostiček J1 in prispajkamo dodatno LED LED1.
Sprejemni del je izdelan na stran 1Lokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje)stran 2Lokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje)razvojna plošča povezana z ARDUINO MEGA 2560. Za to se na koncu uporablja dvoredni konektor. Kot naprava za prikaz informacij se uporablja zaslon z ločljivostjo 240x400, ki ima uporovni zaslon na dotik in temperaturni senzor. HX8352B.Lokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje) Poleg tega je priključek za ICSP na plošči zaslona odstranjen in reža za mikro SD ni uporabljena. Dejstvo je, da "domače" vtičnice SD ni mogoče uporabiti zaradi konflikta na vodilu SPI. Za flash kartico je bil uporabljen ločen bralnik kartic, ki je vključeval stabilizator 3,3 V in vmesni čip s tremi izhodnimi stanji 74LVS125A. Tu so me čakale grablje. Medpomnilnik s tremi stanji, vendar je E01-ML01DP5 ali čitalnik kartic deloval. V komentarjih knjižnice je SdFat videl opozorilo o nezdružljivosti z drugimi napravami. Pretvornik nivoja na TXS0108E je bil odstranjen in zamenjan z mostički, ker E01-ML01DP5 je toleranten na 5V signale - ni pomagalo. Z osciloskopom je bila zaznana izguba signala na liniji MISO, ko je bil priključen čitalnik kartic. Po natančnem pregledu je bilo ugotovljeno, da so bili vhodi omogočitvenih signalov OE 4 kanalov 74LVS125A preprosto spajkani na skupno žico in ni bilo mogoče govoriti o nobenem tretjem stanju. Čip vmesnega pomnilnika je bil uporabljen kot primitivni pretvornik ravni iz 5 V v 3.3 V z uporabo uporov 3,3 KΩ, ki so bili zaporedno povezani s signalnimi linijami. Razen linije MISO. Njegovo izhodno spodnje stikalo je verjetno pritegnilo signale na tla. Ko smo ugotovili, da je signal za omogočanje linije MISO pin 13, je bil odtrgan s tira inspajkanoLokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje)med vhodnim zatičem za izbiro naprave 9LVS74A CS (125) in zaključnim uporom. Zdaj, če ni dostopa do pomnilniške kartice, je medpomnilnik MISO onemogočen in ne moti delovanja druge naprave.Diagram razvojne ploščeLokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje)Sprejemnik v delovanjuLokalni avtonomni sistem za pridobivanje podatkov (nadaljevanje)DS3231 uporablja programsko vodilo I2C (TWI) za povezavo ure.
Program Arduino IDE// POMEMBNO: KNJIŽNICA Adafruit_TFTLCD MORA BITI POSEBEJ
// KONFIGURIRANO ZA TFT SHIELD ALI ZA PREBOJNO PLOŠČO.
// GLEJTE USTREZNE KOMENTARJE V Adafruit_TFTLCD.h ZA NASTAVITEV.
//od Open-Smart Team in Catalex Team
//[e-pošta zaščitena]
//Shrani: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo funkcija: Prikaz grafike, znakov
//Arduino IDE: 1.6.5
// Plošča: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Plošča: OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2 PALČNI 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

#vključi // Osnovna grafična knjižnica
//#vključi // Knjižnica, specifična za strojno opremo
#vključi
MCUFRIEND_kbv tft;
#include "SdFat.h" // Uporabi knjižnico SdFat
SdFat SD;
datoteka SdFile;
Datoteka myFile;
#define SD_CS_PIN SS

#vključi // Povežite knjižnico za delo z vodilom SPI
#vključi // Povežite datoteko z nastavitvami iz knjižnice RF24
#vključi // Povežite knjižnico za delo z nRF24L24+
radio RF24 (47, 49);

#vključi

DS3231 rtc(27, 25);
Čas t;

uint16_t r = 6000;
uint32_t k = 0;

nepredvidljivi dolgi podatki brez predznaka;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

cev uint8_t;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ ****************/ /
// Če uporabljate prelomno ploščo OPEN-SMART TFT //
// Priporočamo, da dodate vezje za pretvorbo ravni 5V-3.3V.
// Seveda lahko uporabite črno različico OPEN-SMART UNO s stikalom za vklop 5 V/3.3 V,
// samo preklopiti morate na 3.3 V.
// Kontrolne zatiče za LCD je mogoče dodeliti kateremu koli digitalnemu oz
// analogni zatiči...vendar bomo uporabili analogne zatiče, saj nam to omogočajo
//——————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Črna
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - PONASTAVITEV
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Dodelite človeku berljiva imena nekaterim običajnim 16-bitnim barvnim vrednostim:
#define ČRNO 0x0000
#define MODRA 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define RUMENA ​​0xFFE0
#define WHITE 0xFFFF
#define GREY 0x8C51
#define SIVA 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Če uporabljate ščit, so vse krmilne in podatkovne linije fiksne in
// opcijsko je mogoče uporabiti enostavnejšo deklaracijo:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

void setup (void) {

rtc.begin();

// Če želite nastaviti čas, odkomentirajte potrebne vrstice
// rtc.setDOW(6); // Dan v tednu
// rtc.setTime(22, 04, 0); // Čas, v 24-urnem formatu.
// rtc.setDate(4, 5, 2019); // Datum, 29. oktober 2018

Serial.begin (2000000);
//////// Inicializacija zaslona
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
///////////////////Izpis imen, dodatkov opreme, imena organizacije
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("RAZVIJALCI & GRADNJA");
tft.setCursor(30, 20);
tft.print (utf8rus("Konstruktor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
zamuda (2000);

radio.begin(); // Začetek dela nRF24L01+
radio.setChannel(120); // Določite kanal za sprejem podatkov (od 0 do 127)
radio.setDataRate(RF24_250KBPS); // Določite hitrost prenosa podatkov (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Določite moč oddajnika (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Odprite 1 cev z identifikatorjem 1 oddajnika 0xAABBCCDD11 za sprejem podatkov
// Odprite cev 2 z ID-jem oddajnika 2xAABBCCDD0 za sprejem podatkov
radio.startListening(); // Vklopite sprejemnik, začnite poslušati odprte cevi
// radio.stopListening();
////////Izhod servisnih informacij
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Začnite inicializirati kartico SD
Serial.println("Začetna kartica SD");
tft.println("Začetna kartica SD");
tft.setCursor(8, 10);
////////Inicializacija kartice
if (!SD.begin(SD_CS_PIN)) {
Serial.println("začetno ni uspelo!");
tft.fillRect(8, 10, 85, 7, RDEČA);
tft.setTextColor(BLACK);
tft.println("Začetno ni uspelo!");
vrnitve;
}
tft.setTextColor(WHITE);
Serial.println("inicializacija končana");
tft.println("Inicializacija končana");
zamuda (2000);
////////Branje časa in datuma ter ju dodeljevanje spremenljivkam
t = rtc.getTime();
čas_sek_prej = t.sek;
čas_dan_prej = t.datum;
////////Prisilno izpiši datum, da ne čakaš na spremembo datuma za prikaz
tft.setCursor(180, 0); // nastavitev položaja kazalca
tft.fillRect(178, 0, 65, 7, SIVO); // čiščenje območja izpisa časa
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Izpis imena kontrolnih objektov
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Vitli I"));
////////Ustvarjanje dnevniške datoteke in izpis rezultata poskusa ustvarjanja
tft.setTextSize(1);
tft.setCursor(130, 10); // če je ustvarjena dnevniška datoteka 2.txt, se bo pisanje v datoteko nadaljevalo
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // če datoteka 2.txt ne obstaja, bo ustvarjena
mojaDatoteka.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop (void) {
////////Preverjanje obstoja zahteve za izhod dnevnika v monitor vrat COM
if (Serial.available() > 0) {
if (1 == Serial.read());
////////In če je sprejet "1", potem izhod
Datoteka myFile = SD.open(perv);
// če je datoteka na voljo, vanjo napišite:
if (myFile) {
medtem ko (myFile.available()) {
Serial.write(myFile.read());
}
mojaDatoteka.close();
}
else {
Serial.println("napaka pri odpiranju .txt");
}
}
////////Čas branja
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Če se je čas spremenil, prikažite nove odčitke ure
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // nastavitev položaja kazalca
tft.fillRect(118, 0, 50, 7, SIVO); // čiščenje območja izpisa časa
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // izhodni odčitki ure
čas_sek_prej = t.sek;
}
////////Če se je datum spremenil, prikažite nov datum
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // nastavitev položaja kazalca
tft.fillRect(178, 0, 65, 7, SIVO); // počisti območje prikaza datuma
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // prikaz odčitkov datuma
čas_dan_prej = t.datum;
}
////////Če je radijski sprejem na voljo, potem
if (radio.available(&pipe)) {
////////preverjanje, ali je sprejemni medpomnilnik poln,
radio.read(&podatki, velikost(podatki));
////////če je zahtevani naslov oddajnika na voljo, potem
če (cev == 1) {
////////čakanje na sinhronizacijsko zaporedje ničel za določitev
//začetek podatkovnega bloka
če (podatki == 0000) {
rc = 0;
} Else {
rc++;
}
////////Snemanje vrednosti števca in njihov izračun v 10. in 100. uri
če (rc == 1) {
leb_1 = podatki / 3600.0;
}

če (rc == 2) {
leb_2 = podatki / 3600.0;
}

če (rc == 3) {
leb_3 = podatki / 3600.0;
}

če (rc == 4) {
leb_4 = podatki / 3600.0;
}
}
}
r++;
k++; // samo števec
//////// Podatki se posodabljajo z določeno periodičnostjo
če (r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, SIVO);
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;
}
////////Zapišite podatke v dnevnik na SD vsakih 10 minut.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Ustvarjanje niza v formatu .csv
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Pisanje v datoteko in izpis rezultatov postopka pisanja
myFile = SD.open(perv, FILE_WRITE); // če ni datoteke z imenom “2.txt”, bo ustvarjena.
if (myFile) {
myFile.println(dataString);
mojaDatoteka.close();
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println("SD OK");
Serial.println("SD OK");
zamuda (900); // zakasnitev, sicer beleži 13 enakih odčitkov, dokler ne mine sekunda
} Else {
tft.fillRect(198, 8, 42, 10, RDEČA);
tft.println("NAPAKA SD");
Serial.println("NAPAKA SD");
}
}
}Program za pretvorbo znakov/* Prekodirajte ruske pisave iz UTF-8 v Windows-1251 */

Niz utf8rus (vir niza)
{
int i,k;
Ciljni niz;
nepredpisan znak n;
char m[2] = { '0', ' ' };

k = izvor.dolžina(); i = 0;

medtem ko (i < k) {
n = vir [i]; i++;

if (n >= 0xC0) {
stikalo (n) {
case 0xD0: {
n = vir [i]; i++;
če (n == 0x81) { n = 0xA8; odmor; }
če (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
case 0xD1: {
n = vir [i]; i++;
če (n == 0x91) { n = 0xB8; odmor; }
če (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; cilj = cilj + niz(m);
}
povratni cilj;
}Program za prekodiranje znakov za izpis v cirilici z uporabo knjižnice Adafruit_GFX je postavljen v isto mapo z glavnim programom. Prav tako morate zamenjati datoteko glcdfont.c v Adafruit_GFX z drugo pisavo. Tukaj knjižnico z zahtevano zamenjavo. Več informacij o rusifikaciji je mogoče zlahka najti na internetu.
Če povzamem, bom rekel, da je sistem izpolnil pričakovanja, postalo je lažje spremljati čas delovanja opreme. Čeprav je vse sestavljeno na mizah, ni takojšnjih pritožb glede dela. Prvi elementi so delovali več kot šest mesecev in so preživeli zimo. Najnovejši dizajn Od 9. marca teče na 5 nadzorovanih enotah in se z njim uradno evidentira obratovalni čas.

Vir: www.habr.com

Dodaj komentar