Sistema locale autonomo di raccolta dati

L'azienda ha acquistato posti di monitoraggio NEXТ-M di produzione nazionale "Next Technologies". Per garantire la visualizzazione del funzionamento delle pompe,
sistemi di allarme antincendio e di sicurezza, presenza di tensione sugli avviatori, temperatura nell'ambiente, livello d'acqua di emergenza. Il cuore del NEXТ-M è rappresentato dall'ATMEGA 1280, un aspetto che ha suscitato entusiasmo per la possibilità di creare un set personalizzato in base alle esigenze specifiche.

È stata data l'istruzione di creare, nel minor tempo possibile e con costi minimi, un sistema completamente autonomo di localizzazione sotto specifiche esigenze. La base è un microcontrollore. Sviluppo e produzione sono realizzati dallo stesso personale.

Il sistema deve operare senza dipendere dalle reti mobili, server, internet e sistema di autorizzazione per l'uso delle risorse radiospaziali, non utilizzare nei sistemi di controllo e gestione dei computer o al massimo uso occasionale di laptop, senza accesso agli oggetti per lungo tempo (6-9 mesi). La configurazione della rete ha una struttura radiale. I dati vengono raccolti in un unico punto e poi inviati per l'elaborazione tramite canali di comunicazione normali o in forma cartacea.

Il sistema deve garantire:

  • il controllo del funzionamento delle pompe
  • automazione tecnologica
  • protezione dalle conseguenze di modalità di emergenza
  • segnalazione di modalità di emergenza
  • conteggio del tempo di funzionamento
  • conteggio del volume di energia elettrica consumata
  • controllo della temperatura delle attrezzature
  • segnalazione di incendio e sicurezza
  • raccolta periodica delle informazioni a distanza
  • richieste sconosciute in futuro

Condizioni operative:

  • territorio di copertura 1 km².
  • vista diretta tra gli oggetti
  • temperatura da +50 a -50 °C
  • umidità fino al 100%
  • sedimenti biologicamente attivi (muffa, batteri solfato-riduttori)
  • vibrazione, non superiore ai macchinari di classe 1-2 secondo GOST ISO 10816-1-97
  • situazione elettromagnetica - commutazione dei motori elettrici tramite contattori KT 6053, apparecchiatura di avviamento morbido RVS-DN, apparecchiatura di regolazione PID SIEMENS MICROMASTER, emissioni nei bande ISM e GSM secondo i requisiti per questi dispositivi, saldatura ad arco manuale in loco
  • tensione di rete elevata, interruzioni temporanee dell'alimentazione elettrica, sovratensioni temporalesche, squilibrio di fase in caso di rottura del filo della linea di distribuzione 6-10 kV.

Nonostante tali requisiti severi, la realizzazione è piuttosto semplice se si affronta il compito passo dopo passo.

Tenendo conto di tutto ciò, la scheda "cervello" progettato è stata l'Arduino Nano 3.0. La scheda di "Robotdyn" è dotata del controllore ATMEGA 328, del necessario stabilizzatore di tensione da 3,3 V su
corrente 800 mA e di un convertitore basato su CH340G UART-USB.

In primo luogo, sono stati creati contatori di funzionamento come i più attuali. I contatori industriali precedentemente utilizzati, assemblati su PIC con schema di alimentazione senza trasformatore, si sono guastati a causa dei picchi di tensione durante un anno di funzionamento. Sono rimasti integri solo quelli collegati tramite alimentatori artigianali a 5V. Per accelerare l'installazione e garantire universalità di connessione, il segnale dello stato degli impianti viene prelevato dai morsetti degli apparecchi di commutazione, cioè la registrazione della presenza della 1ª fase di tensione in un'alimentazione trifase a 380V. Per il raccordo con il controllore viene utilizzato un relè intermedio con bobina a 220V o una optocoppia costituita da un LED e un fotoresistore GL5516 o una optocoppia PC817. Sono state testate tutte le opzioni in esercizio. Il LED è alimentato da tensione rettificata con limitazione di corrente tramite due condensatori SVV22 progettati per una tensione di 630V, collegati in serie per garantire la sicurezza durante eventuali controlli delle circuiti con un megohmmetro.
Lettura delle indicazioni di tempo di utilizzo tramite il display LCD ST7735S, trasmissione dei dati in tempo reale tramite il modulo E01-ML01DP05 a una frequenza di 2,4 MHz. Questo dispositivo contiene un chip nRF24L01+ e un amplificatore trasmettitore-ricevitore RFX2401C,
potenza in uscita fino a 100 mW. Le antenne sono spiralizzate e progettate per l'intervallo necessario nel calcolatore online sito. La scelta del tipo di antenne è dovuta all'esclusione della ricezione delle onde riflettute una sola volta dalle strutture metalliche circostanti. I dettagli delle antenne sono stampati con una stampante 3D. Lo stato attuale dei contatori è memorizzato in EEPROM del controller stesso e, in caso di interruzione imprevista dell'alimentazione, viene ripristinato. Gli intervalli di tempo per il conteggio sono forniti dal chip RTC DS3231 in forma di modulo con batteria di backup. Nel PSU sono utilizzati 3 moduli, un fonte di alimentazione impulsiva 220/5V HLK-PM01 600mA, un convertitore da 1-5V a 5V HW-553 e 03962A – controller della batteria dotato di circuito di protezione da cortocircuiti, sovra-scarica e sovra-carica. Tutti i componenti sono stati acquistati sul sito Aliexpress.

