Sistema di raccolta di dati autònuma lucale

A cumpagnia hà acquistatu posti di surviglianza NEKST-M, pruduciuti internamente da Next Technologies. Per assicurà a visualizazione di u funziunamentu di l'unità di pumping,
allarmi di u focu è di sicurità, presenza di tensione à i principianti, temperatura di l'ambienti, livellu di l'acqua d'emergenza. U core di NEKST-M hè ATMEGA 1280 è questu fattu hè incuragisce in quantu à a pussibilità di creà u vostru propiu kit per bisogni specifichi.

U compitu hè statu stabilitu per creà un sistema di dispatch lucale cumplettamente autonomu per bisogni specifichi in u più cortu tempu è à u minimu costu. A basa hè un microcontroller. Sviluppu, fabricazione, creatu da u persunale stessu.

U sistema deve operare senza dipendenza da e rete cellulare, i servitori, l'Internet è u sistema di licenze per l'usu di risorse di radiofrequenza, micca aduprà l'urdinatore in u funziunamentu di u sistema di surviglianza è cuntrollu o, à u più, aduprà periodicamente laptops, senza accessu à ogetti per un bellu pezzu (6-9 mesi). A cunfigurazione di a rete hà una struttura radiale. I dati sò raccolti in un puntu è poi mandati per u processu per via di i canali di cumunicazione regulare o cum'è una copia stampata.

U sistema deve furnisce:

  • surviglianza di u funziunamentu di unità di pumping
  • automatizazione tecnologica
  • prutezzione da e cunsequenze di e cundizioni d'emergenza
  • segnalazione di emergenza
  • calculu di u tempu di funziunamentu
  • calculà a quantità di elettricità cunsumata
  • cuntrollu di temperatura di l'equipaggiu
  • sicurezza è alarme di focu
  • registrazione periodica remota di l'infurmazioni
  • esigenze future scunnisciute

Cundizioni di travagliu:

  • zona di copertura 1 sq. km.
  • visibilità diretta trà l'uggetti
  • temperatura da +50 à -50 C
  • umidità finu à 100%
  • dipositi biologicamente attivi (muffa, batteri sulfati-reducing)
  • vibrazione, micca più, di e macchine di classi 1-2 secondu GOST ISO 10816-1-97
  • ambiente elettromagneticu - cambiamentu di muturi elettrici cù cuntattori KT 6053, equipaghji di start soft RVS-DN, equipamentu di cuntrollu SIEMENS MICROMASTER PID, radiazione in a gamma ISM è GSM secondu i requisiti per questi dispusitivi, saldatura manuale à l'arcu in situ.
  • tensione eccessiva di a rete, interruzioni di cortu termine in l'alimentazione elettrica, sovratensioni di fulmini, sbilanciamentu di fasi quandu un filu di linea aerea si rompe in e rete di distribuzione 6-10 kV.

Malgradu tali esigenze strette, l'implementazione hè abbastanza simplice quandu si risolve u prublema passu à passu.

Pigliendu tuttu in contu, a scheda "Arduino Nano 3.0" divintò u "cervellu" di u pianu. A scheda robotdyn hà un controller ATMEGA 328, u stabilizzatore di tensione 3,3V necessariu per
currente 800 mA è cunvertitore à CH340G UART-USB.

