Fortsetzung des lokalen autonomen Datensammlungssystems

Start auf dieser Seite über den Link.
Die benutzerfreundlichste Möglichkeit, Informationen zum Einschalten des Starters zu erfassen, war die Verwendung des Optokopplers PC817. SchaltschemaFortsetzung des lokalen autonomen DatensammlungssystemsDie Platinen enthalten jeweils drei identische Schaltungen, die alle in ABS-Kunststoffgehäusen mit den Maßen 100 x 100 mm untergebracht sind. Foto des OptokopplersFortsetzung des lokalen autonomen Datensammlungssystems Bei der Verbindung zu Starteinrichtungen mit Halbleiterrelais ist ihr Leckstrom ausreichend, um den PC817 zu öffnen, was zu einer Fehlfunktion des Zählers führen kann. Um eine solche Situation zu vermeiden, wird ein weiterer LED in die Reihe des LED des Optokopplers und der Arbeitsanzeige eingefügt. Dazu wird die Brücke J1 geöffnet und eine zusätzliche LED LED1 eingelötet.
Der Empfangsteil ist auf Seite 1Fortsetzung des lokalen autonomen DatensammlungssystemsSeite 2Fortsetzung des lokalen autonomen Datensammlungssystemseiner Steckplatine angeschlossen, die mit dem ARDUINO MEGA 2560 verbunden ist. Hierfür wird ein zweireihiger Anschluss an der Kante verwendet. Als Anzeigegerät kommt ein resistiver Touchscreen mit Temperaturfühler und einer Auflösung von 240 x 400 zum Einsatz. HX8352B.Fortsetzung des lokalen autonomen Datensammlungssystems Der ICSP-Anschluss auf der Bildschirmplatine wurde demontiert, und der Anschluss für die Mikro-SD wird nicht verwendet. Das liegt daran, dass der "originale" SD-Anschluss aufgrund von Konflikten auf dem SPI-Bus nicht genutzt werden kann. Für die Flash-Karte wurde ein separater Kartenleser verwendet, der einen 3,3V Spannungsregler und einen Pufferchip mit drei Ausgangszuständen (74LVS125A) beinhaltet. Hier gab es einige Schwierigkeiten. Der Puffer mit drei Zuständen funktionierte entweder mit E01-ML01DP5 oder dem Kartenleser. In den Kommentaren der SdFat-Bibliothek entdeckte ich eine Warnung vor Inkompatibilität mit anderen Geräten. Der Pegelwandler auf TXS0108E wurde entfernt und durch Brücken ersetzt, da E01-ML01DP5 tolerant gegenüber 5V-Signalen ist – das hat allerdings nicht geholfen. Mit einem Oszilloskop wurde der Verlust des Signals auf der MISO-Leitung beim Anschluss des Kartenlesers festgestellt. Bei genauerer Betrachtung stellte sich heraus, dass die Signal-Pin-Enable-Eingänge (OE) der vier Kanäle des 74LVS125A einfach mit dem gemeinsamen Draht verlötet waren, sodass es kein drittes Zustandsszenario geben konnte. Der Pufferchip wurde als einfacher Pegelwandler von 5V auf 3,3V mit Hilfe von 3,3 kOhm Widerständen verwendet, die in Reihe mit den Signalleitungen geschaltet waren. Ausgenommen war die MISO-Leitung, deren Ausgangsschalter wahrscheinlich die Signale auf das Niveau "Erde" zog. Nachdem ich ermittelt hatte, dass das Erlauben-Signal der MISO-Leitung der Pin 13 ist, wurde dieser von der Spur abgetrennt undangeschlossenFortsetzung des lokalen autonomen Datensammlungssystemszwischen dem Ausgang (9) 74LVS125A der Geräteeinstellung CS und dem Anpassungswiderstand. Wenn jetzt kein Zugriff auf die Speicherkarte erfolgt, wird der MISO-Puffer deaktiviert und stört nicht den Betrieb eines anderen Geräts.Schaltplan der PlatineFortsetzung des lokalen autonomen DatensammlungssystemsEmpfänger in BetriebFortsetzung des lokalen autonomen DatensammlungssystemsFür die Verbindung der Uhr DS3231 wird der I2C (TWI) Software-Bus verwendet.
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: 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 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);
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 ("ENTWICKLER & BAUEN");
tft.setCursor (30, 20);
tft.print (utf8rus("Konstructor V.V.");
tft.setCursor (40, 40);
tft.print (utf8rus("Dreher I.I.");
delay (2000);

radio.begin(); \/\/ Initiierung der nRF24L01+ Kommunikation
radio.setChannel(120); // Kanal für den Empfang von Daten festlegen (von 0 bis 127)
radio.setDataRate (RF24_250KBPS); // Legen Sie die Datenübertragungsrate fest (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1 Mbit/s
radio.setPALevel (RF24_PA_MAX); // Legen Sie die Sendeleistung fest (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Öffnen Sie das Rohr mit der ID 1 für den Empfänger 0xAABBCCDD11, um Daten zu empfangen
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Aktivieren Sie den Empfänger, um die geöffneten Rohre anzuhören
// 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, ROT);
tft.setTextColor(SCHWARZ);
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 ); // Setzen Sie die Cursorposition
tft.fillRect ( 178, 0, 65, 7, GRAU); // Bereinigung des Zeitbereichs
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus(„Läufer I“));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // Wenn die Logdatei 2.txt erstellt wurde, wird sie weitergeschrieben
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 der .txt“);
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if ( time_sec_prev != t.sec) {
tft.setCursor ( 120, 0 ); // Cursorposition einstellen
tft.fillRect ( 118, 0, 50, 7, GRAY); // Bereich für Zeitinhalt löschen
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // Ausgabe der Uhrenanzeigen
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // Setzen Sie die Cursorposition
tft.fillRect ( 178, 0, 65, 7, GRAY); // Bereich für Datenausgabe löschen
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // Datenausgabe
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 ++; // einfacher Zähler
//////// С определённой условием периодичностью обновление данных
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(SCHWARZ);
////////Создание строки в формате .csv
String dataString = String (rtc.getDateStr()) + ", " + (rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Запись в файл и вывод результатов процесса записи
myFile = SD.open(perv, FILE_WRITE); // Wenn die Datei "2.txt" nicht existiert, wird sie erstellt.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println("SD OK");
Serial.println("SD OK");
delay (900); // Verzögerung, um zu verhindern, dass 13 identische Werte geschrieben werden, bis die Sekunde vergeht
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Zeichenkonvertierungsprogramm/* 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 Programm zur Neukodierung von Zeichen für die Ausgabe von Kyrillisch mit der Adafruit_GFX-Bibliothek wird in einen Ordner mit dem Hauptprogramm gelegt. Außerdem muss in Adafruit_GFX die Datei glcdfont.c durch eine andere Schriftart ersetzt werden. Hier Die Bibliothek mit der erforderlichen Ersetzung. Weitere Informationen zur Lokalisierung sind leicht im Internet zu finden.
Zusammenfassend kann ich sagen, dass das System die Erwartungen erfüllt hat, es ist einfacher geworden, die Nutzung der Geräte zu überwachen. Obwohl alles auf Prototypplatinen montiert ist, gibt es keine Beanstandungen in der Arbeit. Die ersten Komponenten laufen schon über ein halbes Jahr und haben den Winter überstanden. Die letzte Konstruktion funktioniert seit dem 5. März mit 9 überwachten Aggregaten, und die Nutzung wird bereits offiziell registriert.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster