Τοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια)

Ξεκινήστε σε αυτόν τον ιστότοπο по ссылке.
Η πιο βολική επιλογή για την ανάκτηση πληροφοριών σχετικά με την ενεργοποίηση της μίζας αποδείχθηκε ότι ήταν η επιλογή με τον οπτικό συζευκτήρα PC817. διάγραμμα κυκλώματοςΤοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια)Οι πλακέτες περιέχουν τρία πανομοιότυπα κυκλώματα, όλα τοποθετούνται σε πλαστικά κουτιά ABS, μεγέθους 100x100 mm. Φωτογραφία οπτικών συζευκτώνΤοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια) Όταν συνδέονται σε συσκευές εκκίνησης με βαλβίδες ημιαγωγών, το ρεύμα διαρροής τους είναι αρκετό για να ανοίξει το PC817 και ο μετρητής θα ενεργοποιηθεί εσφαλμένα. Για να αποκλειστεί μια τέτοια κατάσταση Ένα ακόμη προστίθεται σε σειρά στο κύκλωμα του LED του οπτικού συζεύκτη και του LED ένδειξης λειτουργίας. Για να γίνει αυτό, ο βραχυκυκλωτήρας J1 ανοίγει και ένα επιπλέον LED LED1 είναι κολλημένο.
Το τμήμα λήψης κατασκευάζεται επάνω πλευρά 1Τοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια)πλευρά 2Τοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια)πλακέτα ανάπτυξης συνδεδεμένη στο ARDUINO MEGA 2560. Για αυτό, χρησιμοποιείται ένας σύνδεσμος διπλής σειράς στο τέλος. Ως συσκευή προβολής πληροφοριών χρησιμοποιείται μια οθόνη με ανάλυση 240x400, με οθόνη αφής αντίστασης και αισθητήρα θερμοκρασίας. HX8352B.Τοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια) Επιπλέον, η υποδοχή στο ICSP στην πλακέτα οθόνης αφαιρείται και η υποδοχή micro SD δεν χρησιμοποιείται. Το γεγονός είναι ότι η "εγγενής" υποδοχή SD δεν μπορεί να χρησιμοποιηθεί λόγω διένεξης στο δίαυλο SPI. Για την κάρτα flash, χρησιμοποιήθηκε ξεχωριστός αναγνώστης καρτών, ο οποίος περιελάμβανε σταθεροποιητή 3,3 V και buffer chip με τρεις καταστάσεις εξόδου 74LVS125A. Εδώ με περίμενε η τσουγκράνα. Ένα buffer τριών καταστάσεων, αλλά λειτούργησε είτε το E01-ML01DP5 είτε το πρόγραμμα ανάγνωσης καρτών. Στα σχόλια της βιβλιοθήκης, το SdFat είδε μια προειδοποίηση για ασυμβατότητα με άλλες συσκευές. Ο μετατροπέας στάθμης στο TXS0108E αφαιρέθηκε και αντικαταστάθηκε με βραχυκυκλωτήρες, επειδή Το E01-ML01DP5 είναι ανεκτικό σε σήματα 5V - δεν βοήθησε. Χρησιμοποιώντας έναν παλμογράφο, ανιχνεύθηκε απώλεια σήματος στη γραμμή MISO όταν συνδέθηκε μια συσκευή ανάγνωσης καρτών. Μετά από προσεκτική εξέταση, διαπιστώθηκε ότι οι είσοδοι των σημάτων ενεργοποίησης των καναλιών OE 4 του 74LVS125A ήταν απλά κολλημένες σε ένα κοινό καλώδιο και δεν μπορούσε να γίνει λόγος για τρίτη κατάσταση. Το buffer chip χρησιμοποιήθηκε ως πρωτόγονος μετατροπέας στάθμης από 5V σε 3.3V χρησιμοποιώντας αντιστάσεις 3,3 KΩ συνδεδεμένες σε σειρά με τις γραμμές σήματος. Εκτός από τη γραμμή MISO. Ο κάτω διακόπτης εξόδου του πιθανότατα προσέλκυε σήματα στο επίπεδο του εδάφους. Αφού διαπιστώθηκε ότι το σήμα ενεργοποίησης της γραμμής MISO ήταν ο ακροδέκτης 13, αποκόπηκε από την πίστα καισυγκολλημένοιΤοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια)μεταξύ της συσκευής 9LVS74A CS επιλέξτε τον ακροδέκτη εισόδου (125) και την αντίσταση τερματισμού. Τώρα, εάν δεν υπάρχει πρόσβαση στην κάρτα μνήμης, η προσωρινή μνήμη MISO είναι απενεργοποιημένη και δεν παρεμβαίνει στη λειτουργία άλλης συσκευής.Διάγραμμα πίνακα ανάπτυξηςΤοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια)Δέκτης σε λειτουργίαΤοπικό αυτόνομο σύστημα απόκτησης δεδομένων (συνέχεια)Το DS3231 χρησιμοποιεί έναν δίαυλο λογισμικού I2C (TWI) για τη σύνδεση του ρολογιού.
Πρόγραμμα Arduino IDE// ΣΗΜΑΝΤΙΚΟ: Η ΒΙΒΛΙΟΘΗΚΗ Adafruit_TFTLCD ΠΡΕΠΕΙ ΝΑ ΕΙΝΑΙ ΕΙΔΙΚΑ
// ΔΙΑΜΟΡΦΩΣΗ ΕΙΤΕ ΓΙΑ ΤΗΝ ΑΣΠΙΔΑ TFT ΕΙΤΕ ΓΙΑ ΤΗΝ ΠΙΝΑΚΑ ΑΠΟΚΛΕΙΣΜΑΤΟΣ.
// ΔΕΙΤΕ ΣΧΕΤΙΚΑ ΣΧΟΛΙΑ ΣΤΟ Adafruit_TFTLCD.h ΓΙΑ ΡΥΘΜΙΣΗ.
//από Open-Smart Team και Catalex Team
//[προστασία μέσω email]
//Κατάστημα: dx.com
// open-smart.aliexpress.com/store/1199788
//Λειτουργία επίδειξης: Εμφάνιση γραφικών, χαρακτήρων
//Arduino IDE: 1.6.5
// Πίνακας: Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Πλακέτα:OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2 ΙΝΤΣΕΣ 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

