Sistema locale autonomo di raccolta dati (continua)

Inizio su questo sito al link.
La soluzione più comoda per l'uso delle informazioni relative all'attivazione del relè è risultata essere la variante con il fototransistor PC817. Schema a blocchiSistema locale autonomo di raccolta dati (continua)Le schede contengono tre schemi identici, tutto è racchiuso in scatole di plastica ABS, dimensioni 100x100 mm. Foto dei fototransistorSistema locale autonomo di raccolta dati (continua) Collegando a dispositivi di avviamento con valvole a semiconduttore, la loro corrente di dispersione è sufficiente per attivare il PC817 e causarà un falso allarme del contatore. Per escludere tale situazione è necessario aggiungere in serie al circuito del fototransistor e al LED di indicazione un altro. A tal fine, il ponticello J1 deve essere aperto e un ulteriore LED1 deve essere saldato.
La parte ricevente è realizzata su lato 1Sistema locale autonomo di raccolta dati (continua)lato 2Sistema locale autonomo di raccolta dati (continua)una scheda prototipale collegata all'ARDUINO MEGA 2560. Per questo viene utilizzato un connettore a due file sull'estremità. Come dispositivo di visualizzazione delle informazioni, viene utilizzato uno schermo con touch resistivo e sensore di temperatura con risoluzione 240x400 HX8352B.Sistema locale autonomo di raccolta dati (continua) Va notato che il connettore ICSP sulla scheda dello schermo è stato rimosso e non viene utilizzato il vano per micro-SD. Questo perché il vano SD "nativo" non può essere utilizzato a causa di un conflitto sulla bus SPI. Per la scheda flash è stato utilizzato un lettore di schede separato dotato di un stabilizzatore 3,3V e un chip buffer con tre stati di uscita 74LVS125A. Qui mi aspettavano dei problemi. Il buffer con tre stati, ma funzionava sia E01-ML01DP5 che il lettore di schede. Nei commenti alla libreria SdFat ho notato un avviso di incompatibilità con altri dispositivi. È stato rimosso il convertitore di livelli TXS0108E ed è stato sostituito con ponticelli, poiché E01-ML01DP5 è tollerante ai segnali a 5V - non ha aiutato. Con l'oscilloscopio è stata rilevata la scomparsa del segnale sulla linea MISO quando si collega il lettore di schede. Dopo attenta analisi, è stato stabilito che gli ingressi dei segnali di abilitazione OE dei quattro canali 74LVS125A erano semplicemente saldati al comune e non c'era modo di avere un terzo stato. Il chip buffer è stato usato come un semplice convertitore di livelli da 5V a 3.3V usando resistori da 3,3 kΩ collegati in serie con le linee di segnale. Ad eccezione della linea MISO. La sua uscita con il transistor a bassa impedenza probabilmente attirava i segnali a livello diterra.Sistema locale autonomo di raccolta dati (continua)tra il collegamento dell'ingresso (9) 74LVS125A della selezione del dispositivo CS e il resistore di adattamento. Ora, se non ci sono riferimenti alla scheda di memoria, il buffer MISO viene disattivato e non disturba il funzionamento di un altro dispositivo.Schema della scheda di prototipazioneSistema locale autonomo di raccolta dati (continua)Ricevitore in funzioneSistema locale autonomo di raccolta dati (continua)Per collegare l'orologio al DS3231 si utilizza il bus I2C (TWI).
Programma 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 ("SVILUPPATORI & COSTRUTTORI");
tft.setCursor(30, 20);
tft.print(utf8rus("Costruttore V.V."));
tft.setCursor(40, 40);
tft.print(utf8rus("Tornitore I.I."));
delay(2000);

radio.begin(); // Iniziamo il funzionamento di nRF24L01+
radio.setChannel(120); // Indichiamo il canale di ricezione dei dati (da 0 a 127)
radio.setDataRate(RF24_250KBPS); // Indichiamo la velocità di trasmissione dati (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1 Mbit/sec
radio.setPALevel(RF24_PA_MAX); // Indichiamo la potenza del trasmettitore (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Apriamo il tubo 1 con l'identificatore 1 del trasmettitore 0xAABBCCDD11, per ricevere dati
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening(); // Attiviamo il ricevitore e iniziamo ad ascoltare i tubi aperti
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("Inizializzazione scheda SD");
tft.println("Inizializzazione scheda SD");
tft.setCursor(8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("inizializzazione fallita!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Inizializzazione fallita!");
return;
}
tft.setTextColor(WHITE);
Serial.println("inizializzazione completata");
tft.println("Inizializzazione completata");
delay(2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor(180, 0); // impostare la posizione del cursore
tft.fillRect(178, 0, 65, 7, GRAY); // pulizia dell'area di output del tempo
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println(utf8rus("Funi I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // se il file di log 2.txt è stato creato, continuerà la registrazione nel file
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // se il file 2.txt non esiste, verrà creato
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("errore nell'apertura di .txt");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if (time_sec_prev != t.sec) {
tft.setCursor(120, 0); // impostare la posizione del cursore
tft.fillRect(118, 0, 50, 7, GRAY); // pulizia dell'area di output del tempo
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // visualizzazione dei dati dell'orologio
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if (time_day_prev != t.date) {
tft.setCursor(180, 0); // impostare la posizione del cursore
tft.fillRect ( 178, 0, 65, 7, GRIGIO); \/\/ pulizia dell'area di output della data
tft.setTextSize(1);
tft.print(rtc.getDateStr()); \/\/ visualizzazione della data
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 ++; \/\/ semplice contatore
//////// С определённой условием периодичностью обновление данных
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect ( 0, 41, 180, 64, GRIGIO_D);
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); \/\/ se non esiste il file chiamato «2.txt», verrà creato.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, VERDE);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); \/\/ ritardo, altrimenti registra 13 letture identiche fino a quando non è trascorsa una seconda
} else {
tft.fillRect ( 198, 8, 42, 10, ROSSO);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Programma di riconversione dei caratteri/* 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;
} Programma di riconversione dei caratteri per visualizzare il cirillico utilizzando la libreria Adafruit_GFX è da collocare in una cartella insieme al programma principale. È inoltre necessario sostituire il file glcdfont.c in Adafruit_GFX con un altro font. Qui biblioteca con la sostituzione necessaria. Maggiori informazioni sulla localizzazione in russo possono essere facilmente trovate su Internet.
In sintesi, posso dire che il sistema ha soddisfatto le aspettative, è diventato più facile monitorare l'utilizzo dell'attrezzatura. Anche se tutto è assemblato su circuiti di prototipazione, non ci sono lamentele urgenti sul funzionamento. I primi elementi funzionano già da oltre sei mesi e hanno superato l'inverno. Ultima costruzione su 9 aggregati controllati funziona dal 5 marzo e registra ufficialmente il tempo di utilizzo.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster