Lokalt autonomt dataindsamlingssystem (fortsat)

Start på denne side по ссылке.
Den mest bekvemme mulighed for at hente information om at tænde for starteren viste sig at være muligheden med PC817 optokobleren. kredsløbsdiagramLokalt autonomt dataindsamlingssystem (fortsat)Tavlerne indeholder tre ens kredsløb, alt er placeret i ABS plastkasser, størrelse 100x100 mm. Foto af optokoblereLokalt autonomt dataindsamlingssystem (fortsat) Når den er tilsluttet startenheder med halvlederventiler, er deres lækstrøm tilstrækkelig til at åbne PC817, og tælleren vil udløse fejlagtigt. For at udelukke en sådan situation en mere er tilføjet i serie til kredsløbet af optokobler-LED'en og driftsindikations-LED'en. For at gøre dette åbnes jumper J1 og en ekstra LED LED1 er loddet ind.
Den modtagende del er lavet på side 1Lokalt autonomt dataindsamlingssystem (fortsat)side 2Lokalt autonomt dataindsamlingssystem (fortsat)udviklingskort tilsluttet ARDUINO MEGA 2560. Hertil bruges et dobbeltrækket stik i enden. En skærm med en opløsning på 240x400, med en resistiv berøringsskærm og en temperatursensor, bruges som informationsdisplay. HX8352B.Lokalt autonomt dataindsamlingssystem (fortsat) Desuden fjernes stikket til ICSP'en på skærmkortet, og micro SD-sloten bruges ikke. Faktum er, at det "native" SD-stik ikke kan bruges på grund af en konflikt på SPI-bussen. Til flashkortet blev der brugt en separat kortlæser, som omfattede en 3,3V stabilisator og en bufferchip med tre udgangstilstande 74LVS125A. Det var her, riven ventede på mig. En tre-stats buffer, men enten E01-ML01DP5 eller kortlæseren virkede. I bibliotekskommentarerne så SdFat en advarsel om inkompatibilitet med andre enheder. Niveauomformeren på TXS0108E blev fjernet og erstattet med jumpere, pga E01-ML01DP5 er tolerant over for 5V signaler - det hjalp ikke. Ved hjælp af et oscilloskop blev der registreret et signaltab på MISO-linjen, når en kortlæser blev tilsluttet. Ved omhyggelig undersøgelse blev det konstateret, at indgangene til aktiveringssignalerne fra OE 4-kanalerne på 74LVS125A simpelthen var loddet til en fælles ledning, og der kunne ikke være tale om nogen tredje tilstand. Bufferchippen blev brugt som en primitiv niveauomformer fra 5V til 3.3V ved brug af 3,3 KΩ modstande forbundet i serie med signallinjerne. Bortset fra MISO-linjen. Dens bundkontakt tiltrak sandsynligvis signaler til jordoverfladen. Efter at have fastslået, at aktiveringssignalet for MISO-linjen var ben 13, blev det revet af sporet ogloddetLokalt autonomt dataindsamlingssystem (fortsat)mellem 9LVS74A CS-enheden skal du vælge inputpin (125) og termineringsmodstanden. Nu, hvis der ikke er adgang til hukommelseskortet, er MISO-bufferen deaktiveret og forstyrrer ikke driften af ​​en anden enhed.Udviklingstavle diagramLokalt autonomt dataindsamlingssystem (fortsat)Modtager i driftLokalt autonomt dataindsamlingssystem (fortsat)DS3231 bruger en software I2C bus (TWI) til at forbinde uret.
Arduino IDE-program// VIGTIGT: Adafruit_TFTLCD LIBRARY SKAL VÆRE SPECIFIKKE
// KONFIGURERET TIL ENTEN TFT-SKJÆRMET ELLER BREAKOUT BOARD.
// SE RELEVANTE KOMMENTARER I Adafruit_TFTLCD.h FOR OPSÆTNING.
//af Open-Smart Team og Catalex Team
//[e-mail beskyttet]
//Butik: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo Funktion: Vis grafik, tegn
//Arduino IDE: 1.6.5
// Board: 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

#omfatte // Kernegrafikbibliotek
//#omfatte // Hardware-specifikt bibliotek
#omfatte
MCUFRIEND_kbv tft;
#include "SdFat.h" // Brug SdFat-biblioteket
SdFat SD;
SdFile fil;
Fil minFil;
#define SD_CS_PIN SS

#omfatte // Tilslut biblioteket for at arbejde med SPI-bussen
#omfatte // Tilslut indstillingsfilen fra RF24-biblioteket
#omfatte // Tilslut biblioteket for at arbejde med nRF24L24+
RF24 radio(47, 49);

#omfatte

DS3231 rtc(27, 25);
Tid t;

uint16_t r = 6000;
uint32_t k = 0;

flygtige usignerede lange data;
flyde leb_1;
flyde leb_2;
flyde leb_3;
flyde leb_4;

uint8_t rør;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//********************************************* ****************/ /
// Hvis du bruger OPEN-SMART TFT breakout board //
// Anbefaler dig at tilføje 5V-3.3V niveau konverteringskredsløb.
// Selvfølgelig kan du bruge OPEN-SMART UNO Black version med 5V/3.3V afbryder,
// du skal bare skifte til 3.3V.
// Kontrolstifterne til LCD'et kan tildeles til enhver digital eller
// analoge ben...men vi bruger de analoge ben, da dette giver os mulighed for det
//——————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Sort
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - NULSTIL
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Tildel menneskelæselige navne til nogle almindelige 16-bit farveværdier:
#define SORT 0x0000
#define BLÅ 0x001F
#define RØD 0xF800
#define GRØN 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 bruger skjoldet, er alle kontrol- og datalinjer faste, og
// en enklere erklæring kan eventuelt bruges:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