#περιλαμβάνω // Βιβλιοθήκη βασικών γραφικών
//#περιλαμβάνω // Βιβλιοθήκη ειδικά για υλικό
#περιλαμβάνω
MCUFRIEND_kbv tft;
#include "SdFat.h" // Χρησιμοποιήστε τη βιβλιοθήκη SdFat
SdFat SD;
Αρχείο SdFile.
Αρχείο myFile;
#define SD_CS_PIN SS

#περιλαμβάνω // Συνδέστε τη βιβλιοθήκη για να εργαστεί με το δίαυλο SPI
#περιλαμβάνω // Συνδέστε το αρχείο ρυθμίσεων από τη βιβλιοθήκη RF24
#περιλαμβάνω // Συνδέστε τη βιβλιοθήκη για να λειτουργήσει με το nRF24L24+
Ραδιόφωνο RF24 (47, 49);

#περιλαμβάνω

DS3231 rtc(27, 25);
Χρόνος t;

uint16_t r = 6000;
uint32_t k = 0;

πτητικά ανυπόγραφα μακρά δεδομένα.
float leb_1;
float leb_2;
float leb_3;
float leb_4;

σωλήνας uint8_t;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//**************************************************** ****************/ /
// Εάν χρησιμοποιείτε πλακέτα OPEN-SMART TFT //
// Σας προτείνουμε να προσθέσετε κύκλωμα μετατροπής στάθμης 5V-3.3V.
// Φυσικά μπορείτε να χρησιμοποιήσετε την έκδοση OPEN-SMART UNO Black με διακόπτη τροφοδοσίας 5V/3.3V,
// χρειάζεστε απλώς διακόπτη στα 3.3V.
// Οι ακίδες ελέγχου για την οθόνη LCD μπορούν να αντιστοιχιστούν σε οποιοδήποτε ψηφιακό ή
// αναλογικές ακίδες...αλλά θα χρησιμοποιήσουμε τις αναλογικές ακίδες όπως αυτό μας επιτρέπει
//——————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Μαύρο
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - ΕΠΑΝΑΦΟΡΑ
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Εκχωρήστε ονόματα αναγνώσιμα από τον άνθρωπο σε ορισμένες κοινές τιμές χρωμάτων 16-bit:
#define BLACK 0x0000
#define ΜΠΛΕ 0x001F
#define RED 0xF800
#define ΠΡΑΣΙΝΟ 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define ΚΙΤΡΙΝΟ 0xFFE0
#define WHITE 0xFFFF
#define GRAY 0x8C51
#define ΓΚΡΙ 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Εάν χρησιμοποιείτε την ασπίδα, όλες οι γραμμές ελέγχου και δεδομένων είναι σταθερές και
// Μια απλούστερη δήλωση μπορεί προαιρετικά να χρησιμοποιηθεί:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

