Пачатак на дадзеным сайце
Самым зручным для выкарыстання варыянтам здымання інфармацыі аб уключэнні пускальніка аказаўся варыянт з оптапары PC817. Прынцыповая схемаПоплаткі ўтрымоўваюць па тры аднолькавых схемы, усё змешчана ў скрынкі з ABS пластыка, памер 100х100 мм. Фота оптапар Пры падлучэнні да пускавых апаратаў з паўправадніковымі вентылямі іх ток уцечкі дастатковы для адкрыцця РС817 і будзе ілжывае спрацоўванне лічыльніка. Для выключэння такой сітуацыі
Прыёмная частка выканана на бок 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:
//
//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 // 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.з з іншым шрыфтам.
Падводзячы вынік скажу, што сістэма апраўдала надзеі, стала прасцей сачыць за напрацоўкай абсталявання. Хоць усё сабрана на макетных поплатках, і ў тэрміновым парадку нараканняў у працы няма. Першыя элементы працуюць ужо больш за паўгода і перажылі зіму.
Крыніца: habr.com