Kohalik autonoomne andmehõivesüsteem (jätkub)

Alusta sellel saidil по ссылке.
Kõige mugavamaks võimaluseks starteri sisselülitamise kohta info hankimiseks osutus optroni PC817 valik. ElektriskeemKohalik autonoomne andmehõivesüsteem (jätkub)Plaadid sisaldavad kolme identset vooluringi, kõik on paigutatud ABS plastkarpidesse, suurus 100x100 mm. Foto optronidestKohalik autonoomne andmehõivesüsteem (jätkub) Pooljuhtventiilidega käivitusseadmetega ühendamisel piisab nende lekkevoolust PC817 avamiseks ja loendur käivitub valesti. Sellise olukorra välistamiseks optroni LED-i ja töönäidiku LED-i vooluringi lisatakse veel üks. Selleks avatakse hüppaja J1 ja joodetakse sisse täiendav LED LED1.
Vastuvõttev osa on tehtud pool 1Kohalik autonoomne andmehõivesüsteem (jätkub)pool 2Kohalik autonoomne andmehõivesüsteem (jätkub)arendusplaat ühendatud ARDUINO MEGA 2560. Selleks kasutatakse otsas kaherealist pistikut. Infokuvamisseadmena on kasutusel 240x400 eraldusvõimega ekraan, millel on takistuslik puuteekraan ja temperatuuriandur. HX8352B.Kohalik autonoomne andmehõivesüsteem (jätkub) Lisaks eemaldatakse ekraaniplaadil ICSP-ga pistik ja mikro-SD-pesa ei kasutata. Fakt on see, et "natiivset" SD-pesa ei saa kasutada SPI siini konflikti tõttu. Flash-kaardi jaoks kasutati eraldi kaardilugejat, mis sisaldas 3,3V stabilisaatorit ja kolme väljundolekuga puhverkiipi 74LVS125A. Siin ootas mind reha. Kolme olekuga puhver, aga kas E01-ML01DP5 või kaardilugeja töötas. Teegi kommentaarides nägi SdFat hoiatust teiste seadmetega ühildumatuse kohta. TXS0108E tasememuundur eemaldati ja asendati džemprid, kuna E01-ML01DP5 talub 5V signaale - see ei aidanud. Ostsilloskoobi abil tuvastati kaardilugeja ühendamisel MISO liinil signaali kadu. Hoolikal uurimisel selgus, et 4LVS74A OE 125 kanalite lubavate signaalide sisendid olid lihtsalt ühise juhtme külge joodetud ja mingist kolmandast olekust ei saanud juttugi olla. Puhverkiipi kasutati primitiivse nivoomuundurina 5 V kuni 3.3 V, kasutades signaaliliinidega järjestikku ühendatud 3,3 KΩ takisteid. Välja arvatud MISO liin. Selle väljundi alumine lüliti tõmbas tõenäoliselt signaale maapinnale. Olles kindlaks teinud, et MISO liini lubamissignaal oli kontakt 13, rebiti see rajalt ära jajoodetudKohalik autonoomne andmehõivesüsteem (jätkub)9LVS74A CS seadme vahel vali sisendviik (125) ja lõpptakisti. Nüüd, kui mälukaardile pole juurdepääsu, on MISO puhver keelatud ega sega teise seadme tööd.Arendusplaadi skeemKohalik autonoomne andmehõivesüsteem (jätkub)Vastuvõtja töökorrasKohalik autonoomne andmehõivesüsteem (jätkub)DS3231 kasutab kella ühendamiseks tarkvaralist I2C siini (TWI).
Arduino IDE programm// TÄHTIS: Adafruit_TFTLCD TEEK PEAB OLEMA KONKREETSELT
// KONFIGREERITUD KAS TFT SHIELD'I VÕI BREAKOUT PLAADI jaoks.
// SEADISTAMISEKS VT ASJAKOHASED KOMMENTAARID Adafruit_TFTLCD.h-st.
//Open-Smart Team ja Catalex Team
//[meiliga kaitstud]
//Pood: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo funktsioon: Kuva graafika, tähemärgid
//Arduino IDE: 1.6.5
// Juhatus: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

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

#kaasa // Põhiline graafikateek
//#include // Riistvaraspetsiifiline teek
#kaasa
MCUFRIEND_kbv tft;
#include "SdFat.h" // Kasutage SdFat teeki
SdFat SD;
SdFile fail;
Fail myFile;
#define SD_CS_PIN SS

