Lokalt autonomt datainnsamlingssystem (fortsettelse)

Start på denne siden по ссылке.
Det mest praktiske alternativet for å hente informasjon om å slå på starteren viste seg å være alternativet med PC817 optokobler. Skjematisk diagramLokalt autonomt datainnsamlingssystem (fortsettelse)Platene inneholder tre like kretser, alt er plassert i ABS plastbokser, størrelse 100x100 mm. Bilde av optokoblereLokalt autonomt datainnsamlingssystem (fortsettelse) Når de er koblet til startenheter med halvlederventiler, er lekkasjestrømmen tilstrekkelig til å åpne PC817 og telleren vil utløse feilaktig. For å utelukke en slik situasjon en til er lagt til i serie til kretsen til optokobler-LED og driftsindikasjons-LED. For å gjøre dette åpnes jumper J1 og en ekstra LED LED1 loddes inn.
Mottaksdelen er laget på side 1Lokalt autonomt datainnsamlingssystem (fortsettelse)side 2Lokalt autonomt datainnsamlingssystem (fortsettelse)utviklingskort koblet til ARDUINO MEGA 2560. Til dette brukes en dobbeltradskontakt i enden. En skjerm med en oppløsning på 240x400, med en resistiv berøringsskjerm og en temperatursensor, brukes som informasjonsskjerm. HX8352B.Lokalt autonomt datainnsamlingssystem (fortsettelse) Dessuten er kontakten til ICSP på skjermkortet fjernet og micro SD-sporet brukes ikke. Faktum er at den "native" SD-kontakten ikke kan brukes på grunn av en konflikt på SPI-bussen. Til flash-kortet ble det brukt en egen kortleser, som inkluderte en 3,3V stabilisator og en bufferbrikke med tre utgangstilstander 74LVS125A. Det var her raken ventet på meg. En tre-stats buffer, men enten E01-ML01DP5 eller kortleseren fungerte. I bibliotekkommentarene så SdFat en advarsel om inkompatibilitet med andre enheter. Nivåomformeren på TXS0108E ble fjernet og erstattet med jumpere, pga E01-ML01DP5 er tolerant for 5V-signaler - det hjalp ikke. Ved hjelp av et oscilloskop ble det oppdaget et signaltap på MISO-linjen når en kortleser ble koblet til. Ved nøye undersøkelse ble det funnet at inngangene til aktiveringssignalene til OE 4-kanalene til 74LVS125A ganske enkelt ble loddet til en felles ledning, og det kunne ikke være snakk om noen tredje tilstand. Bufferbrikken ble brukt som en primitiv nivåomformer fra 5V til 3.3V ved bruk av 3,3 KΩ motstander koblet i serie med signallinjene. Bortsett fra MISO-linjen. Dens nedre utgangsbryter trakk sannsynligvis signaler til bakkenivå. Etter å ha bestemt at aktiveringssignalet til MISO-linjen var pinne 13, ble det revet av sporet ogloddetLokalt autonomt datainnsamlingssystem (fortsettelse)mellom 9LVS74A CS-enheten velg inngangspinne (125) og termineringsmotstanden. Nå, hvis det ikke er tilgang til minnekortet, er MISO-bufferen deaktivert og forstyrrer ikke driften av en annen enhet.UtviklingstavlediagramLokalt autonomt datainnsamlingssystem (fortsettelse)Mottaker i driftLokalt autonomt datainnsamlingssystem (fortsettelse)DS3231 bruker en programvare I2C-buss (TWI) for å koble til klokken.
Arduino IDE-program// VIKTIG: Adafruit_TFTLCD-BIBLIOTEKET MÅ VÆRE SPESIFIKKET
// KONFIGURERT FOR ENTEN TFT-SKJOLDET ELLER BREAKOUT BOARD.
// SE RELEVANTE KOMMENTARER I Adafruit_TFTLCD.h FOR OPPSETT.
//av Open-Smart Team og Catalex Team
//[e-postbeskyttet]
//Butikk: dx.com
// open-smart.aliexpress.com/store/1199788
//Demofunksjon: Vis grafikk, tegn
//Arduino IDE: 1.6.5
// Styre: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Board: 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