ugyldig opsætning (ugyldig) {

rtc.begin();

// For at indstille klokkeslættet skal du fjerne kommentarer til de nødvendige linjer
// rtc.setDOW(6); // Dag i ugen
// rtc.setTime(22, 04, 0); // Tid, i 24 timers format.
// rtc.setDate(4, 5, 2019); // Dato, 29. oktober 2018

Serial.begin (2000000);
//////// Skærminitialisering
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(sand);
//////////////////Output af navne, udstyrstilbehør, organisationsnavn
tft.fillScreen(SORT);
tft.setTextColor(HVID);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("UDVIKLER & BYG");
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(); // Igangsætte arbejde nRF24L01+
radio.setChannel(120); // Angiv datamodtagelseskanalen (fra 0 til 127)
radio.setDataRate(RF24_250KBPS); // Angiv dataoverførselshastigheden (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Angiv sendereffekten (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Åbn 1 rør med identifikatoren for 1 sender 0xAABBCCDD11, for at modtage data
// Åbn rør 2 med sender ID 2xAABBCCDD0 for at modtage data
radio.startListening(); // Tænd for modtageren, begynd at lytte til åbne rør
// radio.stopListening();
////////Output af serviceoplysninger
tft.fillScreen(SORT);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Begynd at initialisere SD-kortet
Serial.println("Oprindeligt SD-kort");
tft.println("Oprindeligt SD-kort");
tft.setCursor(8, 10);
////////Initialisering af kortet
if (!SD.begin(SD_CS_PIN)) {
Serial.println("initial mislykkedes!");
tft.fillRect(8, 10, 85, 7, RØD);
tft.setTextColor(SORT);
tft.println("Initial mislykket!");
vende tilbage;
}
tft.setTextColor(HVID);
Serial.println("initialisering udført");
tft.println("Initialisering udført");
forsinkelse (2000);
////////Læse tid og dato og tildele dem til variabler
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.dato;
////////Tvangsudskriv datoen for ikke at vente på, at datoen ændres til visning
tft.setCursor(180, 0); // indstilling af markørens position
tft.fillRect(178, 0, 65, 7, GRÅ); // rydder tidsoutputområdet
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Output navnet på kontrolobjekter
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Vinches I"));
////////Oprettelse af en logfil og udlæsning af resultatet af oprettelsesforsøget
tft.setTextSize(1);
tft.setCursor(130, 10); // hvis logfil 2.txt oprettes, vil skrivning til filen fortsætte
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 blive oprettet
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

ugyldig sløjfe (ugyldig) {
////////Tjekker eksistensen af ​​en anmodning om at udsende en log til COM-portmonitoren
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Og hvis "1" er accepteret, så outputtet
Fil minFile = SD.open(perv);
// hvis filen er tilgængelig, skriv til den:
if (min fil) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("fejl ved åbning af .txt");
}
}
////////Læsetid
t = rtc.getTime();
tft.setTextColor(HVID);
////////Hvis tiden har ændret sig, så vis de nye uraflæsninger
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // indstilling af markørens position
tft.fillRect(118, 0, 50, 7, GRÅ); // rydder tidsoutputområdet
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // output ur aflæsninger
time_sec_prev = t.sec;
}
////////Hvis datoen er ændret, så vis den nye dato
if (time_day_prev != t.date) {
tft.setCursor(180, 0); // indstilling af markørens position
tft.fillRect(178, 0, 65, 7, GRÅ); // Ryd datovisningsområde
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // viser datoaflæsninger
time_day_prev = t.dato;
}
////////Hvis radiomodtagelse er tilgængelig, så
if (radio.available(&pipe)) {
////////kontrollerer om modtagebufferen er fuld,
radio.read(&data, sizeof(data));
////////hvis den nødvendige senderadresse er tilgængelig, så
if (rør == 1) {
////////venter på en synkroniseringssekvens af nuller for at bestemme
//begyndelsen af ​​datablokken
if (data == 0000) {
rc = 0;
} Else {
rc++;
}
////////Optagelse af tællerværdier og beregning af dem i 10. og 100. af 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 tæller
//////// Dataopdatering med en vis periodicitet
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. minut.
if ((t.min % 10 == 0) && (t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(SORT);
////////Oprettelse af 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 udlæs resultaterne af skriveprocessen
myFile = SD.open(perv, FILE_WRITE); // hvis der ikke er nogen fil med navnet "2.txt", vil den blive oprettet.
if (min fil) {
myFile.println(datastreng);
myFile.close();
tft.fillRect(198, 8, 42, 10, GRØN);
tft.println("SD OK");
Serial.println("SD OK");
forsinkelse(900); // forsinkelse, ellers optager 13 identiske aflæsninger, indtil der er gået et sekund
} Else {
tft.fillRect(198, 8, 42, 10, RØD);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Karakterkonverteringsprogram/* Omkod russiske skrifttyper fra UTF-8 til Windows-1251 */

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

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

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

if (n >= 0xC0) {
switch (n) {
tilfælde 0xD0: {
n = kilde[i]; i++;
hvis (n == 0x81) {n = 0xA8; pause; }
hvis (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
tilfælde 0xD1: {
n = kilde[i]; i++;
hvis (n == 0x91) {n = 0xB8; pause; }
hvis (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; target = target + String(m);
}
returmål;
} Tegnomkodningsprogrammet til kyrillisk output ved hjælp af Adafruit_GFX-biblioteket er placeret i samme mappe som hovedprogrammet. Du skal også erstatte glcdfont.c-filen i Adafruit_GFX med en anden skrifttype. Her bibliotek med den nødvendige udskiftning. Mere information om russificering kan nemt findes på internettet.
For at opsummere vil jeg sige, at systemet levede op til forventningerne, det er blevet nemmere at overvåge udstyrets driftstid. Selvom alt er samlet på brødplader, er der ingen umiddelbare klager over arbejdet. De første elementer har virket i mere end seks måneder og har overlevet vinteren. Seneste design Den har kørt for 9 kontrollerede enheder siden den 5. marts, og driftstiden bliver officielt registreret ved hjælp af den.

Kilde: www.habr.com

Tilføj en kommentar