Piastra di prototipazioneSistema locale autonomo di raccolta dati
Contatore a 4 canali. Sono presenti filtri LC agli ingressi per proteggere da interferenze nella linea di comunicazione in coppia twistata. I dati sullo stato degli oggetti di controllo vengono letti continuamente 1 volta al secondo e visualizzati a colori su un display LCD. L'aggiornamento delle letture e la registrazione nella memoria non volatile avviene ogni 36 secondi. 36 secondi corrispondono a 1/100 di ora, questo è il formato richiesto per i dati. Ogni 12 secondi viene trasmessa informazione sul numero di secondi di funzionamento di ciascun dispositivo di controllo. La memoria EEPROM ha un numero limitato di cicli di scrittura-cancellazione, secondo il produttore, 100.000 volte. Il peggior scenario è quando viene continuamente aggiornato almeno un elemento. La dimensione di un contatore è di 4 byte, rappresenta un numero in formato long, 4 contatori occupano in totale 16 byte per ogni registrazione. La lunghezza della memoria del chip è di 1024 byte, dopo 64 registrazioni dei 4 contatori, la registrazione ricomincerà. Nella biblioteca EEPROM, il metodo EEPROM.put non esegue la scrittura se il valore della cella e le informazioni da registrare coincidono, non ci sarà degrado delle celle. Di conseguenza, il tempo di vita garantito della memoria sarà superiore ai 7 anni. Il tempo di funzionamento possibile, ma non garantito, può essere molto superiore.

Schema principaleSistema locale autonomo di raccolta dati
Programma in Arduino IDE//12 328 байт (38%)

#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <EEPROM.h>
#include <Wire.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // oggetto radio per lavorare con la libreria RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // you can also connect this to the Arduino reset
// in which case, set this #define pin to -1!
//#define TFT_DC 9 // DC=RS=A0- варианты обозначений вывода выбора регистра команд или данных.
#define TFT_DC 3

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// Option 2: use any pins but a little slower!
#define TFT_SCLK 13 // set these to be whatever pins you like!
#define TFT_MOSI 11 // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include <avr/wdt.h>

byte shift = 52;
byte pinState;
unsigned long pump[4];// array con 4 valori di contatori secondi
float m = 3600.0;
unsigned int address = 0;
int rc;// variabile per i contatori
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter [4]; // array per memorizzare gli stati degli oggetti, 1- spento, 0- acceso.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Iniziamo il funzionamento del nRF24L01+
radio.setChannel(120); // canale di trasmissione dati (da 0 a 127).
radio.setDataRate (RF24_250KBPS); // velocità di trasmissione dati (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // potenza del trasmettitore (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Apriamo un tubo con l'identificatore per la trasmissione dati

// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.

tft.initR(INITR_BLACKTAB); // inizializza un chip ST7735S, tab nera
// Use this initializer (uncomment) if you’re using a 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, RED rcB tab
tft.setTextWrap(false); // Consenti al testo di fuoriuscire dall'estremità destra
tft.setRotation( 2 ); // per PCB NERO e ROSSO tft.setRotation(0) o meno.
tft.fillScreen(ST7735_BLACK); // pulizia dello schermo

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // il pull-up software funziona, livello alto-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // output dei numeri delle posizioni degli oggetti di controllo
tft.print ( rc + 1 );
}

tft.setCursor (12, 0); // output di 3 righe di testo
tft.println («DEVELOPERS & BUILD» ); // per esaltare noi stessi
tft.setCursor (24, 10); // o del temuto copyright
tft.print («SVILUPPATORE M.M.»);
tft.setCursor (28, 20);
tft.print («COSTRUTTORE D.D.»);

//восстановление данных/////////////////////////////////////////////////////////

for ( z = 0; z < 1023; z += 16 ) { // Itera su tutte le celle di EEPROM
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // così, senza ciclo for, meno dimensione
EEPROM.get ( z + 4, pump [1]);
EEPROM.get ( z + 8, pump [2]);
EEPROM.get ( z + 12, pump [3]);

// присвоение нового очередного значения суммы 4-x счётчиков
sumprim = (pump [0] + pump [1] + pump [2] + pump [3]);

// сравнивается новое значение суммы 4-х счетчиков в переменной sumprim с предыдущим значением в переменной
// sumsec и если предыдущая сумма меньше или равна новой сумме, присваивается новое большее или равное
// sumsec значение.

if ( sumsec <= sumprim ) {
sumsec = sumprim; //

//и присваивается переменной address текущее значение z, z- это адрес начала блока в 16 байт из 4-х значений
// счетчиков, записанных в одно и то-же время ( т.к. при опросе порта записываются одновременно все его 8 бит,
// в том числе наши нужные старшие 4 бита порта D).
address = z;
}
}

// еще раз обращение к памяти еепром по адресу начала блока в 16 байт из 4-х значений счетчиков записанных
// последними, т.е. значения перед выключением или перезагрузкой по причине зависания. Запись последних
// значений счетчиков в массив из 4-х переменных pump.

EEPROM.get ( address, pump [0]);
EEPROM.get ( address + 4, pump [1]);
EEPROM.get ( address + 8, pump [2]);
EEPROM.get ( address + 12, pump [3]);

address += 16; // incremento dell'indirizzo per registrare il prossimo blocco senza sovrascrivere i dati dell'ultima registrazione

// конец восстановления данных////////////////////////////////////////////////////////////////

attachInterrupt(0, count, RISING); // pin D2, abilitazione dell'interruzione, ogni secondo arrivano
// импульсы от RTC DS3231 с выхода SQW

wdt_enable (WDTO_8S); // avvio del watchdog timer, riavvia il controllore in caso di blocco, tempo,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}

void count() {

tft.setTextColor(ST7735_WHITE); // imposta il colore del testo
t = rtc.getTime(); // lettura dell'ora
tft.setCursor ( 5, 120 ); // imposta la posizione del cursore
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // pulizia dell'area di output dell'ora
tft.print(rtc.getTimeStr()); // visualizzazione dell'ora

wdt_reset(); // reset del watchdog timer ogni ciclo, cioè ogni secondo

for (rc = 0; rc < 4; rc++) // inizio del ciclo di controllo del corrispondenza dello stato degli ingressi
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // e se non corrisponde, allora
pumrcounter [rc] = pinState; // assegnazione della variabile di stato del bit della porta al nuovo valore 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // per contare a basso livello cambiare GREEN in BLUE
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // per contare a basso livello cambiare BLUE in GREEN
pump [rc] += 1; // aggiungiamo 1 secondo al contatore del tempo di funzionamento
}
}

k ++;
if ( k == 36 ) {
k = 0;

tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // pulizia dell'area di output del tempo di funzionamento
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // e della data

tft.setCursor ( 60, 120 ); // impostazione della posizione del cursore
tft.print(rtc.getDateStr()); // visualizzazione della data sullo schermo LCD

for (rc = 0; rc < 4; rc ++) // visualizzazione delle letture del tempo di funzionamento in ore intere, decimali e
{
tft.setCursor ( 30, rc * 10 + shift ); // decimali con uno spostamento verso il basso sullo schermo di 10 pixel
tft.println(pump [rc] / m);
}

// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////

for (rc = 0; rc < 4; rc ++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // incremento della variabile indirizzo di scrittura
}
}

// отправляем данные по радиоканалу из data указывая сколько байт надо отправить.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

unsigned long data;

radio.write(&start, sizeof(start));

for ( i = 0; i < 4; i ++) {
data = pump [i ];
radio.write( &data, sizeof(data));
}
}
}

Piccole osservazioni alla fine. Il conteggio avviene a livello logico basso sugli ingressi.

Resistenze di pull-up R2-R5 36 kΩ per la variante con fotoresistori GL5516. Nel caso di un'accoppiata foto-transistor e relè, utilizzare 4,7-5,1 kΩ. Il bootloader di Arduino Nano v3.0 è stato sostituito con Arduino Uno tramite il programmato TL866A per un corretto funzionamento del timer di watchdog. I fuse sono stati modificati per funzionare a tensioni superiori a 4,3 V. Il circuito esterno di reset R6 C3 non è stato utilizzato. Nell'esempio di programma, la frequenza del trasmettitore non corrisponde alla banda non licenziata; la banda 2,4 GHz è limitata alle frequenze 2400.0—2483.5 MHz.

L'intervallo del trasmettitore E01-ML01DP05 va da 2400 a 2525 MHz. La larghezza di banda di un singolo canale è di 1 MHz; impostando la velocità su "RF24_2MBPS", sarà occupato il canale radio.setChannel(120) e il successivo, ovvero la larghezza sarà di 2 MHz.

Fonte: habr.com

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