Prima di tuttu, i contatori di l'ore di funziunamentu sò stati creati cum'è i più aghjurnati. I misuratori industriali usati in precedenza assemblati nantu à PIC cù un circuitu di alimentazione senza trasformatore anu fallutu per via di surge di tensione in un annu di funziunamentu. Solu quelli chì sò cunnessi cù l'alimentazione di 5V casalinghi sò stati intactu. Per accelerà a stallazione è a versatilità di cunnessione, un signalu nantu à u statu di l'unità hè pigliatu da i terminali di i dispusitivi di commutazione, i.e. iscrizzione di a prisenza di a tensione di a 1ª fase cù una alimentazione trifase di 380V. Per coordinà cù u controller, un relé intermediu cù un avvolgimentu 220V o un optocoupler cumpostu da un LED è una fotoresistenza GL5516 o un optocoupler PC817 hè utilizatu. Tutte l'opzioni sò stati pruvati. U LED hè alimentatu da una tensione rettificata cù limitazione di corrente aduprendu dui condensatori SVV22 cuncepiti per una tensione di 630V cunnessi in serie per a sicurità durante a prova accidentale di i circuiti cù un megaohmmetru.
Lettura di letture di u tempu di operazione cù u screnu LCD ST7735S, trasmissione di dati in tempu reale via radio utilizendu u modulu E01-ML01DP05 à una frequenza di 2,4 MHz. Stu dispusitivu cuntene u chip nRF24L01+ è l'amplificatore di trasmissione / ricezione RFX2401C,
putenza di uscita finu à 100 mW. Antenne elicoidali pensate per a gamma desiderata in a calculatrice in linea situ. L'scelta di u tipu d'antenna hè determinata da l'esclusione di a ricezione di onde riflesse singolarmente da strutture metalliche circundante. E parti di l'antenna sò stampate nantu à una stampante 3D. U statu attuale di i cuntatori hè almacenatu in l'EEPROM di u controller stessu è hè restauratu in casu d'una mancanza di energia inespettata. L'intervalli di tempu per cuntà sò furniti da u chip RTC DS3231 in forma di un modulu cù una bateria di salvezza. L'alimentazione usa 3 moduli, a fonte di impulsu attuale 220/5V HLK-PM01 600mA, un convertitore da 1-5V à 5V HW-553 и 03962A - controller di batteria cù schema prutezzione contra i cortu circuiti, overdischarge è overcharge. Tutti i cumpunenti sò stati acquistati nantu à u situ Aliexpress.

Tavola di paneSistema di raccolta di dati autònuma lucale
Contatore di 4 canali. Ci sò filtri LC à l'inputs per pruteggiri contra l'interferenza nantu à una linea di cumunicazione in coppia ritorta. I dati nantu à u statu di l'uggetti di cuntrollu sò constantemente leghjite una volta per seconda è visualizati in culore nantu à u LCD. Lettura sò aghjurnati è arregistrati in memoria non volatile ogni 1 seconde. 36 seconde hè 36/1 di una ora, questu hè u formatu in quale i dati sò necessarii. Ogni 100 sec. infurmazione hè trasmessa circa u numeru di seconde di funziunamentu di ogni unità di cuntrollu. A memoria EEPROM hà un numeru limitatu di cicli di scrittura-cancellazione, secondu u fabricatore, 12 volte. A peor opzione hè quandu almenu una cellula hè constantemente aghjurnata. U voluminu di u 100000st counter hè 1 bytes, questu hè un numeru di formatu longu, 4 contatori, un totale di 4 bytes hè occupatu da un record. A durata di a memoria di u chip hè 16 byte; dopu à 1024 entrate di 64 contatori, a registrazione ricominciarà. In a biblioteca EEPROM, u metudu EEPROM.put ùn scrive micca; se u valore di a cellula è l'infurmazioni chì sò scritte currispondenu, ùn ci sarà micca degradazione di e cellule. In u risultatu, u tempu di funziunamentu di memoria garantita serà più di 4 anni. U tempu di travagliu pussibule, ma micca garantitu, pò esse assai più longu.

Schema di circuituSistema di raccolta di dati autònuma lucale
Programma in Arduino IDE//12 bytes (328%)

#include // Biblioteca grafica core
#include // Biblioteca specifica di hardware
#include
#include
#include
#include
#include
radio RF24 (9, 10); // ogettu radio per travaglià cù a biblioteca RF24,
// è numeri di pin nRF24L01+ (CE, CSN)
#include
DS3231 rtc (SDA, SCL);
tempu t;

//#definisce TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // pudete ancu cunnette questu à u reset Arduino
// in quale casu, mette stu pin #define à -1!
//#define TFT_DC 9 // DC=RS=A0 - opzioni di designazione per selezziunà un cumandamentu o un registru di dati.
#define TFT_DC 3

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

// Opzione 2: aduprate qualsiasi pin ma un pocu più lento!
#define TFT_SCLK 13 // stabilisce questi per esse ciò chì ti piace!
#define TFT_MOSI 11 // stabilisce questi per esse ciò chì ti piace!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include

byte shift = 52;
byte pinState;
pompa longa senza signu [4];// array cù valori di contatore di 4 seconde
float m = 3600.0;
unsigned int indirizzu = 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 almacenà stati di l'ughjettu, 1 - off, 0 - on.
int start = 0; //

void setup () {

rtc.begin();
radio.begin(); // Inizià u travagliu nRF24L01+
radio.setChannel(120); // canale di dati (da 0 à 127).
radio.setDataRate (RF24_250KBPS); // velocità di trasferimentu di dati (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // putenza di trasmettitore (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Apertura una pipa cù un identificatore per u trasferimentu di dati

// Per stabilisce l'ora, scommentate e linee necessarie
//rtc.setDOW(1); // Ghjornu di a settimana
//rtc.setTime(21, 20, 0); // Tempu, in formatu 24 ore.
//rtc.setDate(29, 10, 2018); // Data, u 29 ottobre di u 2018

tft.initR(INITR_BLACKTAB); // inizializza un chip ST7735S, tabulazione nera
// Aduprate stu inizializzatore (senza commentu) se utilizate un TFT 1.44".
//tft.initR(INITR_144GREENTAB); // inizializza un chip ST7735S, RED rcB tab
tft.setTextWrap(false); // Permette à u testu di scorri fora di u latu drittu
tft.setRotation( 2 ); // per BLACK PCB è RED tft.setRotation(0) o micca.
tft.fillScreen(ST7735_BLACK); // schermu chjaru

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // u serramentu di u software funziona, altu livellu -
// l'uggetti cuntrullati "ùn funziona micca", "4" hè scrittu à tutti i 1 porti anziani D, ùn ci hè micca contu.

per (rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // mostra numeri di pusizioni di l'uggetti di cuntrollu
tft.print (rc + 1);
}

tft.setCursor(12, 0); // output 3 linee di testu
tft.println("SVILUPPURI E CUSTRUZIONE"); // per lodare i cari
tft.setCursor(24, 10); // o copyright male
tft.print("SVILUPPATORE MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//recuperazione di dati///////////////////////////////////////////////////////////////////////////// ///////////

per ( z = 0; z < 1023; z += 16 ) { // Itera in tutte e cellule di l'industria
//è scrive in un array di 4 variabili di pompa, 4 byte per ogni contatore, perchè
// variabile longa senza firmata. Ci sò 4 contatori, un record di tutti i 4 pigghia 16 bytes.
EEPROM.get(z, pump[0]); // dunque, senza u ciclu for, menu voluminu
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// assignendu un novu valore prossimu per a somma di 4 contatori
sumprim = (pompa [0] + pompa [1] + pompa [2] + pompa [3]);

// compara u novu valore di a somma di 4 contatori in a variabile sumprim cù u valore precedente in a variàbile
// sumsec è se a somma precedente hè menu o uguale à a nova somma, u novu più grande o uguale hè assignatu
// valore sumsec.

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

// è u valore attuale z hè assignatu à a variabile di l'indirizzu, z hè l'indirizzu di u principiu di un bloccu di 16 byte di 4 valori
// cuntatori arregistrati à u stessu tempu (poi chì quandu polling un portu, tutti i 8 bits sò scritti simultaneamente,
// cumpresi i nostri 4 bits alti necessarii di u portu D).
indirizzu = z;
}
}

// una volta accede à a memoria eeprom à l'indirizzu di l'iniziu di un bloccu di 16 bytes di 4 valori di contatore registrati
// l'ultimu, i.e. valori prima di chjude o riavvia per via di congelazione. Registrazione di l'ultime
// conta i valori in un array di 4 variabili pump.

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

indirizzu += 16; //aumentà l'indirizzu per scrive u prossimu bloccu senza sovrascrive i dati di l'ultimu record

//fine di ricuperazione di dati////////////////////////////////////////////////////////////////////////// ///////////////////

attachInterrupt(0, count, RISING); // pin D2, attivate interruzioni, vene ogni seconda
// impulsi da RTC DS3231 da output SQW

wdt_enable (WDTO_8S); // inizià u timer di watchdog, reboot u controller in casu di congelazione, tempu,
// per quale avete bisognu di emette u cumandamentu di reset timer wdt_reset (è evite u rebooting durante l'operazione normale - 8 sec.
// per i testi ùn hè micca cunsigliatu per stabilisce u valore à menu di seconde 8. In questu casu, u timer hè resettatu preferibile
// jerking, è succede ogni seconde.

}

