Lokalni autonomni sustav prikupljanja podataka (nastavak)

Početak na ovoj stranici na linku.
Najpraktičnija opcija za prikupljanje informacija o aktivaciji prekidača bila je verzija s optoparom PC817. Principska shemaLokalni autonomni sustav prikupljanja podataka (nastavak)Platne kartice sadrže tri identične sheme, sve je smješteno u kućišta od ABS plastike dimenzija 100x100 mm. Fotografija optopareLokalni autonomni sustav prikupljanja podataka (nastavak) Pri povezivanju s pokretačkim uređajima sa poluprovodničkim ventilima, njihova struja curenja dovoljna je za aktivaciju RS817 i doći će do lažnog aktiviranja brojača. Kako bismo isključili takvu situaciju sekundarno u krug svjetlosne diode optopare i svjetlosne diode indikacije rada dodaje se još jedna. U tu svrhu prekida se most J1 i umetne dodatna svjetlosna dioda LED1.
Prijemni dio izveden je na strana 1Lokalni autonomni sustav prikupljanja podataka (nastavak)strana 2Lokalni autonomni sustav prikupljanja podataka (nastavak)prototipnoj ploči povezanoj s ARDUINO MEGA 2560. Za to se koristi dvo-redna priključnica na kraju. Kao uređaj za prikaz informacija koristi se touchscreen s otporom i senzor temperature na ekranu s rezolucijom 240x400 HX8352B.Lokalni autonomni sustav prikupljanja podataka (nastavak) Priključak za ICSP na ploči ekrana je demontiran i ne koristi se utor za micro-SD. Razlog je u tome što se "izvorni" utor SD ne može koristiti zbog sukoba na SPI sabirnici. Za flash karticu upotrebljen je zasebni čitač kartica koji sadrži stabilizator 3,3V i buffer čip sa tri stanja izlaza 74LVS125A. Ovdje su me čekale poteškoće. Buffer s tri stanja, ali radio je ili E01-ML01DP5 ili čitač kartica. U komentarima biblioteke SdFat uočena je upozorenje o nespojivosti s drugim uređajima. Uklonjen je pretvarač razina TXS0108E i zamijenjen veznim žicama, jer je E01-ML01DP5 tolerantan na 5V signale - nije pomoglo. Pomoću osciloskopa otkriveno je nestajanje signala na liniji MISO pri povezanju čitača kartica. Nakon pomnog pregleda utvrđeno je da su ulazi omogućavajućih signala OE četiri kanala 74LVS125A jednostavno priključeni na zajedničku žicu i nije moglo biti govora o nikakvom trećem stanju. Buffer je korišten kao primitivni pretvarač razina od 5V do 3,3V koristeći otpornike od 3,3 kΩ priključene serijski s signalnim linijama. Osim linije MISO. Njegova izlazna donja tipka vjerojatno je privlačila signale na razinu „uzeća“. Utvrdivši da je omogućavajući signal na liniji MISO - to je izlaz 13, odvojen je od staze ipriključenLokalni autonomni sustav prikupljanja podataka (nastavak)između izlaza ulaza (9) 74LVS125A odabira uređaja CS i otpornika usklađivanja. Sada, ako nema pristupa memorijskoj kartici, MISO-bufer se isključuje i ne ometa rad drugog uređaja.Shema prototipne pločeLokalni autonomni sustav prikupljanja podataka (nastavak)Prijemnik u raduLokalni autonomni sustav prikupljanja podataka (nastavak)Za povezivanje sata na DS3231 koristi se softverska sabirnica I2C (TWI).
Program Arduino IDE// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP.
//by Open-Smart Team and Catalex Team
//catalex_inc@163.com
//Store: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo Function: Display graphics, characters
//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.2INCH 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 <Adafruit_GFX.h> // Core graphics library
//#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include «SdFat.h» // Use the SdFat library
SdFat SD;
SdFile file;
File myFile;
#define SD_CS_PIN SS

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+
RF24 radio(47, 49);

#include <DS3231.h>

DS3231 rtc(27, 25);
Vrijeme t;

uint16_t r = 6000;
uint32_t k = 0;

volatile unsigned long data;
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;

//***********************************************//
// If you use OPEN-SMART TFT breakout board //
// Reconmmend you to add 5V-3.3V level converting circuit.
// Of course you can use OPEN-SMART UNO Black version with 5V/3.3V power switch,
// you just need switch to 3.3V.
// The control pins for the LCD can be assigned to any digital or
// analog pins…but we’ll use the analog pins as this allows us to
//—————————————-|
// 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

// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define GRAY 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// 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();

// Для установки времени- раскомментировать нужные строки
// rtc.setDOW(6); // День недели
// rtc.setTime(22, 04, 0); // Время, в формате 24 часа.
// rtc.setDate(4, 5, 2019); // Дата, 29 октября 2018г.

