Локальна автономна система збору даних (продовження)

Початок на цьому сайті за посиланням.
Найзручнішим для використання варіантом знімання інформації про включення пускача виявився варіант із оптопарою 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;

//***********************************************/ /
// Якщо ви використовуєте OPEN-SMART TFT breakout board //
// Reconmmend you to add 5V-3.3V рівень converting circuit.
// Ви можете використовувати OPEN-SMART UNO Black version with 5V/3.3V power switch,
// You just need switch to 3.3V.
// Control pins for LCD може бути визначений до будь-якого цифрового або
// 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(«Конструктор В.В.»));
tft.setCursor (40, 40);
tft.print (utf8rus(«Токар І.І.»));
затримка (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(«іnitalization done»);
tft.println("Initialization done");
затримка (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);
}
}

цикл void (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();
}
ще {
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

Додати коментар або відгук