#inkludere // Kjernegrafikkbibliotek
//#inkludere // Maskinvarespesifikt bibliotek
#inkludere
MCUFRIEND_kbv tft;
#include "SdFat.h" // Bruk SdFat-biblioteket
SdFat SD;
SdFile-fil;
Fil minFile;
#define SD_CS_PIN SS

#inkludere // Koble til biblioteket for å jobbe med SPI-bussen
#inkludere // Koble til innstillingsfilen fra RF24-biblioteket
#inkludere // Koble til biblioteket for å jobbe med nRF24L24+
RF24 radio(47, 49);

#inkludere

DS3231 rtc(27, 25);
Tid t;

uint16_t r = 6000;
uint32_t k = 0;

flyktige usignerte lange data;
flyte leb_1;
flyte leb_2;
flyte leb_3;
flyte leb_4;

uint8_t pipe;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************** ****************/ /
// Hvis du bruker OPEN-SMART TFT breakout board //
// Anbefaler deg å legge til 5V-3.3V nivåkonverteringskrets.
// Selvfølgelig kan du bruke OPEN-SMART UNO Black versjon med 5V/3.3V strømbryter,
// du trenger bare bytte til 3.3V.
// Kontrollpinnene for LCD-en kan tilordnes til enhver digital eller
// analoge pinner...men vi bruker de analoge pinnene som dette tillater oss
//——————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// 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

// Tilordne menneskelesbare navn til noen vanlige 16-biters fargeverdier:
#define SVART 0x0000
#define BLÅ 0x001F
#define RØD 0xF800
#define GRØNN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define GUL 0xFFE0
#define WHITE 0xFFFF
#define GRÅ 0x8C51
#define GRÅD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Hvis du bruker skjoldet, er alle kontroll- og datalinjer faste, og
// en enklere erklæring kan eventuelt brukes:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

ugyldig oppsett (ugyldig) {

rtc.begin();

// For å stille inn tiden, fjern kommentarene til de nødvendige linjene
// rtc.setDOW(6); // Ukedag
// rtc.setTime(22, 04, 0); // Tid, i 24 timers format.
// rtc.setDate(4, 5, 2019); // Dato 29. oktober 2018

Serial.begin (2000000);
//////// Skjerminitialisering
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Utdata av navn, utstyrstilbehør, organisasjonsnavn
tft.fillScreen(SVART);
tft.setTextColor(HVIT);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("UTVIKLER OG BYGG");
tft.setCursor(30, 20);
tft.print (utf8rus("Konstruktør V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
forsinkelse (2000);

radio.begin(); // Sette i gang arbeid nRF24L01+
radio.setChannel(120); // Spesifiser datamottakskanalen (fra 0 til 127)
radio.setDataRate(RF24_250KBPS); // Spesifiser dataoverføringshastigheten (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Spesifiser sendereffekten (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Åpne 1 rør med identifikatoren til 1 sender 0xAABBCCDD11, for å motta data
// Åpne rør 2 med sender-ID 2xAABBCCDD0 for å motta data
radio.startListening(); // Slå på mottakeren, begynn å lytte til åpne rør
// radio.stopListening();
////////Utdata av tjenesteinformasjon
tft.fillScreen(SVART);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Begynn å initialisere SD-kortet
Serial.println("Initial SD-kort");
tft.println("Opprinnelig SD-kort");
tft.setCursor(8, 10);
////////Initialisering av kortet
if (!SD.begin(SD_CS_PIN)) {
Serial.println("initial mislyktes!");
tft.fillRect(8, 10, 85, 7, RØD);
tft.setTextColor(SVART);
tft.println("Initial mislyktes!");
tilbake;
}
tft.setTextColor(HVIT);
Serial.println("initialisering utført");
tft.println("Initialisering utført");
forsinkelse (2000);
////////Lese tid og dato og tilordne dem til variabler
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.dato;
////////Tving ut datoen for ikke å vente på at datoen skal endres for visning
tft.setCursor(180, 0); // stille inn markørposisjonen
tft.fillRect(178, 0, 65, 7, GRÅ); // sletter tidsutdataområdet
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Skriv ut navnet på kontrollobjektene
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Vinsjer I"));
////////Opprette en loggfil og sende ut resultatet av opprettelsesforsøket
tft.setTextSize(1);
tft.setCursor(130, 10); // hvis loggfil 2.txt er opprettet, vil skrivingen til filen fortsette
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // hvis fil 2.txt ikke eksisterer, vil den bli opprettet
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

ugyldig sløyfe (ugyldig) {
////////Sjekker eksistensen av en forespørsel om å sende ut en logg til COM-portmonitoren
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Og hvis "1" er akseptert, så utdata
Fil minFile = SD.open(perv);
// hvis filen er tilgjengelig, skriv til den:
if (min fil) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
annet {
Serial.println("feil ved åpning av .txt");
}
}
////////Lesetid
t = rtc.getTime();
tft.setTextColor(HVIT);
////////Hvis tiden har endret seg, vis de nye klokkeavlesningene
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // stille inn markørposisjonen
tft.fillRect(118, 0, 50, 7, GRÅ); // sletter tidsutdataområdet
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // gir ut klokkeavlesninger
time_sec_prev = t.sec;
}
////////Hvis datoen er endret, vis den nye datoen
if (time_day_prev != t.date) {
tft.setCursor(180, 0); // stille inn markørposisjonen
tft.fillRect(178, 0, 65, 7, GRÅ); // slett datovisningsområde
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // viser datoavlesninger
time_day_prev = t.dato;
}
////////Hvis radiomottak er tilgjengelig, så
if (radio.available(&pipe)) {
////////kontrollerer om mottaksbufferen er full,
radio.read(&data, sizeof(data));
////////hvis den nødvendige senderadressen er tilgjengelig, da
if (rør == 1) {
////////venter på en synkroniseringssekvens med nuller for å bestemme
//begynnelsen av datablokken
if (data == 0000) {
rc = 0;
} Else {
rc++;
}
////////Ta opp tellerverdier og beregne dem i 10. og 100. del av en time
if (rc == 1) {
leb_1 = data / 3600.0;
}

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

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

if (rc == 4) {
leb_4 = data / 3600.0;
}
}
}
r++;
k++; // bare en teller
//////// Dataoppdatering med en viss periodisitet
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GRÅD);
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;
}
////////Skriv data til loggen på SD hvert 10. minutt.
if ((t.min % 10 == 0) && (t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(SVART);
////////Opprette en streng i .csv-format
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Skriv til en fil og skriv ut resultatene av skriveprosessen
myFile = SD.open(perv, FILE_WRITE); // hvis det ikke er noen fil med navnet "2.txt", vil den bli opprettet.
if (min fil) {
myFile.println(datastreng);
myFile.close();
tft.fillRect(198, 8, 42, 10, GRØNN);
tft.println("SD OK");
Serial.println("SD OK");
delay(900); // forsinkelse, ellers registrerer 13 identiske avlesninger til et sekund har gått
} Else {
tft.fillRect(198, 8, 42, 10, RØD);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Karakterkonverteringsprogram/* Kod om russiske skrifter fra UTF-8 til Windows-1251 */

String utf8rus(String source)
{
int i,k;
String mål;
usignert røye n;
char m[2] = { '0', ' ' };

k = kilde.lengde(); i = 0;

mens (i < k) {
n = kilde[i]; i++;

if (n >= 0xC0) {
bryter (n) {
sak 0xD0: {
n = kilde[i]; i++;
hvis (n == 0x81) {n = 0xA8; gå i stykker; }
hvis (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
sak 0xD1: {
n = kilde[i]; i++;
hvis (n == 0x91) {n = 0xB8; gå i stykker; }
hvis (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; mål = mål + streng(m);
}
returnere mål;
} Tegnomkodingsprogrammet for kyrillisk utdata ved å bruke Adafruit_GFX-biblioteket er plassert i samme mappe som hovedprogrammet. Du må også erstatte glcdfont.c-filen i Adafruit_GFX med en annen font. Her bibliotek med nødvendig erstatning. Mer informasjon om russifisering kan enkelt finnes på Internett.
For å oppsummere vil jeg si at systemet levde opp til forventningene, det har blitt lettere å overvåke driftstiden til utstyret. Selv om alt er montert på brødbrett, er det ingen umiddelbare klager på arbeidet. De første elementene har fungert i mer enn seks måneder og har overlevd vinteren. Siste design Den har vært i drift for 9 kontrollerte enheter siden 5. mars, og driftstiden blir offisielt registrert med den.

Kilde: www.habr.com

Legg til en kommentar