Serial.begin(2000000);
//////// Инициализация экрана
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Вывод имен, принадлежности оборудования, название организации
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor (8, 0);
tft.println ("RAZVOJ I GRADNJA" );
tft.setCursor (30, 20);
tft.print (utf8rus("Konstruktora V.V." ));
tft.setCursor (40, 40);
tft.print (utf8rus("Tokar I.I." ));
delay (2000);

radio.begin(); // Iniciramo rad nRF24L01+
radio.setChannel(120); // Postavljamo kanal prijema podataka (od 0 do 127)
radio.setDataRate (RF24_250KBPS); // Postavljamo brzinu prijenosa podataka (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel (RF24_PA_MAX); // Postavljamo snagu odašiljača (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Otvaramo 1 cijev s identifikatorom 1 odašiljača 0xAABBCCDD11, za prijem podataka
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening(); // Uključujemo prijemnik, započinjemo slušanje otvorenih cijevi
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("Inicijalizacija SD kartice");
tft.println("Inicijalizacija SD kartice");
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("inicijalizacija nije uspjela!");
tft.fillRect (8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Inicijalizacija nije uspjela!");
return;
}
tft.setTextColor(WHITE);
Serial.println("inicijalizacija završena");
tft.println("Inicijalizacija završena");
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor (180, 0); // postavljanje pozicije kursora
tft.fillRect (178, 0, 65, 7, GRAY); // čišćenje područja ispisivanja vremena
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus("Lebjedki I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // ako je log datoteka 2.txt stvorena, nastaviti će se zapisivanje u datoteku
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, biće stvorena
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop(void) {
////////Проверка существования запроса вывода лога в монитор СОМ- порта
if (Serial.available() > 0) {
if (1 == Serial.read());
////////И если принята «1»- то вывод
File myFile = SD.open(perv);
// if the file is available, write to it:
if (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("greška pri otvaranju .txt");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if (time_sec_prev != t.sec) {
tft.setCursor (120, 0); // postavljanje pozicije kursora
tft.fillRect ( 118, 0, 50, 7, GRAY); //-- čišćenje područja za prikaz vremena
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); //-- prikaz vremena
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor (180, 0); // postavljanje pozicije kursora
tft.fillRect ( 178, 0, 65, 7, GRAY); //-- čišćenje područja za prikaz datuma
tft.setTextSize(1);
tft.print(rtc.getDateStr()); //-- prikaz datuma
time_day_prev = t.date;
}
////////Если доступен радиоприём, то
if (radio.available(&pipe)) {
////////проверка заполнения буфера приёма,
radio.read(&data, sizeof(data));
////////если доступен нужный адрес передатчика, то
if (pipe == 1) {
////////ждём синхронизирующую последовательность нулей для определения
//начала блока данных
if ( data == 0000 ) {
rc = 0;
} else {
rc ++;
}
////////Запись значений счётчиков и расчёт их в 10 и 100-х долях часа
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 ++; //-- samo brojač
//////// С определённой условием периодичностью обновление данных
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect ( 0, 41, 180, 64, GRAYD);
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;
}
////////Запись данных в лог на SD каждые 10 мин.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////Создание строки в формате .csv
String dataString = String (rtc.getDateStr()) + «, «+(rtc.getTimeStr()) + «, » + (leb_1) + «, » + (leb_2)
+ «, » + (leb_3) + «, » + (leb_4) + «, «;
////////Запись в файл и вывод результатов процесса записи
myFile = SD.open(perv, FILE_WRITE); //-- ako datoteka s imenom «2.txt» ne postoji, bit će stvorena.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); //-- kašnjenje, inače zapisa 13 istih mjerenja, dok sekunda ne prođe
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Program za prekodiranje simbola/* Recode russian fonts from UTF-8 to Windows-1251 */

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

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

while (i < k) {
n = source[i]; i++;

if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB8; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}Program za prekodiranje simbola za ispis ćirilice bibliotekom Adafruit_GFX nalazi se u istoj mapi s glavnim programom. Također je potrebno u Adafruit_GFX promijeniti datoteku glcdfont.c s drugim fontom. Ovdje biblioteka s potrebnom promjenom. Više o rusifikaciji lako se može pronaći na internetu.
Zaključno, reći ću da je sustav ispunio očekivanja, postalo je lakše pratiti rad opreme. Iako je sve sastavljeno na probnim pločama, nemam hitnih primjedbi u radu. Prvi elementi rade već više od pola godine i preživjeli su zimu. Posljednja konstrukcija za 9 kontroliranih agregata radi od 5. ožujka i po njoj se već službeno registrira vrijeme rada.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster