Helyi autonóm adatgyűjtő rendszer (folytatás)

A webhely kezdete a linken.
A legkényelmesebb információszerzési módszer a relé bekapcsolásáról az optopár PC817 használata volt. Elvi sémaHelyi autonóm adatgyűjtő rendszer (folytatás)A táblák három azonos áramkört tartalmaznak, mindent ABS műanyag dobozokba helyeztek, méretük 100x100 mm. Optopár fényképHelyi autonóm adatgyűjtő rendszer (folytatás) A félvezetős relékhez való csatlakozáskor a szivárgási áramuk elegendő a PC817 bekapcsolásához, amely hamis számlálót indíthat. Az ilyen helyzet elkerülése érdekében sorosan a LED-optopár és a működésjelző LED elé egy további LED kerül. Ehhez megszakítjuk a J1 jumpert, és egy további LED1 LED-et forrasztunk be.
A vevő rész megvalósítása 1. oldalHelyi autonóm adatgyűjtő rendszer (folytatás)2. oldalHelyi autonóm adatgyűjtő rendszer (folytatás)ARDUINO MEGA 2560-hoz csatlakozó prototípus lapon történik. Ehhez egy kétsoros csatlakozót használunk a végén. Az információk megjelenítésére egy rezisztív érintőképernyőt és hőmérséklet érzékelőt használunk 240x400 felbontással. HX8352B.Helyi autonóm adatgyűjtő rendszer (folytatás) A kijelző ICSP csatlakozója leszerelésre került, és a mikro-SD foglalat nem került használatra. Az a helyzet, hogy a 'tiszta' SD foglalat használhatatlan a SPI busz ütközés miatt. A flash kártyához külön kártyaolvasót használtak, amely tartalmaz egy 3,3 V stabilizátort és egy három állású kimeneti buffert 74LVS125A. Itt jöttek a buktatók. A buffer három állású volt, de vagy az E01-ML01DP5, vagy a kártyaolvasó működött. A SdFat könyvtárban a megjegyzések között figyelmeztetést láttam az összeférhetetlenség miatt más eszközökkel. Az TXS0108E szintkonvertert eltávolították, és jumperrel helyettesítették, mivel az E01-ML01DP5 tolerálta az 5 V jeleket - de nem segített. Oszcilloszkóppal kimutatták az MISO vonalon a jel eltűnését a kártyaolvasó csatlakoztatásakor. Gondos vizsgálat során kiderült, hogy a 74LVS125A négycsatornás engedélyező jelének bemenetei egyszerűen a közös vezetőhöz lettek forrasztva, és semmiféle harmadik állás nem volt lehetséges. A buffer IC-t primitív szintátszázolóként használták az 5 V-ról 3,3 V-ra rezisztorok 3,3 kΩ soros csatlakoztatásával a jelvonalakon. Az MISO vonalon kívül. A kimeneti alsó kapcsoló valószínűleg a jeleket a „föld” szintre húzta. Megállapítva, hogy az MISO vonal engedélyező jele a 13-as láb, azt leválasztották a nyomvonalról, ésforrasztották.Helyi autonóm adatgyűjtő rendszer (folytatás)a bemeneti kimenet (9) 74LVS125A eszköz kiválasztása és a hangolási ellenállás között. Most, ha nincs hívás a memóriakártyára, a MISO-puffer kikapcsol, és nem zavarja meg a másik eszköz működését.Az áramkör panelrajzaHelyi autonóm adatgyűjtő rendszer (folytatás)A vevő működéseHelyi autonóm adatgyűjtő rendszer (folytatás)A DS3231-hez csatlakozó órák egy programozott I2C (TWI) buszt használnak.
Arduino IDE program// 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: dx.com
// open-smart.aliexpress.com/store/1199788
//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:
// www.aliexpress.com/store/product/3-2-TFT-LCD-Display-module-Touch-Screen-Shield-board-onboard-temperature-sensor-w-Touch-Pen/1199788_32755473754.html?spm=2114.12010615.0.0.bXDdc3
//OPEN-SMART UNO R3 5V / 3.3V:
// www.aliexpress.com/store/product/OPEN-SMART-5V-3-3V-Compatible-UNO-R3-CH340G-ATMEGA328P-Development-Board-with-USB-Cable-for/1199788_32758607490.html?spm=2114.12010615.0.0.ckMTaN

#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 fájl;
File myFile;
#define SD_CS_PIN SS

#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+
RF24 rádió(47, 49);

#include <DS3231.h>

DS3231 rtc(27, 25);
Idő 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 ("FEJLESZTŐK ÉS ÉPÍTŐK");
tft.setCursor (30, 20);
tft.print (utf8rus("Konstruáló V.V."));
tft.setCursor (40, 40);
tft.print (utf8rus("Esztergályos I.I."));
delay (2000);

radio.begin(); // Az nRF24L01+ működésének inicializálása
radio.setChannel(120); // Beállítjuk a vételi csatornát (0-127 között)
radio.setDataRate (RF24_250KBPS); // Beállítjuk az adatátviteli sebességet (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel (RF24_PA_MAX); // Beállítjuk az adó teljesítményét (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Megnyitjuk az 1-es csövet az 1-es adó azonosítóval 0xAABBCCDD11, az adatok vételére
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Bekapcsoljuk a vevőt, elkezdjük hallgatni az nyitott csöveket
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("SD kártya inicializálása");
tft.println("SD kártya inicializálása");
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("inicializálás sikertelen!");
tft.fillRect ( 8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Inicializálás sikertelen!");
return;
}
tft.setTextColor(WHITE);
Serial.println("inicializálás kész");
tft.println("Inicializálás kész");
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor ( 180, 0 ); // a kurzor pozíciójának beállítása
tft.fillRect ( 178, 0, 65, 7, GRAY); // a dátum megjelenítő terület törlése
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus("A vezető I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // ha a log fájl 2.txt létre lett hozva, folytatódik a fájlba írás
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // ha a 2.txt fájl nem létezik, létrehozásra kerül
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("hiba .txt fájl megnyitásakor");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if (time_sec_prev != t.sec) {
tft.setCursor ( 120, 0 ); // a kurzor pozíciójának beállítása
tft.fillRect ( 118, 0, 50, 7, GRAY); // a dátum megjelenítő terület törlése
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // Az óraképviseletek kiírása
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if (time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // a kurzor pozíciójának beállítása
tft.fillRect ( 178, 0, 65, 7, GRAY); // a dátum kiíró terület tisztítása
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // a dátum kiírása
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 ++; // egyszerű számláló
//////// С определённой условием периодичностью обновление данных
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); // ha a neve "2.txt" fájl nem létezik, akkor létrejön.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); // késleltetés, különben 13 azonos mérési adatot ír, amíg a másodperc el nem telik
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}A karakterek újrakódolásának programja/* 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;
} A karakterek újrakódolása a cyrill írás jelének megjelenítéséhez, az Adafruit_GFX könyvtárban lévő fájl egy mappában található az alapprogrammal. Továbbá, az Adafruit_GFX könyvtárban a glcdfont.c fájl cserélendő egy másik betűtípussal. Itt a szükséges csere könyvtára. A cirill írásra való lokalizálásról több információ is található az interneten.
Összefoglalva, a rendszer beváltotta a reményeket, könnyebbé vált a felszerelés működésének nyomon követése. Még ha minden is prototípusokon van összeszerelve, sürgős panasz nem érkezett a működés terén. Az első elemek már több mint fél éve működnek és átvészelték a telet. Az utolsó konstrukció a 9 kontrollált egység március 5-e óta működik, és az idő nyilvántartása hivatalosan is folyamatban van.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster