Lokales autonomes Datenerfassungssystem (Fortsetzung)

Beginn auf dieser Seite unter diesem Link.
Die bequemste Variante zur Informationsentnahme über das Einschalten des Starters stellte sich als die Variante mit der Optokopplerschaltung PC817 heraus. SchaltplanLokales autonomes Datenerfassungssystem (Fortsetzung)Die Platinen enthalten jeweils drei identische Schaltungen, alles untergebracht in Gehäusen aus ABS-Kunststoff, Größe 100x100 mm. Foto des OptokopplersLokales autonomes Datenerfassungssystem (Fortsetzung) Beim Anschluss an die Startgeräte mit Halbleiterrelais ist der Leckstrom ausreichend, um den PC817 zu aktivieren, was zu einem Fehlalarm des Zählers führen kann. Um eine solche Situation auszuschließen wird nacheinander eine weitere Diode in den Schaltkreis des Optokopplers und der Arbeitsanzeigendiode eingefügt. Dazu wird der Jumper J1 geöffnet und eine zusätzliche Diode LED1 eingelötet.
Der Empfangsteil ist auf Seite 1Lokales autonomes Datenerfassungssystem (Fortsetzung)Seite 2Lokales autonomes Datenerfassungssystem (Fortsetzung)einer Steckplatine, die an die ARDUINO MEGA 2560 angeschlossen wird. Dafür wird ein zweireihiger Stecker am Ende verwendet. Als Anzeigeeinheit kommt ein resistiver Touchscreen mit Temperatursensor und einer Auflösung von 240x400 zum Einsatz. HX8352B.Lokales autonomes Datenerfassungssystem (Fortsetzung) Der Stecker für ICSP auf der Bildschirmplatine wurde demontiert und das Steckplatz für die micro-SD wird nicht verwendet. Der Grund ist, dass der "native" SD-Steckplatz aufgrund eines Konflikts auf dem SPI-Bus nicht verwendet werden kann. Für die SD-Karte wurde ein separater Kartenleser verwendet, der einen 3,3V Spannungsregler und einen Pufferspeicher mit drei Ausgangszuständen 74LVS125A enthält. Hier gab es Schwierigkeiten. Der Puffer mit drei Zuständen konnte entweder E01-ML01DP5 oder den Kartenleser betreiben. In den Kommentaren der Bibliothek SdFat fiel mir eine Warnung über die Inkompatibilität mit anderen Geräten auf. Der Pegelwandler auf TXS0108E wurde entfernt und durch Brücken ersetzt, da E01-ML01DP5 tolerant gegenüber 5V-Signalen ist – das hat nicht geholfen. Mit einem Oszilloskop wurde festgestellt, dass das Signal auf der MISO-Leitung beim Anschluss des Kartenlesers verschwand. Bei genauerem Hinsehen stellte sich heraus, dass die Eingänge von den Aktivierungssignalen OE der vier Kanäle 74LVS125A einfach mit der gemeinsamen Leitung verbunden waren und es keinen dritten Zustand gab. Der Pufferspeicher wurde als einfacher Pegelwandler von 5V auf 3,3V mit Hilfe von 3,3 kOhm Widerständen, die in Reihe mit den Signalleitungen geschaltet waren, verwendet. Außer bei der MISO-Leitung. Ihr Ausgangstransistor zog wahrscheinlich das Signal auf das Niveau „Masse“. Nachdem festgestellt wurde, dass das Aktivierungssignal der MISO-Leitung der Anschluss 13 ist, wurde es von der Leiterbahn abgetrennt undein gelötet.Lokales autonomes Datenerfassungssystem (Fortsetzung)zwischen dem Ausgang des Eingangs (9) 74LVS125A Gerätes CS und dem Anpassungswiderstand. Jetzt, wenn es keinen Zugriff auf die Speicherkarte gibt, wird der MISO-Puffer deaktiviert und stört nicht den Betrieb eines anderen Geräts.Schaltplan des PrototypenLokales autonomes Datenerfassungssystem (Fortsetzung)Empfänger in BetriebLokales autonomes Datenerfassungssystem (Fortsetzung)Für den Anschluss der Uhr an den DS3231 wird der Software-Bus I2C (TWI) verwendet.
Arduino IDE-Programm// 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-modul-Touch-Screen-Shield-Board-onboard-Temperatursensor-mit-Touch-Stift/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-kompatibel-UNO-R3-CH340G-ATMEGA328P-Entwicklungsboard-mit-USB-Kabel-für/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 datei;
Datei 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);
Zeit 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("ENTWICKLER & BUILD");
tft.setCursor(30, 20);
tft.print(utf8rus("Konstruktor V.V."));
tft.setCursor(40, 40);
tft.print(utf8rus("Dreher I.I."));
delay(2000);

radio.begin(); // Initialisieren des nRF24L01+
radio.setChannel(120); // Kanal für den Datenempfang (von 0 bis 127) festlegen
radio.setDataRate(RF24_250KBPS); // Datenübertragungsrate festlegen (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Sendeleistungsniveau festlegen (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Öffnen des ersten Pipelines mit der Kennung 1 für den Sender 0xAABBCCDD11 zum Empfang von Daten
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening(); // Empfänger aktivieren, um offene Pipelines zu überwachen
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("Initiale SD-Karte");
tft.println("Initiale SD-Karte");
tft.setCursor(8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("Initialisierung fehlgeschlagen!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Initialisierung fehlgeschlagen!");
return;
}
tft.setTextColor(WHITE);
Serial.println("Initialisierung abgeschlossen");
tft.println("Initialisierung abgeschlossen");
delay(2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor(180, 0); // Cursorposition festlegen
tft.fillRect(178, 0, 65, 7, GRAY); // Bildschirm für die Uhrzeit aufräumen
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println(utf8rus("Winden I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // Wenn die Protokolldatei 2.txt erstellt wird, wird die Aufzeichnung in die Datei fortgesetzt
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // Wenn die Datei 2.txt nicht vorhanden ist, wird sie erstellt
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("Fehler beim Öffnen von .txt");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if (time_sec_prev != t.sec) {
tft.setCursor(120, 0); // Cursorposition festlegen
tft.fillRect ( 118, 0, 50, 7, GRAU); // Clear the time display area
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // Output clock readings
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // Cursorposition festlegen
tft.fillRect ( 178, 0, 65, 7, GRAU); // Clear the date display area
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // Output date readings
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 ++; // Just a counter
//////// С определённой условием периодичностью обновление данных
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect ( 0, 41, 180, 64, GRAUD);
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); // If there is no file named «2.txt», it will be created.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GRÜN);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); // Delay, otherwise it records 13 identical readings until a second has passed
} else {
tft.fillRect ( 198, 8, 42, 10, ROT);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Zeichenkodierungsprogramm/* 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;
} Das Zeichenkodierungsprogramm für die Ausgabe von Kyrillisch mit der Adafruit_GFX-Bibliothek wird in denselben Ordner wie das Hauptprogramm gelegt. Außerdem muss die glcdfont.c-Datei in Adafruit_GFX durch eine andere Schriftart ersetzt werden. Hier Bibliothek mit erforderlichem Wechsel. Weitere Informationen zur Russifizierung sind leicht im Internet zu finden.
Zusammenfassend kann ich sagen, dass das System die Erwartungen erfüllt hat, es wurde einfacher, die Betriebsstunden der Geräte zu verfolgen. Auch wenn alles auf Steckplatinen montiert ist, gibt es derzeit keine Beschwerden über die Funktionalität. Die ersten Elemente arbeiten bereits seit mehr als einem halben Jahr und haben den Winter überstanden. Die letzte Konstruktion für 9 überwachte Aggregate arbeitet seit dem 5. März und die Zeitregistrierung für die Betriebsstunden läuft bereits offiziell.

Quelle: habr.com

60GB SSD 8Gb DDR4