#kaasa // Ühendage raamatukogu SPI-siiniga töötamiseks
#kaasa // Ühendage seadete fail RF24 teegist
#kaasa // Ühendage teek nRF24L24+ töötamiseks
RF24 raadio(47, 49);

#kaasa

DS3231 rtc(27, 25);
Aeg t;

uint16_t r = 6000;
uint32_t k = 0;

volatiilsed allkirjastamata pikad andmed;
ujuki leb_1;
ujuki leb_2;
ujuki leb_3;
ujuki leb_4;

uint8_t toru;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//**************************************************** ****************/ /
// Kui kasutate OPEN-SMART TFT vahekaarti //
// Soovitan teil lisada 5V-3.3V taseme teisendusahel.
// Muidugi saab kasutada OPEN-SMART UNO Black versiooni 5V/3.3V toitelülitiga,
// peate lihtsalt lülituma 3.3 V peale.
// Vedelkristallekraani juhttihvte saab määrata mis tahes digitaalsele või
// analoogtihvtid...aga me kasutame analoogtihvte, kuna see võimaldab
//—————————————--|
// TFT Breakout – Arduino UNO / Mega2560 / OPEN-SMART UNO must
// 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

// Inimloetavate nimede määramine mõnele tavalisele 16-bitisele värviväärtusele:
#define MUST 0x0000
#define SININE 0x001F
#define RED 0xF800
#define ROHELINE 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define KOLLANE 0xFFE0
#define VALGE 0xFFFF
#define HALL 0x8C51
#define HALL 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Varjestuse kasutamisel on kõik juht- ja andmeliinid fikseeritud ja
// valikuliselt võib kasutada lihtsamat deklaratsiooni:
// Adafruit_TFTLCD tft;
uint16_t g_identifikaator;

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

void setup (void) {

rtc.begin();

// Kellaaja määramiseks tühjendage vajalikud read
// rtc.setDOW(6); // Nädalapäev
// rtc.setTime(22, 04, 0); // Aeg, 24 tunni formaadis.
// rtc.setDate(4, 5, 2019); // Kuupäev, 29. oktoober 2018

Serial.begin (2000000);
//////// Ekraani lähtestamine
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Nimede, seadmete tarvikute, organisatsiooni nime väljastamine
tft.fillScreen(MUST);
tft.setTextColor(VALGE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("ARENDAJAD JA EHITUS");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
viivitus (2000);

raadio.begin(); // Töö alustamine nRF24L01+
radio.setChannel(120); // Määrake andmete vastuvõtukanal (0 kuni 127)
radio.setDataRate(RF24_250KBPS); // Määrake andmeedastuskiirus (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS – 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Määrake saatja võimsus (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Andmete vastuvõtmiseks avage 1 toru 1 saatja identifikaatoriga 0xAABBCCDD11
// Andmete vastuvõtmiseks avage toru 2 saatja ID-ga 2xAABBCCDD0
radio.startListening(); // Lülitage vastuvõtja sisse, alustage avatud torude kuulamist
// radio.stopListening();
////////Teenuse teabe väljund
tft.fillScreen(MUST);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Alusta SD-kaardi lähtestamist
Serial.println("Esialgne SD-kaart");
tft.println("Esialgne SD-kaart");
tft.setCursor(8, 10);
////////Kaardi lähtestamine
if (!SD.begin(SD_CS_PIN)) {
Serial.println("esialgne ebaõnnestus!");
tft.fillRect(8, 10, 85, 7, PUNANE);
tft.setTextColor(BLACK);
tft.println("Esialgne ebaõnnestus!");
tagasi;
}
tft.setTextColor(VALGE);
Serial.println("initsialiseerimine tehtud");
tft.println("Initsialiseerimine tehtud");
viivitus (2000);
////////Aja ja kuupäeva lugemine ning nende määramine muutujatele
t = rtc.getTime();
time_sec_prev = t.sec;
aeg_päev_eelmine = t.kuupäev;
////////Sunnitage kuupäev, et mitte oodata, kuni kuupäev kuvamiseks muutub
tft.setCursor(180, 0); // kursori asukoha määramine
tft.fillRect(178, 0, 65, 7, HALL); // ajaväljundi ala tühjendamine
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Väljutab juhtobjektide nimed
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("vintsid I"));
////////Logifaili loomine ja loomiskatse tulemuse väljastamine
tft.setTextSize(1);
tft.setCursor(130, 10); // kui luuakse logifail 2.txt, siis faili kirjutamine jätkub
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
minuFail = SD.avatud(perv, FAIL_KIRJUTAMINE); // kui faili 2.txt pole olemas, siis see luuakse
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop (void) {
////////Kontrollimine COM-pordi monitorile logi väljastamise taotluse olemasolu
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Ja kui aktsepteeritakse “1”, siis väljund
Fail minuFail = SD.open(perv);
// kui fail on saadaval, kirjutage sellele:
if (minu fail) {
while (myFile.available()) {
Serial.write(minuFail.read());
}
myFile.close();
}
veel {
Serial.println("viga .txt avamisel");
}
}
////////Lugemisaeg
t = rtc.getTime();
tft.setTextColor(VALGE);
////////Kui kellaaeg on muutunud, siis kuvage uued kellanäidud
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // kursori asukoha määramine
tft.fillRect(118, 0, 50, 7, HALL); // ajaväljundi ala tühjendamine
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // väljundkella näidud
time_sec_prev = t.sec;
}
////////Kui kuupäev on muutunud, siis kuva uus kuupäev
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // kursori asukoha määramine
tft.fillRect(178, 0, 65, 7, HALL); // kuupäeva kuvamise ala kustutamine
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // kuupäeva näitude kuvamine
aeg_päev_eelmine = t.kuupäev;
}
////////Kui raadiovastuvõtt on saadaval, siis
if (radio.available(&pipe)) {
////////kontrollimine, kas vastuvõtupuhver on täis,
radio.read(&andmed, suurus(andmed));
////////kui vajalik saatja aadress on olemas, siis
if (toru == 1) {
////////ootan sünkroniseerivat nullide jada määramiseks
//andmeploki algus
if (andmed == 0000) {
rc = 0;
} Else {
rc++;
}
////////Loendurite väärtuste salvestamine ja nende arvutamine 10. ja 100. tunnis
if (rc == 1) {
leb_1 = andmed / 3600.0;
}

if (rc == 2) {
leb_2 = andmed / 3600.0;
}

if (rc == 3) {
leb_3 = andmed / 3600.0;
}

if (rc == 4) {
leb_4 = andmed / 3600.0;
}
}
}
r++;
k++; // lihtsalt loendur
//////// Andmete uuendamine teatud perioodilisusega
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, HALL);
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;
}
////////Kirjutage andmed logisse SD-l iga 10 minuti järel.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Stringi loomine .csv-vormingus
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Kirjutage faili ja väljastage kirjutamisprotsessi tulemused
minuFail = SD.avatud(perv, FAIL_KIRJUTAMINE); // kui faili nimega "2.txt" pole, luuakse see.
if (minu fail) {
minuFail.println(andmedring);
myFile.close();
tft.fillRect(198, 8, 42, 10, ROHELINE);
tft.println("SD OK");
Serial.println("SD OK");
viivitus(900); // viivitus, muidu salvestab 13 identset näitu kuni sekundi möödumiseni
} Else {
tft.fillRect(198, 8, 42, 10, PUNANE);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Tegelaste teisendamise programm/* Vene fontide ümberkodeerimine UTF-8-st Windows-1251-sse */

String utf8rus (stringi allikas)
{
int i,k;
Stringi sihtmärk;
märgita char n;
char m[2] = { '0', ' ' };

k = allikas.pikkus(); i = 0;

samas (i < k) {
n = allikas [i]; i++;

if (n >= 0xC0) {
lüliti (n) {
juhtum 0xD0: {
n = allikas [i]; i++;
if (n == 0x81) { n = 0xA8; murda; }
kui (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
murda;
}
juhtum 0xD1: {
n = allikas [i]; i++;
if (n = = 0x91) { n = 0xB8; murda; }
kui (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
murda;
}
}
}
m[0] = n; sihtmärk = sihtmärk + String(m);
}
tagastamise sihtmärk;
}Teeki Adafruit_GFX kasutav kirillitsa väljundi tähemärkide ümberkodeerimise programm paigutatakse põhiprogrammiga samasse kausta. Samuti peate failis Adafruit_GFX asendama faili glcdfont.c teise fondiga. see on raamatukogu koos vajaliku asendusega. Lisateavet venestamise kohta leiate hõlpsalt Internetist.
Kokkuvõtteks ütlen, et süsteem vastas ootustele, seadmete tööaja jälgimine on muutunud lihtsamaks. Kuigi kõik on kokkupandud leivalaudadele, pole töö üle kohe kurtmist. Esimesed elemendid on töötanud juba üle poole aasta ja on talve üle elanud. Uusim disain Alates 9. märtsist on see töötanud 5 kontrollitava üksuse jaoks ja selle abil registreeritakse ametlikult tööaeg.

Allikas: www.habr.com

Lisa kommentaar