Filloni në këtë faqe .
Më e përshtatshme për të përdorur për metodën e marrjes së informacionit për aktivizimin e ndërlidhësit doli të ishte varianti me optopara PC817. Schema themelore
Platformat përmbajnë nga tre skema të njëjta, gjithçka është vendosur në kutitë prej plastike ABS, me përmasa 100x100 mm. Foto e optoparës
Kur lidhen me aparatet nisëse me ventilë gjysmëpërçuesi, rryma e tyre e rrjedhjes është e mjaftueshme për të hapur PC817 dhe do të ketë aktivizim të rremë të numëruesit. Për të përjashtuar një situatë të tillë, në seri në linjën e LED-it të optoparës dhe LED-it të treguesit të funksionimit shtohet një tjetër. Për këtë, shkëputet lidhësi J1 dhe derdhet një LED i ri, LED1.
Pjesa e marrjes është realizuar në ana 1
ana 2
në pllakën provuese e cila lidhet me ARDUINO MEGA 2560. Përdoret një lidhës me dy radhë në skajin e saj. Si pajisje përfaqësimi të informacionit përdoret një ekran me prekje rezistive dhe sensor temperature me rezolucion 240x400 HX8352B.
Në të vërtetë, porta ICSP në pllakën e ekranit është demontuar dhe nuk përdoret vendi për mikro-SD. Problemi është se vendi "i natyrshëm" SD nuk mund të përdoret për shkak të konfliktit në autobusin SPI. Për kartën e flash u përdor një lexues kartash i veçantë që përmban një stabilizues 3.3V dhe një çip bufer me tre gjendje dalëse 74LVS125A. Këtu më pritën disa probleme. Buferi me tre gjendje punonte ose E01-ML01DP5 ose lexues kartash. Në komentet e bibliotekës SdFat vura re një paralajmërim për moskompatibilitet me pajisje të tjera. U dëbua konvertuesi i niveleve TXS0108E dhe u zëvendësua me lidhje, pasi E01-ML01DP5 është tolerant ndaj sinjaleve 5V - nuk ndihmoi. Me ndihmën e oscilografit, u zbulua humbja e sinjalit në linjën MISO kur u lidh lexuesi i kartave. Pasi u shqyrtua me kujdes, u vërtetua se hyrjet e sinjaleve autorizuese OE të katër kanaleve 74LVS125A ishin thjesht të salduara në një tel të zakonshëm dhe nuk kishte asnjë mundësi për një gjendje të tretë. Çipi bufer u përdor si një transformator primitivi i niveleve nga 5V në 3.3V duke përdorur rezistorë 3.3 kΩ të vendosur në seri me linjat e sinjalit. Përveç linjës MISO. Niveli i saj dalës në poshtë ndoshta tërhiqte sinjalet në nivelin "toka". Pasi përcaktova që sinjali autorizues i linjës MISO është dalja 13, ai u shkëput nga pista dhei bashkuar
mes daljes së hyrjes (9) 74LVS125A për zgjedhjen e pajisjes CS dhe rezistorit të përputhjes. Tani nëse nuk ka referim në kartën e memories, buferri MISO çactivizohet dhe nuk pengon funksionimin e pajisjes tjetër.Skema e devijimit
Pranuesi në punë
Për lidhjen e orës DS3231 përdoret autobusi programor I2C (TWI).
Programi 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);
Koha 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(«Konstruktori V.V.» ));
tft.setCursor (40, 40);
tft.print (utf8rus(«Tokari I.I.» ));
delay (2000);
radio.begin(); // Iniciejoni punën nRF24L01+
radio.setChannel(120); // Caktoni kanal për pranimin e të dhënave (nga 0 deri në 127)
radio.setDataRate (RF24_250KBPS); // Specifikoni shpejtësinë e transmetimit (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel (RF24_PA_MAX); // Specifikoni fuqinë e transmetësit (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Hapim 1 tub me identifikuesin 1 të transmetuesit 0xAABBCCDD11, për të pranuar të dhëna
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Aktivizoni marrësin, filloni të dëgjoni tubat e hapura
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println(«Kartela SD e inicializuar»);
tft.println(«Kartela SD e inicializuar»);
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println(«në fillim dështoi!»);
tft.fillRect ( 8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println(«Nisja dështoi!»);
return;
}
tft.setTextColor(WHITE);
Serial.println(«inicializimi përfundoi»);
tft.println(«Inicimi përfundoi»);
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor ( 180, 0 ); // vendosja e pozicionit të kursorit
tft.fillRect ( 178, 0, 65, 7, GRAY); // pastrimi i zonës së tregimit të kohës
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus(«Lëbëdhi I»));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // nëse skedari log 2.txt është krijuar, do të vazhdojë regjistrimi në skedar
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // nëse skedari 2.txt nuk ekziston, ai do të krijohet
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(«gabim në hapje .txt»);
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // vendosja e pozicionit të kursorit
tft.fillRect(118, 0, 50, 7, GRAY); // pastrimi i zonës së daljes së kohës
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // shfaqja e kohës
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if (time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // vendosja e pozicionit të kursorit
tft.fillRect(178, 0, 65, 7, GRAY); // pastrimi i zonës së daljes së datës
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // shfaqja e datës
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++; // thjesht një numërues
//////// С определённой условием периодичностью обновление данных
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); // nëse nuk ka skedar me emrin "2.txt", ai do të krijohet.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println("SD OK");
Serial.println("SD OK");
delay(900); // vonesë, përndryshe regjistron 13 të njëjtat lexime derisa një sekondë të kalojë
} else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Programi i konvertimit të karaktereve/* 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;
Programi për kodimin e karaktereve për të shfaqur cirilikun me librarinë Adafruit_GFX është vendosur në një dosje me programin kryesor. Duhet gjithashtu të zëvendësohet skedari glcdfont.c në Adafruit_GFX me një font tjetër. libraria me zëvendësimin e kërkuar. Më shumë rreth lokalizimit të lehtë mund të gjendet në internet.
Përmbledhja është se sistemi ka përmbushur pritshmëritë, është bërë më e lehtë ndjekja e punës së pajisjeve. Edhe pse gjithçka është e ndërtuar në pllaka provizore, në një mënyrë urgjente nuk ka ankesash në punë. Elementet e para kanë punuar për më shumë se gjashtë muaj dhe kanë mbijetuar dimrin. për 9 agregat të kontrolluar punon që nga 5 marsi dhe në të po regjistrohet koha e punës tashmë zyrtarisht.
Burimi: habr.com
