Kohalik autonoomne andmete kogumise süsteem (järg)

Algus sellel veebilehel lingi kaudu.
Kõige mugavamaks variandiks teabe kogumiseks käivituslülitist osutus optopaar PC817. Põhimõtteline skeemKohalik autonoomne andmete kogumise süsteem (järg)Iga plaadi peal on kolm identset skeemi, kõik on paigutatud ABS-plastikust kastidesse, suurus 100x100 mm. Optopaaride fotodKohalik autonoomne andmete kogumise süsteem (järg) Kui ühendate pooljuhtventiiliga käivitusaparaatidele, on nende lekkevool piisav RS817 avamiseks, mis põhjustab vale loenduri aktiveerimise. Sellise olukorra vältimiseks lisatakse optopaaride ja tööindikaatori LEDi seeriasse veel üks LED. Selleks katkestatakse J1 sild ja paigaldatakse täiendav LED1.
Vastuvõtja osa on valmistatud külg 1Kohalik autonoomne andmete kogumise süsteem (järg)külg 2Kohalik autonoomne andmete kogumise süsteem (järg)prototüüpplaadi külge, mis on ühendatud ARDUINO MEGA 2560-ga. Selleks kasutatakse kaks rida ühendusklambreid otsas. Teabe kuvamiseks kasutatakse resistiivset puutetundlikku ekraani koos 240x400 resolutsiooniga temperatuurisensori HX8352B.Kohalik autonoomne andmete kogumise süsteem (järg) ICSP liides ekraani plaadil on eemaldatud ja mikro-SD pesa ei kasutata. Asi on selles, et "kodune" SD pesa ei sobi, kuna see tekitab konflikte SPI bussil. Flash-mälu jaoks kasutati eraldi kaardilugejat, millel oli 3,3V stabilisaator ja bufrite mikrokiip, mille väljunditel on kolm seisundit 74LVS125A. Siin ootasin ma takistusi. Büfferdel on kolm seisundit, kuid töötas kas E01-ML01DP5 või kaardilugeja. SdFat teegis märkasin hoiatust teiste seadmetega ühilduvuse osas. Tasemeteguri TXS0108E eemaldati ja asendati hüppajatega, kuna E01-ML01DP5 talub 5V signaale - see ei aidanud. Osleti abil tuvastati signaali kadumine MISO joonel kaardilugeja ühendamisel. Peene vaatlemisega leiti, et 4-kanaliste 74LVS125A lubamissignaalide OE sisendid olid lihtsalt keevitatud ühise juhtme külge ja mingist kolmandast seisundist ei saanud juttugi olla. Buferi mikrokiip kasutati primitiivse tasememuutjana 5V-st 3.3V-ks, kasutades 3,3 kΩ takisteid, mis olid järjestikku ühendatud signaali joontega. V.a MISO joon. Selle väljund madal võti tõenäoliselt tõmbas signaalid "maapinna" tasemele. Määrates, et MISO joone lubav signaal - see on väljund 13, see eraldati rajalt.joodetudKohalik autonoomne andmete kogumise süsteem (järg)sisendi väljundi (9) 74LVS125A seadme valiku CS ja kohandamisresistori vahel. Kui mälukaardile ei pöörduta, lülitub MISO-vahemälu välja ja ei sega teise seadme tööd.Katseplaadi skeemKohalik autonoomne andmete kogumise süsteem (järg)Vastuvõtja töötabKohalik autonoomne andmete kogumise süsteem (järg)DS3231 kellaühendamiseks kasutatakse I2C (TWI) programmivarre.
Arduino IDE programm// 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 fail;
Fail myFile;
#define SD_CS_PIN SS

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

#include <DS3231.h>

DS3231 rtc(27, 25);
Aeg 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 («DEVELOPERS & BUILD» );
tft.setCursor (30, 20);
tft.print (utf8rus(«Konstantin V.V.» ));
tft.setCursor (40, 40);
tft.print (utf8rus(«Töötaja I.I.» ));
delay (2000);

radio.begin(); // Käivitame nRF24L01+ töö
radio.setChannel(120); // Määrame andmete vastuvõtukanali (0 kuni 127)
radio.setDataRate (RF24_250KBPS); // Pange andmete edastuskiirus (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel (RF24_PA_MAX); // Määrame edastaja võimsuse (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Avame edastaja 0xAABBCCDD11, identifikaatoriga 1, et andmeid vastu võtta
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Lülitame vastuvõtja sisse, hakkame kuulama avatud torusid
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println(«Initial SD card»);
tft.println(«Initial SD card»);
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println(«initial failed!»);
tft.fillRect ( 8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println(«Initial failed!»);
return;
}
tft.setTextColor(WHITE);
Serial.println(«initialization done»);
tft.println(«Initialization done»);
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor ( 180, 0 ); // kursor positsioneerimine
tft.fillRect ( 178, 0, 65, 7, GRAY); // ajaväljundi ala puhastamine
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus(«Lebeödki I»));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // kui logifail 2.txt on loodud, jätkatakse faili kirjutamist
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // kui faili 2.txt pole, siis see luuakse
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(«error opening .txt»);
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if ( time_sec_prev != t.sec) {
tft.setCursor ( 120, 0 ); // kursoripositsiooni seadmine
tft.fillRect ( 118, 0, 50, 7, GRAY); // ajaväljundi ala puhastamine
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // kellaaegade väljund
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // kursor positsioneerimine
tft.fillRect ( 178, 0, 65, 7, GRAY); // kuupäeva väljundi ala puhastamine
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // kuupäeva väljund
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 ++; // lihtsalt loendaja
//////// С определённой условием периодичностью обновление данных
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); // kui faili nimega «2.txt» ei ole, siis see loodakse.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); // viivitus, muidu kirjutab 13 sama näitu, kuni sekund on möödas
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Sümbolite dekodeerimise programm/* 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;
Programmi sümbolite kodeerimise programm, et saata tsüklit Adafruit_GFX teekidega, paigutatakse samasse kausta põhiprogrammiga. Samuti tuleb Adafruit_GFX-s asendada fail glcdfont.c teise fondiga. Siit raamatukogu vajaliku asendamisega. Rohkem info kohta lokaliseerimise kohta on kergesti leitav internetis.
Kokkuvõtteks võin öelda, et süsteem on oma lootusi õigustanud, seadmete töötamise jälgimine on muutunud lihtsamaks. Kuigi kõik on kokku pandud katseplaatidel, ei ole töös olnud kiireid kaebusi. Esimesed elemendid on töötanud juba üle kuue kuu ja suve on nad üle elanud. Viimane konstruktsioon 9 kontrollitud agregaatidega töötab alates 5. märtsist ja selle järgi toimub töötamise aja registreerimine juba ametlikult.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster