Lokalni autonomni sistem za prikupljanje podataka (nastavak)

Počnite na ovoj stranici link.
Najpogodnija opcija za dohvaćanje informacija o uključivanju startera pokazala se opcija s PC817 optospojlerom. Shematski dijagramLokalni autonomni sistem za prikupljanje podataka (nastavak)Ploče sadrže tri identična kola, sve je smješteno u kutije od ABS plastike, dimenzija 100x100 mm. Fotografija optokapleraLokalni autonomni sistem za prikupljanje podataka (nastavak) Kada su povezani na startne uređaje sa poluvodičkim ventilima, njihova struja curenja je dovoljna da otvori PC817 i brojač će se lažno aktivirati. Isključiti takvu situaciju još jedan se dodaje serijski u kolo LED-a optokaplera i LED indikacije rada. Da biste to učinili, otvara se kratkospojnik J1 i zalemljuje se dodatna LED LED1.
Prijemni dio je napravljen na strana 1Lokalni autonomni sistem za prikupljanje podataka (nastavak)strana 2Lokalni autonomni sistem za prikupljanje podataka (nastavak)razvojna ploča spojena na ARDUINO MEGA 2560. Za to se koristi dvoredni konektor na kraju. Kao uređaj za prikaz informacija koristi se ekran rezolucije 240x400, koji ima otporni ekran osjetljiv na dodir i senzor temperature. HX8352B.Lokalni autonomni sistem za prikupljanje podataka (nastavak) Štaviše, konektor za ICSP na ploči ekrana je uklonjen i micro SD slot se ne koristi. Činjenica je da se "nativni" SD socket ne može koristiti zbog konflikta na SPI magistrali. Za fleš karticu je korišćen poseban čitač kartica, koji je uključivao stabilizator od 3,3V i bafer čip sa tri izlazna stanja 74LVS125A. Ovdje su me čekale grablje. Bafer sa tri stanja, ali ili E01-ML01DP5 ili čitač kartica su radili. U komentarima biblioteke, SdFat je vidio upozorenje o nekompatibilnosti s drugim uređajima. Pretvarač nivoa na TXS0108E je uklonjen i zamijenjen kratkospojnicima, jer E01-ML01DP5 je tolerantan na 5V signale - nije pomoglo. Pomoću osciloskopa je detektovan gubitak signala na MISO liniji kada je priključen čitač kartica. Pažljivim ispitivanjem ustanovljeno je da su ulazi signala za omogućavanje OE 4 kanala 74LVS125A jednostavno zalemljeni na zajedničku žicu i nije moglo biti govora o bilo kakvom trećem stanju. Bufer čip je korišten kao primitivni pretvarač nivoa od 5V do 3.3V koristeći otpornike od 3,3 KΩ spojenih u seriju sa signalnim linijama. Osim MISO linije. Njegov izlazni donji prekidač je vjerovatno privlačio signale na nivo zemlje. Utvrdivši da je signal za omogućavanje MISO linije pin 13, otkinut je sa kolosijeka ilemljeniLokalni autonomni sistem za prikupljanje podataka (nastavak)između 9LVS74A CS uređaja odaberite ulazni pin (125) i završni otpornik. Sada, ako nema pristupa memorijskoj kartici, MISO bafer je onemogućen i ne ometa rad drugog uređaja.Dijagram razvojne pločeLokalni autonomni sistem za prikupljanje podataka (nastavak)Prijemnik u raduLokalni autonomni sistem za prikupljanje podataka (nastavak)DS3231 koristi softversku I2C magistralu (TWI) za povezivanje sata.
Arduino IDE program// VAŽNO: Adafruit_TFTLCD BIBLIOTEKA MORA BITI POSEBNO
// KONFIGURANO ILI ZA TFT SHIELD ILI ZA PLOČU.
// ZA POSTAVLJANJE POGLEDAJTE RELEVANTNE KOMENTARE U Adafruit_TFTLCD.h.
//od Open-Smart tima i Catalex tima
//[email zaštićen]
//Prodavnica: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo funkcija: Prikaz grafike, znakova
//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.2INČ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

#include // Osnovna grafička biblioteka
//#include // Biblioteka specifična za hardver
#include
MCUFRIEND_kbv tft;
#include "SdFat.h" // Koristi SdFat biblioteku
SdFat SD;
SdFile fajl;
File myFile;
#define SD_CS_PIN SS

#include // Povezivanje biblioteke za rad sa SPI sabirnicom
#include // Povežite datoteku postavki iz RF24 biblioteke
#include // Povežite biblioteku za rad sa nRF24L24+
Radio RF24 (47, 49);

#include

DS3231 rtc(27, 25);
Vrijeme t;

uint16_t r = 6000;
uint32_t k = 0;

promjenjivi nepotpisani dugi podaci;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

uint8_t pipe;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//******************************************************* ****************/ /
// Ako koristite OPEN-SMART TFT razvodnu ploču //
// Preporučamo vam da dodate 5V-3.3V kolo za pretvaranje nivoa.
// Naravno možete koristiti OPEN-SMART UNO Black verziju sa 5V/3.3V prekidačem za napajanje,
// samo trebate prebaciti na 3.3V.
// Kontrolni pinovi za LCD mogu se dodijeliti bilo kojem digitalnom ili
// analogni pinovi...ali ćemo koristiti analogne pinove kako nam to dozvoljava
//——————————————-|
// 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

// Dodijelite ljudima čitljiva imena nekim uobičajenim 16-bitnim vrijednostima boja:
#define CRNO 0x0000
#define PLAVI 0x001F
#define CRVENI 0xF800
#define ZELENO 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define ŽUTO 0xFFE0
#define BIJELO 0xFFFF
#define GREY 0x8C51
#define GREYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Ako koristite štit, sve kontrolne i podatkovne linije su fiksne, i
// opciono se može koristiti jednostavnija deklaracija:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

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

void setup (void) {

rtc.begin();

// Da postavite vrijeme, dekomentirajte potrebne redove
// rtc.setDOW(6); // Dan u tjednu
// rtc.setTime(22, 04, 0); // Vrijeme, u 24-satnom formatu.
// rtc.setDate(4, 5, 2019); // Datum, 29. oktobar 2018

Serial.begin (2000000);
//////// Inicijalizacija ekrana
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
///////////////////Izlaz imena, pribor opreme, naziv organizacije
tft.fillScreen(CRNI);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("DEVELOPERI & GRADNJA");
tft.setCursor(30, 20);
tft.print (utf8rus("Konstruktor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
kašnjenje (2000);

radio.begin(); // Pokreni rad nRF24L01+
radio.setChannel(120); // Odredite kanal za prijem podataka (od 0 do 127)
radio.setDataRate(RF24_250KBPS); // Odredite brzinu prijenosa podataka (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Odredite snagu predajnika (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Otvorite 1 cijev sa identifikatorom 1 predajnika 0xAABBCCDD11, za primanje podataka
// Otvorite cijev 2 s ID-om odašiljača 2xAABBCCDD0 za primanje podataka
radio.startListening(); // Uključite prijemnik, počnite slušati otvorene cijevi
// radio.stopListening();
////////Izlaz servisnih informacija
tft.fillScreen(CRNI);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Započnite inicijalizaciju SD kartice
Serial.println("Inicijalna SD kartica");
tft.println("Inicijalna SD kartica");
tft.setCursor(8, 10);
////////Inicijalizacija kartice
if (!SD.begin(SD_CS_PIN)) {
Serial.println("početno nije uspjelo!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Inicijalni neuspjeh!");
povratak;
}
tft.setTextColor(WHITE);
Serial.println("inicijalizacija obavljena");
tft.println("Inicijalizacija obavljena");
kašnjenje (2000);
////////Čitanje vremena i datuma i njihovo dodjeljivanje varijablama
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Prisilno izbacite datum kako ne biste čekali da se datum promijeni za prikaz
tft.setCursor(180, 0); // postavljanje pozicije kursora
tft.fillRect(178, 0, 65, 7, SIVA); // brisanje područja izlaznog vremena
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Izlaz imena kontrolnih objekata
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
////////Kreiranje datoteke dnevnika i izlaz rezultata pokušaja kreiranja
tft.setTextSize(1);
tft.setCursor(130, 10); // ako se kreira log datoteka 2.txt, onda će se pisanje u datoteku nastaviti
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // ako datoteka 2.txt ne postoji, bit će kreirana
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop (void) {
////////Provjera postojanja zahtjeva za izlaz dnevnika na monitor COM porta
if (Serial.available() > 0) {
if (1 == Serial.read());
////////I ako je “1” prihvaćeno, onda izlaz
Datoteka myFile = SD.open(perv);
// ako je datoteka dostupna, napiši joj:
if (myFile) {
dok (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
ostalo {
Serial.println("greška otvaranja .txt");
}
}
////////Vrijeme čitanja
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Ako se vrijeme promijenilo, prikažite nova očitavanja sata
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // postavljanje pozicije kursora
tft.fillRect(118, 0, 50, 7, SIVA); // brisanje područja izlaznog vremena
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // izlazna očitanja sata
time_sec_prev = t.sec;
}
////////Ako se datum promijenio, prikažite novi datum
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // postavljanje pozicije kursora
tft.fillRect(178, 0, 65, 7, SIVA); // očisti područje prikaza datuma
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // prikaz očitavanja datuma
time_day_prev = t.date;
}
////////Ako je radio prijem dostupan, onda
if (radio.available(&pipe)) {
////////provjera da li je bafer za prijem pun,
radio.read(&data, sizeof(podaci));
////////ako je tražena adresa predajnika dostupna, onda
if (cijev == 1) {
////////čekanje da se odredi sinkronizirajući niz nula
// početak bloka podataka
if (podaci == 0000) {
rc = 0;
} Else {
rc++;
}
////////Snimanje vrijednosti brojača i njihovo izračunavanje u 10. i 100. u satu
if (rc == 1) {
leb_1 = podaci / 3600.0;
}

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

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

if (rc == 4) {
leb_4 = podaci / 3600.0;
}
}
}
r++;
k++; // samo brojač
//////// Ažuriranje podataka sa određenom periodičnošću
if (r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GREYD);
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;
}
////////Upisite podatke u dnevnik na SD svakih 10 minuta.
if ((t.min % 10 == 0) && (t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Kreiranje stringa u .csv formatu
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Pisanje u datoteku i izlaz rezultata procesa pisanja
myFile = SD.open(perv, FILE_WRITE); // ako ne postoji datoteka pod nazivom “2.txt”, bit će kreirana.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, ZELENO);
tft.println("SD OK");
Serial.println("SD OK");
kašnjenje (900); // kašnjenje, inače snima 13 identičnih očitanja dok ne prođe sekunda
} Else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Program za konverziju znakova/* Rekodirajte ruske fontove iz UTF-8 u Windows-1251 */

String utf8rus (izvor niza)
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', ' ' };

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

dok (i < k) {
n = izvor[i]; i++;

ako (n >= 0xC0) {
prekidač (n) {
slučaj 0xD0: {
n = izvor[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
ako (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
slučaj 0xD1: {
n = izvor[i]; i++;
if (n == 0x91) { n = 0xB8; break; }
ako (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; cilj = cilj + String(m);
}
povratna meta;
}Program za transkodiranje znakova za ćirilični izlaz koristeći Adafruit_GFX biblioteku nalazi se u istom folderu sa glavnim programom. Također morate zamijeniti datoteku glcdfont.c u Adafruit_GFX drugim fontom. to je biblioteka sa potrebnom zamjenom. Više informacija o rusifikaciji može se lako pronaći na internetu.
Sumirajući, reći ću da je sistem opravdao očekivanja, postalo je lakše pratiti vrijeme rada opreme. Iako je sve sastavljeno na matičnim pločama, nema trenutnih pritužbi na rad. Prvi elementi su radili više od šest mjeseci i preživjeli su zimu. Najnoviji dizajn Od 9. marta radi za 5 kontroliranih jedinica i službeno se registruje vrijeme rada na njemu.

izvor: www.habr.com

Dodajte komentar