Начало на уебсайта .
Най-удобният вариант за извличане на информация за активирането на пускателя се оказа вариантът с оптопарите 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 бе толерантен към 5V сигнали - не помогна. С помощта на осцилоскопа бе установено изчезването на сигнала на линията MISO при свързване на картовия четец. При внимателно разглеждане се установи, че входовете на разрешаващите сигнали OE на четирите канала на 74LVS125A бяха просто запоени към общ проводник и затова не можеше да има трето състояние. Буферната микросхема се използваше като примитивен преобразувател на нива от 5V до 3.3V с помощта на резистори от 3.3 kΩ, включени последователно със сигналните линии. Освен линията 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
//catalex_inc@163.com
//Store:
//
//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:
//
//OPEN-SMART UNO R3 5V / 3.3V:
//
#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);
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 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(«Конструктор В.В.» ));
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);
} else {
myFile = SD.open(perv, FILE_WRITE); // ако файлът 2.txt не съществува, той ще бъде създаден
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 ); // задаване на позицията на курсора
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;
} 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 ++; // просто брояч
//////// С определённой условием периодичностью обновление данных
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 идентични показания, докато не изтече секунда
} else {
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;
} Програма за преkodиране на символи за извеждане на кирилица с библиотеката Adafruit_GFX се поставя в една папка с основната програма. Също така трябва в Adafruit_GFX да се замени файлът glcdfont.c с друг шрифт. библиотека с необходимата заместване. Подробности за русификацията лесно се намират в интернет.
В заключение, ще кажа, че системата оправда очакванията и станало е по-лесно да се следи работата на оборудването. Въпреки че всичко е събрано на макетни платки, за спешни случаи няма оплаквания в работата. Първите елементи работят вече повече от половин година и преживяха зимата. на 9 контролирани агрегата работи от 5 март и по нея се регистрира времето на работа вече официално.
Източник: habr.com