String dataString;
//String numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//String *numfileMonth="1.txt" (sizeof (numfileMonth));
//////////////////////////////////////////////// /////////////////

ρύθμιση κενού(κενό) {

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(ΜΑΥΡΟ);
tft.setTextColor(ΛΕΥΚΟ);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("DEVELOPERS & BUILD");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
καθυστέρηση (2000)

radio.begin(); // Έναρξη εργασίας nRF24L01+
radio.setChannel(120); // Καθορίστε το κανάλι λήψης δεδομένων (από 0 έως 127)
radio.setDataRate(RF24_250KBPS); // Καθορίστε τον ρυθμό μεταφοράς δεδομένων (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Καθορίστε την ισχύ του πομπού (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Ανοίξτε 1 σωλήνα με το αναγνωριστικό 1 πομπού 0xAABBCCDD11, για λήψη δεδομένων
// Ανοίξτε το σωλήνα 2 με αναγνωριστικό πομπού 2xAABBCCDD0 για λήψη δεδομένων
radio.startListening(); // Ενεργοποιήστε τον δέκτη, αρχίστε να ακούτε ανοιχτούς σωλήνες
// radio.stopListening();
////////Έξοδος πληροφοριών υπηρεσίας
tft.fillScreen(ΜΑΥΡΟ);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Ξεκινήστε την προετοιμασία της κάρτας SD
Serial.println("Αρχική κάρτα SD");
tft.println("Αρχική κάρτα SD");
tft.setCursor(8, 10);
////////Εκκίνηση της κάρτας
if (!SD.begin(SD_CS_PIN)) {
Serial.println("η αρχική απέτυχε!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(ΜΑΥΡΟ);
tft.println("Αποτυχία αρχικής!");
επιστροφή?
}
tft.setTextColor(ΛΕΥΚΟ);
Serial.println("ολοκληρώθηκε η προετοιμασία");
tft.println("Η προετοιμασία έγινε");
καθυστέρηση (2000)
////////Ανάγνωση ώρας και ημερομηνίας και ανάθεσή τους σε μεταβλητές
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Εξάγετε αναγκαστικά την ημερομηνία για να μην περιμένετε να αλλάξει η ημερομηνία για εμφάνιση
tft.setCursor(180, 0); // ρύθμιση της θέσης του δρομέα
tft.fillRect(178, 0, 65, 7, GRAY); // εκκαθάριση της περιοχής εξόδου χρόνου
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Εξαγωγή του ονόματος των αντικειμένων ελέγχου
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Winches I"));
////////Δημιουργία αρχείου καταγραφής και έξοδος του αποτελέσματος της προσπάθειας δημιουργίας
tft.setTextSize(1);
tft.setCursor(130, 10); // εάν δημιουργηθεί το αρχείο καταγραφής 2.txt, τότε η εγγραφή στο αρχείο θα συνεχιστεί
αν (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
myFile = SD.open(perv, FILE_WRITE); // εάν το αρχείο 2.txt δεν υπάρχει, θα δημιουργηθεί
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

void loop(void) {
////////Έλεγχος ύπαρξης αιτήματος για έξοδο καταγραφής στην οθόνη θύρας COM
if (Serial.available() > 0) {
if (1 == Serial.read());
////////Και αν γίνει αποδεκτό το "1", τότε η έξοδος
Αρχείο myFile = SD.open(perv);
// εάν το αρχείο είναι διαθέσιμο, γράψτε σε αυτό:
αν (myFile) {
ενώ (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("σφάλμα ανοίγματος .txt");
}
}
////////Χρόνος διαβασματός
t = rtc.getTime();
tft.setTextColor(ΛΕΥΚΟ);
////////Εάν η ώρα έχει αλλάξει, τότε εμφανίστε τις νέες ενδείξεις του ρολογιού
αν ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // ρύθμιση της θέσης του δρομέα
tft.fillRect(118, 0, 50, 7, GRAY); // εκκαθάριση της περιοχής εξόδου χρόνου
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // μετρήσεις ρολογιού εξόδου
time_sec_prev = t.sec;
}
////////Εάν η ημερομηνία έχει αλλάξει, τότε εμφανίστε τη νέα ημερομηνία
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // ρύθμιση της θέσης του δρομέα
tft.fillRect(178, 0, 65, 7, GRAY); // εκκαθάριση περιοχής εμφάνισης ημερομηνίας
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // εμφάνιση ενδείξεων ημερομηνίας
time_day_prev = t.date;
}
////////Εάν είναι διαθέσιμη ραδιοφωνική λήψη, τότε
if (radio.available(&pipe)) {
////////έλεγχος εάν η προσωρινή μνήμη λήψης είναι πλήρης,
radio.read(&data, sizeof(data));
////////αν είναι διαθέσιμη η απαιτούμενη διεύθυνση πομπού, τότε
αν (σωλήνας == 1) {
////////αναμονή για τον προσδιορισμό μιας συγχρονιστικής ακολουθίας μηδενικών
//αρχή του μπλοκ δεδομένων
αν (δεδομένα == 0000) {
rc = 0;
} Else {
rc++;
}
////////Καταγραφή μετρητών και υπολογισμός τους σε 10ο και 100ο της ώρας
αν (rc == 1) {
leb_1 = δεδομένα / 3600.0;
}

αν (rc == 2) {
leb_2 = δεδομένα / 3600.0;
}

αν (rc == 3) {
leb_3 = δεδομένα / 3600.0;
}

αν (rc == 4) {
leb_4 = δεδομένα / 3600.0;
}
}
}
r++;
k++; // απλά ένας μετρητής
//////// Ενημέρωση δεδομένων με συγκεκριμένη περιοδικότητα
αν ( 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 λεπτά.
αν ((t.min % 10 == 0) && (t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(ΜΑΥΡΟ);
////////Δημιουργία συμβολοσειράς σε μορφή .csv
String dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Εγγραφή σε αρχείο και έξοδος των αποτελεσμάτων της διαδικασίας εγγραφής
myFile = SD.open(perv, FILE_WRITE); // εάν δεν υπάρχει αρχείο με το όνομα "2.txt", θα δημιουργηθεί.
αν (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, GREEN);
tft.println("SD OK");
Serial.println("SD OK");
καθυστέρηση (900); // καθυστέρηση, διαφορετικά καταγράφει 13 ίδιες μετρήσεις μέχρι να περάσει ένα δευτερόλεπτο
} Else {
tft.fillRect(198, 8, 42, 10, RED);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Το πρόγραμμα μετατροπής χαρακτήρων/* Ανακωδικοποίηση ρωσικών γραμματοσειρών από UTF-8 σε Windows-1251 */

String utf8rus (Πηγή συμβολοσειράς)
{
int i,k;
Στόχος συμβολοσειράς;
ανυπόγραφο char n;
char m[2] = { '0', ' ' };

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

ενώ (i < k) {
n = πηγή[i]; i++;

αν (n >= 0xC0) {
διακόπτης (n) {
περίπτωση 0xD0: {
n = πηγή[i]; i++;
εάν (n == 0x81) { n = 0xA8; Διακοπή; }
εάν (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
σπάσει?
}
περίπτωση 0xD1: {
n = πηγή[i]; i++;
εάν (n == 0x91) { n = 0xB8; Διακοπή; }
εάν (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
σπάσει?
}
}
}
m[0] = n; στόχος = στόχος + Συμβολοσειρά(m);
}
στόχος επιστροφής?
}Το πρόγραμμα διακωδικοποίησης χαρακτήρων για κυριλλική έξοδο χρησιμοποιώντας τη βιβλιοθήκη Adafruit_GFX τοποθετείται στον ίδιο φάκελο με το κύριο πρόγραμμα. Πρέπει επίσης να αντικαταστήσετε το αρχείο glcdfont.c στο Adafruit_GFX με διαφορετική γραμματοσειρά. Εδώ βιβλιοθήκη με την απαιτούμενη αντικατάσταση. Περισσότερες πληροφορίες σχετικά με τη ρωσοποίηση μπορούν εύκολα να βρεθούν στο Διαδίκτυο.
Συνοψίζοντας, θα πω ότι το σύστημα ανταποκρίθηκε στις προσδοκίες, έχει γίνει ευκολότερο να παρακολουθείται ο χρόνος λειτουργίας του εξοπλισμού. Παρόλο που τα πάντα είναι συναρμολογημένα σε breadboards, δεν υπάρχουν άμεσα παράπονα για τη δουλειά. Τα πρώτα στοιχεία λειτουργούν για περισσότερο από έξι μήνες και έχουν επιβιώσει τον χειμώνα. Τελευταίο σχέδιο Λειτουργεί για 9 ελεγχόμενες μονάδες από τις 5 Μαρτίου και ο χρόνος λειτουργίας καταγράφεται επίσημα με χρήση του.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο