Începutul acestui site .
Cea mai convenabilă modalitate de a obține informații despre activarea releului s-a dovedit a fi varianta cu optocuplorul PC817. Schema de principiu
Plăcile conțin câte trei scheme identice, toate fiind montate într-o carcasă din plastic ABS, cu dimensiunea de 100x100 mm. Fotografie cu optocuplor
Atunci când sunt conectate la aparate de pornire cu semiconductori, curentul de scurgere este suficient pentru a activa PC817, ceea ce va provoca o declanșare falsă a contorului. Pentru a evita această situație se adaugă în serie un alt LED în circuitul LED-ului optocuplorului și LED-ul de indicare a funcționării. Pentru aceasta, se desface puntea J1 și se sudează un LED suplimentar, LED1.
Partea de recepție este realizată pe latura 1
latura 2
o placă de testare conectată la ARDUINO MEGA 2560. Pentru aceasta se utilizează un conector cu două rânduri la capăt. Ca dispozitiv de afișare a informațiilor, se folosește un ecran cu touchscreen rezistiv și senzor de temperatură, cu o rezoluție de 240x400 HX8352B.
De asemenea, conectorul ICSP de pe placa ecranului a fost demontat și nu se folosește slotul pentru micro-SD. Motivul este că slotul SD „original” nu poate fi utilizat din cauza conflictului pe bucla SPI. Pentru cardul flash a fost utilizat un cititor de carduri separat care are un stabilizator de 3,3 V și un circuit buffer cu trei stări de ieșire 74LVS125A. Ai aici pe unde m-am împotmolit. Bufferul cu trei stări a funcționat fie cu E01-ML01DP5, fie cu cititorul de carduri. În comentariile bibliotecii SdFat am observat un avertisment privind incompatibilitatea cu alte dispozitive. A fost eliminat convertorul de niveluri TXS0108E și a fost înlocuit cu punți, deoarece E01-ML01DP5 este tolerant la semnale de 5 V - nu a ajutat. Cu ajutorul unui osciloscop s-a constatat că semnalul de pe linia MISO a dispărut la conectarea cititorului de carduri. La o examinare atentă, s-a stabilit că semnalele de activare pentru cele 4 canale ale 74LVS125A au fost pur și simplu lipite de masa comună și nu era vorba despre o a treia stare. Chipul buffer a fost utilizat ca un convertor de niveluri simplu, de la 5V la 3.3V, cu ajutorul rezistorilor de 3,3 kΩ conectați în serie cu liniile semnalului. Cu excepția liniei MISO. Ieșirea sa inferioară, probabil, trăgea semnalele la nivelul „pământului”. Stabilind că semnalul de activare al liniei MISO este pinul 13, acesta a fost rupt de pe circuit șilipit
între ieșirea intrării (9) 74LVS125A alegerea dispozitivului CS și rezistorul de adaptare. Acum dacă nu există acces la placa de memorie, MISO-buffer-ul se dezactivează și nu interferează cu funcționarea altui dispozitiv.Schema plăcii de testare
Receptorul în funcțiune
Pentru conectarea ceasului la DS3231 se folosește bus-ul software I2C (TWI).
Programul 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("Constructor V.V."));
tft.setCursor (40, 40);
tft.print (utf8rus("Turner I.I."));
delay (2000);
radio.begin(); // Inițiem funcționarea nRF24L01+
radio.setChannel(120); // Se specifică canalul de recepție a datelor (de la 0 la 127)
radio.setDataRate (RF24_250KBPS); // Se specifică viteza de transmitere a datelor (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbps
radio.setPALevel (RF24_PA_MAX); // Se specifică puterea emițătorului (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Se deschide 1 tub cu identificatorul 1 al emițătorului 0xAABBCCDD11, pentru a primi date
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Activăm receptorul, începem să ascultăm tuburile deschise
// 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 ); // setarea poziției cursorului
tft.fillRect ( 178, 0, 65, 7, GRAY); // ștergerea zonei de ieșire a timpului
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus("Levezi I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // dacă fișierul de jurnal 2.txt a fost creat, va continua să scrie în fișier
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // dacă fișierul 2.txt nu există, acesta va fi creat
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("eroare la deschiderea .txt");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if ( time_sec_prev != t.sec) {
tft.setCursor ( 120, 0 ); // setarea poziției cursorului
tft.fillRect ( 118, 0, 50, 7, GRAY); // ștergerea zonei de ieșire a timpului
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // afișarea valorilor orei
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // setarea poziției cursorului
tft.fillRect ( 178, 0, 65, 7, GRAY); \/\/ ștergerea zonei de afișare a datei
tft.setTextSize(1);
tft.print(rtc.getDateStr()); \/\/ afișarea valorilor datei
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 ++; \/\/ doar un contor
//////// С определённой условием периодичностью обновление данных
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); \/\/ dacă nu există un fișier numit «2.txt», acesta va fi creat.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); \/\/ întârziere, altfel înregistrează 13 valori identice, până când secunda trece
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Program de re-codificare a caracterelor/* 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 de re-codificare a caracterelor pentru ieșirea cyrilică a bibliotecii Adafruit_GFX se află într-un singur folder cu programul principal. De asemenea, trebuie să înlocuim fișierul glcdfont.c din Adafruit_GFX cu o altă font. biblioteca cu înlocuirea necesară. Mai multe informații despre localizarea în limba rusă pot fi găsite ușor pe internet.
În concluzie, aș spune că sistemul a îndeplinit promisiunile, a devenit mai ușor de urmărit utilizarea echipamentului. Deși totul este montat pe plăci de probă, nu am avut plângeri urgente cu privire la funcționare. Primele elemente funcționează deja de mai mult de șase luni și au supraviețuit iernii. pentru 9 agregate controlate funcționează din 5 martie și se înregistrează deja oficial timpul de utilizare.
Sursa: habr.com
