Selle saidi algus .
Kõige mugavam viis käivitaja sisse lülitamise teabe kogumiseks osutus optopaariga PC817 variant. Põhimõtteline skeem
Trükkplaatidel on kolm identset skeemi ja kõik on paigutatud ABS plastist kastidesse, mille mõõtmed on 100x100 mm. Optopaaride foto
Pooljuhtventiilidega käivitusseadmete ühendamisel on lekkevool piisav RS817 avamiseks, mis põhjustab vale positiivse signaali loenduri jaoks. Selle olukorra vältimiseks lisatakse optopaaride LED-i ja tööindikaatori LED-i ahelasse veel üks seeriaviisiliselt. Selle jaoks katkestatakse jumper J1 ja soudatakse lisale LED1.
Vastuvõtjaosa on teostatud külg 1
külg 2
prototüüpplaadile, mis on ühendatud ARDUINO MEGA 2560-ga. Selleks kasutatakse kaheahelalist liidest otsmikul. Teabe kuvamisseadmeks on resistiivne puutetundlik ekraan ja temperatuurisensor, mille eraldusvõime on 240x400 HX8352B.
Selle õnneks on ekraani ICSP pesa demonteeritud ja mikro-SD pesa ei ole kasutusel. Asi on selles, et "sünnipärane" SD pesa ei ole sobilik SPI bussil tekkivate konfliktide tõttu. Mälukaardi jaoks on kasutatud eraldi kaardilugejat, millel on 3,3V stabilisaator ja kolme olekuga väljundiga puhvermikroskeem 74LVS125A. Siin ootas mind üllatus. Puhverkollektsioon oli kolme olekuga, kuid tööle läks ainult E01-ML01DP5 või kaardilugeja. SdFat teegis oli kommentaar, kus hoiatati jaotajate ühilduvuse probleemide tõttu. TXS0108E taseme muundur eemaldati ja asendati jumperite abil, kuna E01-ML01DP5 on 5V signaalide suhtes tolerantne - ei aidanud. Otsmiku-oscilloskoop avastas, et MISO joontel kadus signaal kaardilugejaga ühendamisel. Sügava lähenemise kaudu leiti, et 74LVS125A nelikühenduste luba sisse lülitasid lihtsalt ühte ühist otsa ning kolmandast olekust ei saanud kõneleda. Puuduv mikroskeem töötas primitiivse tasemekonverterina 5V-st 3.3V-ni, kasutades seiriiniga ühendatud 3,3 kOhm resistoreid. Lisaks MISO reale. Selle väljund all tõenäoliselt tõmbas signaale "maa" tasemele. Määrates, et MISO joone lubav signaal on väljund 13, katkestati see tee jasoudati.
seadmise väljundi (9) 74LVS125A seadme valiku CS ja kokkusobitumisresistori vahel. Nüüd, kui mälukaardile polnud pöördumist, MISO-puhver lülitatakse välja ja ei sega teise seadme tööd.Kereplaadi skeem
Vastuvõtja töötab
Kellade ühendamiseks DS3231 kasutatakse tarkvaralist I2C (TWI) bussi.
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:
//
//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 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);
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(«Konstructsiooni B.V.» ));
tft.setCursor (40, 40);
tft.print (utf8rus(«Masinaehitaja I.I.» ));
delay (2000);
radio.begin(); // Käivitame nRF24L01+ töö
radio.setChannel(120); // Määrame andmete vastuvõtu kanali (0 kuni 127)
radio.setDataRate (RF24_250KBPS); // Määrame andmete edastamise kiirus (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/sek
radio.setPALevel (RF24_PA_MAX); // Määrame saatja võimsuse (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Avame 1 toru identifikaatoriga 1 saatja 0xAABBCCDD11, et andmeid vastu võtta
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Lülitame vastuvõtja sisse, alustame avatud torude kuulamist
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println(«Algne SD kaart»);
tft.println(«Algne SD kaart»);
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println(«algus ebaõnnestus!»);
tft.fillRect ( 8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println(«Algus ebaõnnestus!»);
return;
}
tft.setTextColor(WHITE);
Serial.println(«algatus on tehtud»);
tft.println(«Algatus on tehtud»);
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor ( 180, 0 ); // kursori positsiooni seadmine
tft.fillRect ( 178, 0, 65, 7, GRAY); // ajaseadmise väljundala puhastamine
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus(«Tõstuke I»));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // kui logifail 2.txt on loodud, siis 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 ei ole, 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(«vea avamine .txt»);
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if ( time_sec_prev != t.sec) {
tft.setCursor ( 120, 0 ); // kursori positsiooni seadmine
tft.fillRect ( 118, 0, 50, 7, GRAY); // ajaseadmise väljundi puhastamine
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // kellaja näitude väljund
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // kursori positsiooni seadmine
tft.fillRect ( 178, 0, 65, 7, GRAY); // kuvatage kuupäeva väljundala
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // kuupäeva näitamine
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 luuakse.
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, vastasel juhul kirjutab 13 sama näitu, kuni sekund on möödunud
} 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;
}Sümbolite dekodeerimise programm väljastab tsüklit Adafruit_GFX raamatukoguga, paigutatakse ühe kausta põhiprogrammiga. Samuti tuleb Adafruit_GFX-is asendada fail glcdfont.c teise fondiga. raamatukogu koos vajaliku asendusega. Rohkem teavet vene keeles leidub internetis.
Kokkuvõtteks ütlen, et süsteem on õigustanud ootusi, seadmete töö jälgimine on muutunud lihtsamaks. Kuigi kõik on koos makettplaatide peal, ei ole töö osas kiirelt kaebusi. Esimesed elemendid on töötanud juba rohkem kui kuus kuud ja talunud talve. 9 kontrollitava seadmega töötab alates 5. märtsist ja sellel toimub tööaja registreerimine juba ametlikult.
Allikas: habr.com
