Začátek na této stránce .
Nejvhodnějším způsobem, jak získat informace o zapnutí spínače, se ukázal být způsob s optopárem PC817. Schématické zobrazení
Desky obsahují tři identické schémata, vše je umístěno v krabicích z ABS plastu o rozměrech 100x100 mm. Fotografie optopáru
Při připojení k spínacím aparátům s polovodičovými ventilami je jejich únikový proud dostatečný k otevření RS817, což způsobí falešné spuštění počítadla. Pro vyloučení takové situace se do série LED diody optopáru a LED diody indikující provoz přidá další. K tomu se přeruší jumper J1 a napájí se další LED dioda LED1.
Příjmová část je provedena na strana 1
strana 2
prototypové desce připojené k ARDUINO MEGA 2560. K tomu se používá dvouřadý konektor na konci. Jako zobrazovací zařízení se používá displej s rezistivním dotykem a teplotním senzorem s rozlišením 240x400 HX8352B.
Kromě toho byl konektor ICSP na desce obrazovky demontován a nezapojil se slot pro micro-SD. Důvodem je, že "rodný" slot pro SD nemůže být použit kvůli konfliktu na sběrnici SPI. Pro flash kartu byl použit samostatný čtečka karet, který měl stabilizátor 3,3V a bufferovou mikroschémi s výstupy ve třech stavech 74LVS125A. Toto bylo místo, kde mě čekaly potíže. Buffer s třemi stavy, ale fungoval buď E01-ML01DP5, nebo čtečka karet. V komentářích k knihovně SdFat jsem si všiml varování o nekompatibilitě s jinými zařízeními. Byla odstraněna úroveň převodníku na TXS0108E a nahrazena propojkami, protože E01-ML01DP5 je tolerantní k signálům 5V - nepomohlo to. S pomocí osciloskopu bylo zjištěno, že signál na lince MISO vymizel při připojení čtečky karet. Při podrobném zkoumání bylo zjištěno, že vstupy zapínacích signálů OE čtyř kanálů 74LVS125A byly jednoduše připájeny k společnému drátu a o žádném třetím stavu nemohlo být řeči. Bufferová mikroschéma byla používána jako primitivní převodník úrovní z 5V na 3.3V s použitím rezistorů 3,3 kΩ zapojených sériově se signálními linkami. Kromě linky MISO. Její výstupní dolní klíč pravděpodobně tahal signály na úroveň "země". Po určení, že zapínací signál linky MISO - to je pin 13, byl odtržen od dráhy apřipájen
mezi výstupem vstupu (9) 74LVS125A výběru zařízení CS a ladicím odporem. Pokud tedy nedojde k přístupu na paměťovou kartu, MISO-buffer se vypne a nebrání práci jiného zařízení.Schéma plošného spoje
Přijímač v provozu
Pro připojení hodin na DS3231 se používá softwarová sběrnice I2C (TWI).
Program 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 soubor;
Soubor myFile;
#define SD_CS_PIN SS
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+
RF24 rádio(47, 49);
#include <DS3231.h>
DS3231 rtc(27, 25);
Čas 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("Konstructor V.V."));
tft.setCursor (40, 40);
tft.print (utf8rus("Tokář I.I."));
delay (2000);
radio.begin(); // Inicializujeme práci nRF24L01+
radio.setChannel(120); // Určujeme kanál pro příjem dat (od 0 do 127)
radio.setDataRate (RF24_250KBPS); // Určujeme rychlost přenosu dat (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel (RF24_PA_MAX); // Určujeme výkon vysílače (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Otevíráme 1 potrubí s identifikátorem 1 vysílače 0xAABBCCDD11 pro příjem dat
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Aktivujeme přijímač, začínáme poslouchat otevřená potrubí
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("Inicializace SD karty");
tft.println("Inicializace SD karty");
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("inicializace selhala!");
tft.fillRect ( 8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Inicializace selhala!");
return;
}
tft.setTextColor(WHITE);
Serial.println("inicializace hotová");
tft.println("Inicializace hotová");
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor ( 180, 0 ); // nastavujeme pozici kurzoru
tft.fillRect ( 178, 0, 65, 7, GRAY); // vyčistíme oblast pro výstup času
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus("Lebědky I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // pokud je soubor logu 2.txt vytvořen, bude pokračováno v zápisu do souboru
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // pokud soubor 2.txt neexistuje, bude vytvořen
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("chyba při otevírání .txt");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if ( time_sec_prev != t.sec) {
tft.setCursor ( 120, 0 ); // nastavujeme pozici kurzoru
tft.fillRect ( 118, 0, 50, 7, GRAY); // vyčistíme oblast pro výstup času
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // výstup hodinových údajů
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // nastavujeme pozici kurzoru
tft.fillRect(178, 0, 65, 7, GRAY); // vyčištění oblasti pro zobrazení data
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // zobrazení data
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++; // pouze počítadlo
//////// С определённой условием периодичностью обновление данных
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_3) + ", " + (leb_4) + ", ";
////////Запись в файл и вывод результатов процесса записи
myFile = SD.open(perv, FILE_WRITE); // pokud soubor s názvem "2.txt" neexistuje, bude vytvořen.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println("SD OK");
Serial.println("SD OK");
delay(900); // zpoždění, jinak zapisuje 13 stejných měření, dokud neuplyne sekunda
} else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Program for character encoding/* 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
case ".css":
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB8; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70; // 0x6F
case ".css":
}
}
}
m[0] = n; target = target + String(m);
}
return target;
} Program for character encoding for displaying Cyrillic with the Adafruit_GFX library is placed in the same folder as the main program. It is also necessary to replace the glcdfont.c file in Adafruit_GFX with a different font. library with the required replacement. More information about Russian localization can be easily found on the internet.
In conclusion, I would say that the system has fulfilled expectations, it has become easier to monitor equipment usage. Even though everything is assembled on prototype boards, there are no urgent complaints about the operation. The first elements have been functioning for more than half a year and survived the winter. for 9 controlled units has been operating since March 5 and time registration for operation is already official.
Zdroj: habr.com
