Лакальная аўтаномная сістэма збору даных (працяг)

Пачатак на дадзеным сайце па спасылцы.
Самым зручным для выкарыстання варыянтам здымання інфармацыі аб уключэнні пускальніка аказаўся варыянт з оптапары PC817. Прынцыповая схемаЛакальная аўтаномная сістэма збору даных (працяг)Поплаткі ўтрымоўваюць па тры аднолькавых схемы, усё змешчана ў скрынкі з ABS пластыка, памер 100х100 мм. Фота оптапарЛакальная аўтаномная сістэма збору даных (працяг) Пры падлучэнні да пускавых апаратаў з паўправадніковымі вентылямі іх ток уцечкі дастатковы для адкрыцця РС817 і будзе ілжывае спрацоўванне лічыльніка. Для выключэння такой сітуацыі паслядоўна ў ланцуг святлодыёда оптопары і святлодыёда індыкацыі працы дадаецца яшчэ адзін. Для гэтага размыкаецца перамычка J1 і ўпайваецца дадатковы святлодыёд LED1.
Прыёмная частка выканана на бок 1Лакальная аўтаномная сістэма збору даных (працяг)бок 2Лакальная аўтаномная сістэма збору даных (працяг)макетнай плаце якая падключаецца да ARDUINO MEGA 2560. Для гэтага выкарыстоўваецца двухрадковы раз'ём на тарцы. У якасці прылады адлюстравання інфармацыі выкарыстоўваецца які мае рэзістыўны тач і датчык тэмпературы экран з дазволам 240х400. HX8352B.Лакальная аўтаномная сістэма збору даных (працяг) Прычым раз'ём да ICSP на плаце экрана дэмантаваны і не выкарыстоўваецца гняздо для мікра-SD. Справа ў тым, што роднае гняздо SD нельга ўжыць па чынніку канфлікту на шыне SPI. Для флэш-карты быў ужыты асобны кардрыдар які мае ў складзе стабілізатар 3,3В і буферную мікрасхему з трыма станамі выхадаў 74LVS125A. Вось тут чакалі мяне граблі. Буфер з трыма станамі, але працаваў або E01-ML01DP5 або кардрыдар. У каментарах бібліятэкі SdFat разгледзеў папярэджанне аб несумяшчальнасці з іншымі прыладамі. Быў выдалены канвэртар узроўняў на TXS0108E і заменены перамычкамі, т.я. E01-ML01DP5 талерантны да 5В сігналам- не дапамагло. З дапамогай асцылографа выяўлена знікненне сігналу на лініі MISO пры падлучэнні кардрыдара. Пры ўважлівым разглядзе было ўсталявана, што ўваходы дазваляльных сігналаў ОЕ 4-х каналаў 74LVS125A былі проста прыпаяныя да агульнага провада і ні пра які трэці стан гаворкі быць не магло. Буферная мікрасхема выкарыстоўвалася як прымітыўны пераўтваральнік узроўняў ад 5В да 3.3В з выкарыстаннем рэзістараў 3,3 кім уключаных паслядоўна з сігнальнымі лініямі. Акрамя лініі MISO. Яе выходны ніжні ключ верагодна прыцягваў сігналы да ўзроўня "зямлі". Вызначыўшы што дазваляльны сігнал лініі MISO-гэта выснова 13, ён быў адарваны ад дарожкі іпрыпаяныЛакальная аўтаномная сістэма збору даных (працяг)паміж высновай уваходу (9) 74LVS125A выбару прылады CS і рэзістарам узгаднення. Цяпер калі няма звароту да карты памяці, MISO-буфер адключаецца і не замінае працы іншай прылады.Схема макетнай платыЛакальная аўтаномная сістэма збору даных (працяг)Прымач у працыЛакальная аўтаномная сістэма збору даных (працяг)Для падлучэння гадзін на DS3231 выкарыстоўваецца праграмная шына I2C (TWI).
Праграма 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
//[электронная пошта абаронена]
//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 // Core graphics library
//#include // Hardware-specific library
#include
MCUFRIEND_kbv tft;
#include "SdFat.h" // Use the SdFat library
SdFat SD;
SdFile file;
File myFile;
#define SD_CS_PIN SS

#include // Падключаем бібліятэку для працы з шынай SPI
#include // Падключаем файл настроек з бібліятэкі RF24
#include // Падключаем бібліятэку для працы з nRF24L24+
RF24 radio(47, 49);

#уключыць

DS3231 rtc(27, 25);
Time 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 вы дадаеце 5V-3.3V ўзровень converting circuit.
// Вы можаце выкарыстоўваць OPEN-SMART UNO Black version with 5V/3.3V Power Switch,
// Вы павінны патрабаваць 3.3V.
// control pins for LCD можа быць акрэслена на любы digital or
// аналагічныя 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

// Вызначыць чалавечы зыходны нумар для некаторых 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
// з'яўляецца 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));
////////////////////////////////////////////////// //////////////////

пустая ўстаноўка (пустая) {

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(«Канструктар В.В.» ));
tft.setCursor (40, 40);
tft.print (utf8rus(«Токар І.І.» ));
delay (2000);

radio.begin(); // Ініцыюем працу nRF24L01+
radio.setChannel(120); // Паказваем канал прыёму даных (ад 0 да 127)
radio.setDataRate (RF24_250KBPS); // Паказваем хуткасць перадачы дадзеных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбіт/сек
radio.setPALevel (RF24_PA_MAX); // Паказваем магутнасць перадатчыка (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Адкрываем 1 трубу з ідэнтыфікатарам 1 перадатчыка 0xAABBCCDD11, для прыёму дадзеных
// Адкрываем 2 трубу з ідэнтыфікатарам 2 перадатчыка 0xAABBCCDD22, для прыёму дадзеных
radio.startListening (); // Уключаем прымач, пачынаем праслухоўваць адчыненыя трубы
// 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); // ўстаноўка пазіцыі курсора
tft.fillRect (178, 0, 65, 7, GRAY); // ачыстка вобласці вываду часу
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывад назвы аб'ектаў кантролю
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus(«Лябедкі I»));
////////Стварэнне файла лога і выснова выніку спробы стварэння
tft.setTextSize(1);
tft.setCursor(130, 10); // калі файл лога 2.txt створаны, то будзе працягнуты запіс у файл
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Яшчэ {
myFile = SD.open(perv, FILE_WRITE); // калі файла 2.txt няма, то ён будзе створаны
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

несапраўдны цыкл (пусты) {
////////Праверка існавання запыту вываду лога ў манітор САМ- порта
if (Serial.available() > 0) {
if (1 == Serial.read());
////////І калі прынятая «1»- то выснова
File myFile = SD.open(perv);
// if the file available, write to it:
if (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
яшчэ {
Serial.println("error opening .txt");
}
}
////////Счытванне часу
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Калі час змяніўся, то вывад новых паказанняў гадзін
if ( time_sec_prev != t.sec) {
tft.setCursor (120, 0); // ўстаноўка пазіцыі курсора
tft.fillRect (118, 0, 50, 7, GRAY); // ачыстка вобласці вываду часу
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // выснова паказанняў гадзіннікаў
time_sec_prev = t.sec;
}
////////Калі дата змянілася, то выснова новай даты
if ( time_day_prev != t.date) {
tft.setCursor (180, 0); // ўстаноўка пазіцыі курсора
tft.fillRect (178, 0, 65, 7, GRAY); // ачыстка вобласці вываду даты
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // вывад паказанняў даты
time_day_prev = t.date;
}
////////Калі даступны радыёпрыём, то
if (radio.available(&pipe)) {
////////праверка запаўнення буфера прыёму,
radio.read(&data, sizeof(data));
////////калі даступны патрэбны адрас перадатчыка, то
if (pipe == 1) {
////////чакаем сінхранізуючую паслядоўнасць нулёў для вызначэння
//пачатку блока дадзеных
if ( data == 0000 ) {
rc = 0;
} Яшчэ {
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 ++; // проста лічыльнік
//////// З вызначанай умовай перыядычнасцю абнаўленне дадзеных
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); // калі файла з імем "2.txt" - не, то ён будзе створаны.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect (198, 8, 42, 10, GREEN);
tft.println(«SD OK»);
Serial.println("SD OK");
delay (900); // затрымка, інакш запісвае 13 аднолькавых паказанняў, пакуль секунда не пройдзе
} Яшчэ {
tft.fillRect (198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Праграма перакадоўкі знакаў/* 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;
}Праграма перакадоўкі сімвалаў для вываду кірыліцы бібліятэкай Adafruit_GFX змяшчаецца ў адну тэчку з асноўнай праграмай. Яшчэ трэба ў Adafruit_GFX замяніць файл glcdfont.з з іншым шрыфтам. Тут бібліятэка з патрабаванай заменай. Больш падрабязна аб русіфікацыі лёгка шукаецца ў інтэрнэце.
Падводзячы вынік скажу, што сістэма апраўдала надзеі, стала прасцей сачыць за напрацоўкай абсталявання. Хоць усё сабрана на макетных поплатках, і ў тэрміновым парадку нараканняў у працы няма. Першыя элементы працуюць ужо больш за паўгода і перажылі зіму. Апошняя канструкцыя на 9 кантраляваных агрэгатаў працуе з 5 сакавіка і па ёй ідзе рэгістрацыя часу напрацоўкі ўжо афіцыйна.

Крыніца: habr.com

Дадаць каментар