void loop () {
// ciclu viotu, quì ci sarà u cuntrollu di u funziunamentu di a fase aperta di u mutore elettricu
}

void count () {

tft.setTextColor(ST7735_WHITE); // stabilisce u culore di font
t = rtc.getTime(); // tempu di leghje
tft.setCursor(5, 120); // stabilisce a pusizione di u cursore
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // sguassate l'area di output di u tempu
tft.print(rtc.getTimeStr()); // emette letture di l'orologio

wdt_reset(); // resetta u watchdog ogni ciclu, vale à dì secondu

per (rc = 0; rc < 4; rc ++) // principiu di u ciculu per verificà a conformità di u statu di input
// bits di portu à u statu di lettura precedente di i bit di portu D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // è se ùn currisponde micca, allora
pumrcounter[rc] = pinState; // assignà a variabile di statutu di u bit di u portu un novu valore 1/0
}
// indicazione di u statu di l'uggetti di cuntrollu di culore
// BLUE hè un picculu glitch di u screnu esistenti (o biblioteca?), RGB è BGR sò mischiati.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // per u cuntu di livellu bassu cambia da VERDE à BLU
} Altrò {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // per u conte di livellu bassu cambia BLU à VERDE
pompa [rc] += 1; // aghjunghje 1 seconda à u contatore di u tempu di operazione
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // sguassate l'area di visualizazione di u tempu di funziunamentu
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // è date

tft.setCursor(60, 120); // stabilisce a pusizione di u cursore
tft.print(rtc.getDateStr()); // mostra a data nantu à u screnu LCD

per (rc = 0; rc < 4; rc ++) //output ore di funziunamentu in tuttu, decimi è
{
tft.setCursor ( 30, rc * 10 + shift ); // centesimi d'ora cù un cambiamentu di schermu di 10 pixel
tft.println(pump [rc] / m);
}

// scrive i valori di l'ore di funziunamentu "raw" (in seconde) in EEPROM ///////////////////////////////

per (rc = 0; rc < 4; rc++)
{
EEPROM.put (indirizzu, pump [rc]);
indirizzu += sizeof (float); // Incrementa a variabile di l'indirizzu di scrittura
}
}

// Mandate dati nantu à u canali radiu da i dati chì indicanu quanti byte deve esse mandati.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

dati longu senza firmatu;

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

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

Uni pochi note à a fine. U cuntu si trova à un livellu logicu bassu à l'inputs.

E resistenze di pull-up R2-R5 sò 36 kOhm per l'opzione cù fotoresistori GL5516. In u casu di un fototransistor optocoupler è relay, stabilitu à 4,7-5,1 kOhm. L'Arduino Nano v3.0 bootloader hè statu rimpiazzatu cù l'Arduino Uno utilizendu u programatore TL866A per u funziunamentu currettu di u timer watchdog. I fusibles sò curretti per uperà à voltages sopra 4,3 V. U circuitu di reset esternu R6 C3 ùn hè micca usatu. In u prugramma di mostra, a frequenza di trasmettitore ùn currisponde à a gamma senza licenza; a gamma 2,4 MHz hè limitata à frequenze 2400.0-2483.5 MHz.

A gamma di u trasmettitore E01-ML01DP05 hè 2400-2525 MHz. A larghezza di banda di un canale hè 1 MHz, quandu stabilisce a velocità cum'è "RF24_2MBPS" u canale radio.setChannel (120) specificatu è u prossimu serà occupatu, i.e. a banda serà 2 MHz.

Source: www.habr.com

Add a comment