Lokales autonomes Datenerfassungssystem (Fortsetzung)

Beginnen Sie auf dieser Website Link.
Als bequemste Möglichkeit zum Abrufen von Informationen zum Einschalten des Anlassers erwies sich die Option mit dem Optokoppler PC817. Schematische DarstellungLokales autonomes Datenerfassungssystem (Fortsetzung)Die Platinen enthalten drei identische Schaltkreise, alles ist in ABS-Kunststoffboxen der Größe 100x100 mm untergebracht. Foto von OptokopplernLokales autonomes Datenerfassungssystem (Fortsetzung) Bei Anschluss an Startgeräte mit Halbleiterventilen reicht deren Leckstrom aus, um den PC817 zu öffnen und der Zähler führt zu einer Fehlauslösung. Um eine solche Situation auszuschließen Eine weitere wird in Reihe zum Schaltkreis der Optokoppler-LED und der Betriebsanzeige-LED hinzugefügt. Dazu wird der Jumper J1 geöffnet und eine zusätzliche LED LED1 eingelötet.
Der Empfangsteil besteht aus Seite 1Lokales autonomes Datenerfassungssystem (Fortsetzung)Seite 2Lokales autonomes Datenerfassungssystem (Fortsetzung)Entwicklungsplatine verbunden mit ARDUINO MEGA 2560. Hierzu wird am Ende ein zweireihiger Stecker verwendet. Als Informationsanzeigegerät kommt ein Bildschirm mit einer Auflösung von 240x400, einem resistiven Touchscreen und einem Temperatursensor zum Einsatz. HX8352B.Lokales autonomes Datenerfassungssystem (Fortsetzung) Darüber hinaus wird der Stecker zum ICSP auf der Bildschirmplatine entfernt und der Micro-SD-Slot nicht genutzt. Fakt ist, dass der „native“ SD-Sockel aufgrund eines Konflikts am SPI-Bus nicht genutzt werden kann. Für die Flash-Karte wurde ein separater Kartenleser verwendet, der einen 3,3-V-Stabilisator und einen Pufferchip mit drei Ausgangszuständen 74LVS125A enthielt. Hier wartete der Rechen auf mich. Ein Puffer mit drei Zuständen, aber entweder der E01-ML01DP5 oder der Kartenleser funktionierten. In den Bibliothekskommentaren sah SdFat eine Warnung bezüglich der Inkompatibilität mit anderen Geräten. Der Pegelwandler beim TXS0108E wurde entfernt und durch Jumper ersetzt, weil E01-ML01DP5 ist tolerant gegenüber 5-V-Signalen – es hat nicht geholfen. Mithilfe eines Oszilloskops wurde ein Signalverlust auf der MISO-Leitung festgestellt, als ein Kartenleser angeschlossen war. Bei sorgfältiger Prüfung stellte sich heraus, dass die Eingänge der Freigabesignale der OE 4-Kanäle des 74LVS125A einfach auf einen gemeinsamen Draht gelötet waren und von einem dritten Zustand keine Rede sein konnte. Der Pufferchip wurde als primitiver Pegelwandler von 5 V auf 3.3 V verwendet, wobei 3,3-kΩ-Widerstände in Reihe mit den Signalleitungen geschaltet wurden. Mit Ausnahme der MISO-Linie. Sein unterer Ausgangsschalter leitete wahrscheinlich Signale zur Bodenebene. Nachdem festgestellt wurde, dass das Freigabesignal der MISO-Leitung Pin 13 war, wurde es von der Schiene abgerissen undgelötetLokales autonomes Datenerfassungssystem (Fortsetzung)zwischen dem Geräteauswahl-Eingangspin (9) des 74LVS125A CS und dem Abschlusswiderstand. Wenn nun kein Zugriff auf die Speicherkarte besteht, ist der MISO-Puffer deaktiviert und beeinträchtigt nicht den Betrieb eines anderen Geräts.Diagramm der EntwicklungsplatineLokales autonomes Datenerfassungssystem (Fortsetzung)Empfänger in BetriebLokales autonomes Datenerfassungssystem (Fortsetzung)Der DS3231 verwendet einen Software-I2C-Bus (TWI), um die Uhr anzuschließen.
Arduino IDE-Programm// WICHTIG: Die Adafruit_TFTLCD-BIBLIOTHEK MUSS SPEZIFISCH SEIN
// ENTWEDER FÜR DAS TFT SHIELD ODER DAS BreakOUT BOARD KONFIGURIERT.
// SIEHE RELEVANTE KOMMENTARE IN Adafruit_TFTLCD.h ZUM SETUP.
//von Open-Smart Team und Catalex Team
//[E-Mail geschützt]
//Speichern: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo-Funktion: Grafiken und Zeichen anzeigen
//Arduino-IDE: 1.6.5
// Platine: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Platine:OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2-Zoll-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

#enthalten // Kerngrafikbibliothek
//#enthalten // Hardwarespezifische Bibliothek
#enthalten
MCUFRIEND_kbv tft;
#include "SdFat.h" // SdFat-Bibliothek verwenden
SdFat SD;
SdFile-Datei;
MyFile-Datei;
#define SD_CS_PIN SS

#enthalten // Verbinden Sie die Bibliothek, um mit dem SPI-Bus zu arbeiten
#enthalten // Verbinden Sie die Einstellungsdatei aus der RF24-Bibliothek
#enthalten // Verbinden Sie die Bibliothek, um mit nRF24L24+ zu arbeiten
RF24-Funk (47, 49);

#enthalten

DS3231 rtc(27, 25);
Zeit t;

uint16_t r = 6000;
uint32_t k = 0;

flüchtige, vorzeichenlose lange Daten;
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;

//************************************************** ****************/ /
// Wenn Sie OPEN-SMART TFT-Breakout-Board verwenden //
// Wir empfehlen Ihnen, eine 5V-3.3V-Pegelumwandlungsschaltung hinzuzufügen.
// Natürlich können Sie die OPEN-SMART UNO Black-Version mit 5V/3.3V-Netzschalter verwenden,
// Sie müssen nur auf 3.3 V umschalten.
// Die Steuerpins für das LCD können jedem digitalen oder zugewiesen werden
// Analoge Pins...aber wir werden die analogen Pins verwenden, soweit es uns möglich ist
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Schwarz
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - RESET
// LED - Masse
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Weisen Sie einigen gängigen 16-Bit-Farbwerten für Menschen lesbare Namen zu:
#define SCHWARZ 0x0000
#define BLAU 0x001F
#define RED 0xF800
#define GRÜN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define GELB 0xFFE0
#define WHITE 0xFFFF
#define GRAU 0x8C51
#define GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Bei Verwendung des Shields sind alle Steuer- und Datenleitungen fixiert, und
// optional kann eine einfachere Deklaration verwendet werden:
// 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();

// Um ​​die Zeit festzulegen, entkommentieren Sie die erforderlichen Zeilen
// rtc.setDOW(6); // Wochentag
// rtc.setTime(22, 04, 0); // Zeit, im 24-Stunden-Format.
// rtc.setDate(4, 5, 2019); // Datum, 29. Oktober 2018

Serial.begin (2000000);
//////// Bildschirminitialisierung
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(true);
//////////////////Ausgabe von Namen, Gerätezubehör, Organisationsnamen
tft.fillScreen(SCHWARZ);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("ENTWICKLER & BAUEN");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
Verzögerung (2000);

radio.begin(); // Arbeit einleiten nRF24L01+
radio.setChannel(120); // Geben Sie den Datenempfangskanal an (von 0 bis 127)
radio.setDataRate(RF24_250KBPS); // Geben Sie die Datenübertragungsrate an (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Geben Sie die Sendeleistung an (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Öffnen Sie 1 Pipe mit der Kennung von 1 Sender 0xAABBCCDD11, um Daten zu empfangen
// Öffnen Sie Pipe 2 mit der Sender-ID 2xAABBCCDD0, um Daten zu empfangen
radio.startListening(); // Schalten Sie den Empfänger ein und beginnen Sie, offene Pfeifen zu hören
// radio.stopListening();
////////Ausgabe von Serviceinformationen
tft.fillScreen(SCHWARZ);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Starten Sie die Initialisierung der SD-Karte
Serial.println("Erste SD-Karte");
tft.println("Erste SD-Karte");
tft.setCursor(8, 10);
////////Initialisierung der Karte
if (!SD.begin(SD_CS_PIN)) {
Serial.println("initial failed!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(SCHWARZ);
tft.println("Initial fehlgeschlagen!");
zurück;
}
tft.setTextColor(WHITE);
Serial.println("Initialisierung abgeschlossen");
tft.println("Initialisierung abgeschlossen");
Verzögerung (2000);
////////Zeit und Datum lesen und Variablen zuweisen
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
//////// Geben Sie das Datum zwangsweise aus, um nicht darauf warten zu müssen, dass sich das Datum für die Anzeige ändert
tft.setCursor(180, 0); // Setzen der Cursorposition
tft.fillRect(178, 0, 65, 7, GRAY); // Löschen des Zeitausgabebereichs
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Geben Sie den Namen von Kontrollobjekten aus
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
////////Erstellen einer Protokolldatei und Ausgabe des Ergebnisses des Erstellungsversuchs
tft.setTextSize(1);
tft.setCursor(130, 10); // Wenn die Protokolldatei 2.txt erstellt wird, wird das Schreiben 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 existiert, wird sie erstellt
meineDatei.close ();
tft.println(perv);
Serial.println(perv);
}
}

void loop (void) {
////////Prüfung, ob eine Anfrage zur Ausgabe eines Protokolls an den COM-Port-Monitor vorliegt
if (Serial.verfügbar() > 0) {
if (1 == Serial.read());
////////Und wenn „1“ akzeptiert wird, dann die Ausgabe
Datei myFile = SD.open(perv);
// wenn die Datei verfügbar ist, schreibe hinein:
if (meineDatei) {
while (myFile.available()) {
Serial.write(myFile.read());
}
meineDatei.close ();
}
else {
Serial.println("Fehler beim Öffnen von .txt");
}
}
////////Lesezeit
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Wenn sich die Zeit geändert hat, werden die neuen Uhrwerte angezeigt
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // Setzen der Cursorposition
tft.fillRect(118, 0, 50, 7, GRAY); // Löschen des Zeitausgabebereichs
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // Uhrwerte ausgeben
time_sec_prev = t.sec;
}
////////Wenn sich das Datum geändert hat, wird das neue Datum angezeigt
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // Setzen der Cursorposition
tft.fillRect(178, 0, 65, 7, GRAY); // Datumsanzeigebereich löschen
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // Datumswerte anzeigen
time_day_prev = t.date;
}
////////Wenn Radioempfang verfügbar ist, dann
if (radio.available(&pipe)) {
////////Prüfung, ob der Empfangspuffer voll ist,
radio.read(&data, sizeof(data));
////////Wenn die erforderliche Senderadresse verfügbar ist, dann
if (pipe == 1) {
////////wir warten auf die Bestimmung der synchronisierenden Nullenfolge
//Anfang des Datenblocks
if (Daten == 0000) {
rc = 0;
} Else {
rc++;
}
////////Zählerwerte aufzeichnen und in Zehntel- und Hundertstelstunden berechnen
if (rc == 1) {
leb_1 = Daten / 3600.0;
}

if (rc == 2) {
leb_2 = Daten / 3600.0;
}

if (rc == 3) {
leb_3 = Daten / 3600.0;
}

if (rc == 4) {
leb_4 = Daten / 3600.0;
}
}
}
r++;
k++; // nur ein Zähler
//////// Datenaktualisierung mit einer bestimmten Periodizität
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;
}
////////Alle 10 Minuten Daten in das Protokoll auf SD schreiben.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(SCHWARZ);
////////Erstellen einer Zeichenfolge im CSV-Format
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////In eine Datei schreiben und die Ergebnisse des Schreibvorgangs ausgeben
myFile = SD.open(perv, FILE_WRITE); // Wenn keine Datei mit dem Namen „2.txt“ vorhanden ist, wird sie erstellt.
if (meineDatei) {
myFile.println(dataString);
meineDatei.close ();
tft.fillRect(198, 8, 42, 10, GRÜN);
tft.println("SD OK");
Serial.println("SD OK");
Verzögerung (900); // Verzögerung, andernfalls werden 13 identische Messwerte aufgezeichnet, bis eine Sekunde vergangen ist
} Else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Zeichenkonvertierungsprogramm/* Russische Schriftarten von UTF-8 in Windows-1251 umkodieren */

String utf8rus(String-Quelle)
{
int i,k;
String-Ziel;
unsigned char n;
char m[2] = { '0', ' ' };

k = source.length(); ich = 0;

while (i < k) {
n = Quelle[i]; i++;

if (n >= 0xC0) {
Schalter (n) {
Fall 0xD0: {
n = Quelle[i]; i++;
if (n == 0x81) { n = 0xA8; brechen; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
Fall 0xD1: {
n = Quelle[i]; i++;
if (n == 0x91) { n = 0xB8; brechen; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; Ziel = Ziel + String(m);
}
Rückkehrziel;
}Das Zeichentranskodierungsprogramm für die kyrillische Ausgabe mithilfe der Adafruit_GFX-Bibliothek wird im selben Ordner wie das Hauptprogramm abgelegt. Sie müssen außerdem die Datei glcdfont.c in Adafruit_GFX durch eine andere Schriftart ersetzen. Hier Bibliothek mit dem erforderlichen Ersatz. Weitere Informationen zur Russifizierung finden Sie leicht im Internet.
Zusammenfassend kann ich sagen, dass das System die Erwartungen erfüllt hat und es einfacher geworden ist, die Betriebszeit der Geräte zu überwachen. Obwohl alles auf Steckbrettern zusammengebaut ist, gibt es an der Arbeit keine unmittelbaren Beanstandungen. Die ersten Elemente arbeiten seit mehr als sechs Monaten und haben den Winter überstanden. Neuestes Design Es ist seit dem 9. März für 5 gesteuerte Einheiten in Betrieb und die Betriebszeit wird damit offiziell erfasst.

Source: habr.com

Kommentar hinzufügen