Lokal autarkisk datainsamlingssystem (fortsat)

Start på denne hjemmeside via linket.
Den mest brugervenlige metode til at optage information om aktivering af kontaktoren viste sig at være metoden med PC817 optokobler. PrincipskemaLokal autarkisk datainsamlingssystem (fortsat)Kredse indeholder tre identiske skemaer, alt placeret i ABS plastkasser, størrelse 100x100 mm. Billede af optokoblerLokal autarkisk datainsamlingssystem (fortsat) Når der tilsluttes til startapparater med halvlederventiler, er deres lækstrøm tilstrækkelig til at aktivere PC817, hvilket vil medføre en falsk aktivering af tælleren. For at undgå en sådan situation tilføjes der en ekstra lysdiode i rækken mellem optokoblerens LED og indikations-LED'en. Til dette afbrydes jumper J1, og en ekstra LED1 loddes ind.
Modtagerdelen er udført på side 1Lokal autarkisk datainsamlingssystem (fortsat)side 2Lokal autarkisk datainsamlingssystem (fortsat)en prototypingplade, der tilsluttes ARDUINO MEGA 2560. Dette gøres ved hjælp af en dobbelt række stik på kanten. Informationsdisplay-enheden er en skærm med resistiv touch og temperaturføler med en opløsning på 240x400. HX8352B.Lokal autarkisk datainsamlingssystem (fortsat) Desuden er stikket til ICSP på skærmpladen fjernet og mikro-SD-stikket er ikke i brug. Problemet er, at det "oprindelige" SD-stik ikke kan anvendes på grund af konflikt på SPI-bussen. Til flash-kortet blev der anvendt en separat kortlæser med indbygget 3,3V regulator og en bufferchip med tre tilstande på udgange 74LVS125A. Her fik jeg nogle problemer. Bufferen med tre tilstande virkede enten E01-ML01DP5 eller kortlæseren. I kommentarerne til SdFat-biblioteket opdagede jeg en advarsel om inkompatibilitet med andre enheder. Niveauomformer TXS0108E blev fjernet og erstattet med jumperes, da E01-ML01DP5 var tolerant over for 5V-signaler - det hjalp ikke. Med en oscilloskop blev der opdaget signaludfald på MISO-linjen, når kortlæseren blev tilsluttet. Ved nærmere eftersyn blev det konstateret, at indgange til aktiveringssignaler OE på de fire kanaler af 74LVS125A blot var loddet til den fælles ledning, og der kunne slet ikke være tale om nogen tredje tilstand. Bufferchippen blev brugt som en simpel niveauomformer fra 5V til 3,3V ved hjælp af modstande på 3,3 kΩ, der var tilsluttet serielt med signallinjerne, undtagen MISO-linjen. Dens udgangs nederste kontakt trak sandsynligvis signalerne til "jord" niveau. Idet jeg konstaterede, at aktiveringssignalet for linjen MISO er pin 13, blev den afbrudt fra banen oggenloddedeLokal autarkisk datainsamlingssystem (fortsat)mellem output af indgangen (9) 74LVS125A valg af enhed CS og tilpasningsmodstanden. Nu, hvis der ikke er adgang til hukommelseskortet, deaktiveres MISO-bufferen og forstyrrer ikke arbejdet med en anden enhed.Forsøgskort diagramLokal autarkisk datainsamlingssystem (fortsat)Modtager i driftLokal autarkisk datainsamlingssystem (fortsat)For at tilslutte uret til DS3231 anvendes en I2C (TWI) softwarebus.
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 fil;
Fil minFil;
#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);
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 ("UDVIKLERE & BYGGER");
tft.setCursor(30, 20);
tft.print(utf8rus("Konstruktør V.V."));
tft.setCursor(40, 40);
tft.print(utf8rus("Drejer I.I."));
delay(2000);

radio.begin(); // Initialiserer arbejdsgangen for nRF24L01+
radio.setChannel(120); // Angiv kanalen for datamodtagelse (fra 0 til 127)
radio.setDataRate(RF24_250KBPS); // Angiv dataoverførselshastigheden (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Angiv transmitterens effekt (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Åbn 1 rør med identifikatoren 1 transmitter 0xAABBCCDD11 til datamodtagelse
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening(); // Aktivér modtageren, begynder at lytte til åbne rør
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("Initial SD kort");
tft.println("Initial SD kort");
tft.setCursor(8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("initialisering mislykkedes!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Initialisering mislykkedes!");
return;
}
tft.setTextColor(WHITE);
Serial.println("initialisering færdig");
tft.println("Initialisering færdig");
delay(2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor(180, 0); // indstil cursor position
tft.fillRect(178, 0, 65, 7, GRAY); // ryd område for tidsudskrift
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println(utf8rus("Løftestænger I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // hvis logfilen 2.txt er oprettet, vil det fortsætte med at skrive til filen
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // hvis filen 2.txt ikke findes, vil den blive oprettet
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("fejl ved åbning af .txt");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if (time_sec_prev != t.sec) {
tft.setCursor(120, 0); // indstil cursor position
tft.fillRect(118, 0, 50, 7, GRAY); // ryd område for tidsudskrift
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // viser klokkeslætsdata
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if (time_day_prev != t.date) {
tft.setCursor(180, 0); // indstil cursor position
tft.fillRect ( 178, 0, 65, 7, GRAY); // rydde datoens outputområde
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // vise datoens målinger
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 ++; // bare en tæller
//////// С определённой условием периодичностью обновление данных
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); // hvis filen med navnet "2.txt" ikke findes, vil den blive oprettet.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println("SD OK");
Serial.println("SD OK");
delay (900); // forsinkelse, ellers bliver der skrevet 13 ens målinger, indtil sekunder er gået
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Karakter omkodningsprogram/* 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;
} Karakter omkodningsprogram til at vise kyrillisk med Adafruit_GFX biblioteket skal placeres i en mappe med hovedprogrammet. Det er også nødvendigt at erstatte filen glcdfont.c i Adafruit_GFX med en anden skrifttype. Her bibliotek med nødvendig erstatning. Mere information om russificering kan nemt findes på internettet.
For at konkludere vil jeg sige, at systemet har levet op til forventningerne, det er blevet lettere at holde styr på udstyrets drift. Selvom alt er samlet på prototypeplader, er der ingen klager over driften. De første enheder har allerede fungeret i over et halvt år og overlevet vinteren. Den sidste konstruktion til 9 overvågede enheder har været i drift fra den 5. marts, og den registrerer allerede driftstiden officielt.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster