Sistema de recollida de dades autònom local

La companyia va comprar llocs de monitoratge NEKST-M, produïts a nivell nacional per Next Technologies. Per garantir la visualització del funcionament de les unitats de bombeig,
Alarmes d'incendi i seguretat, presència de tensió als arrencadors, temperatura ambient, nivell d'aigua d'emergència. El cor de NEKST-M és ATMEGA 1280 i aquest fet és encoratjador pel que fa a la possibilitat de crear el teu propi kit per a necessitats específiques.

La tasca es va plantejar crear un sistema d'enviament local totalment autònom per a necessitats específiques en el menor temps possible i amb un cost mínim. La base és un microcontrolador. Desenvolupament, fabricació, creat pel propi personal.

El sistema ha de funcionar sense dependència de xarxes cel·lulars, servidors, Internet i el sistema de llicències per a l'ús de recursos de radiofreqüència, no utilitzar ordinadors en el funcionament del sistema de vigilància i control o, com a màxim, utilitzar periòdicament ordinadors portàtils, sense accés a objectes durant molt de temps (6-9 mesos). La configuració de la xarxa té una estructura radial. Les dades es recullen en un moment determinat i després s'envien per al seu tractament a través de canals de comunicació habituals o com a còpia impresa.

El sistema ha de proporcionar:

  • seguiment del funcionament de les unitats de bombeig
  • automatització tecnològica
  • protecció de les conseqüències de les condicions d'emergència
  • senyalització d'emergència
  • càlcul del temps de funcionament
  • calculant la quantitat d'electricitat consumida
  • control de temperatura de l'equip
  • seguretat i alarma d'incendi
  • Enregistrament remot periòdic de la informació
  • requisits futurs desconeguts

Les condicions de treball:

  • àrea de cobertura 1 km².
  • visibilitat directa entre objectes
  • temperatura de +50 a -50 C
  • humitat fins al 100%
  • dipòsits biològicament actius (motlle, bacteris reductors de sulfat)
  • vibració, no més, de màquines de classes 1-2 segons GOST ISO 10816-1-97
  • entorn electromagnètic: commutació de motors elèctrics amb contactors KT 6053, equips d'arrencada suau RVS-DN, equips de control SIEMENS MICROMASTER PID, radiació a la gamma ISM i GSM segons els requisits d'aquests dispositius, soldadura manual per arc in situ
  • tensió excessiva de la xarxa, interrupcions a curt termini en el subministrament elèctric, sobretensions llamps, desequilibri de fases quan es trenca un cable de línia aèria en xarxes de distribució de 6-10 kV.

Malgrat els requisits tan estrictes, la implementació és bastant senzilla quan es resol el problema pas a pas.

Tenint-ho tot en compte, la placa "Arduino Nano 3.0" es va convertir en el "cervell" del pla. La placa robotdyn té un controlador ATMEGA 328, l'estabilitzador de tensió de 3,3 V necessari per
corrent 800 mA i convertidor a CH340G UART-USB.

En primer lloc, es van crear els comptadors d'hores de funcionament com els més actualitzats. Els comptadors industrials utilitzats anteriorment muntats en PIC amb un circuit d'alimentació sense transformador van fallar a causa de les pujades de tensió en un any de funcionament. Només els connectats amb fonts d'alimentació casolanes de 5 V es van mantenir intactes. Per agilitzar la instal·lació i la versatilitat de la connexió, es pren un senyal sobre l'estat de les unitats dels terminals dels dispositius de commutació, és a dir. registre de la presència de la tensió de 1a fase amb una font d'alimentació trifàsica de 380V. Per coordinar-se amb el controlador, s'utilitza un relé intermedi amb bobinatge de 220V o un optoacoblador compost per un LED i una fotoresistència GL5516 o un optoacoblador PC817. Es van provar totes les opcions. El LED s'alimenta amb una tensió rectificada amb limitació de corrent utilitzant dos condensadors SVV22 dissenyats per a una tensió de 630V connectats en sèrie per seguretat durant les proves accidentals dels circuits amb un megòhmetre.
Lectura de lectures de temps de funcionament mitjançant la pantalla LCD ST7735S, transmissió de dades en temps real per ràdio mitjançant el mòdul E01-ML01DP05 a una freqüència de 2,4 MHz. Aquest dispositiu conté el xip nRF24L01+ i l'amplificador de transmissió/recepció RFX2401C,
potència de sortida de fins a 100 mW. Antenes helicoïdals dissenyades per al rang desitjat a la calculadora en línia lloc. L'elecció del tipus d'antena està determinada per l'exclusió de la recepció d'ones reflectides individualment de les estructures metàl·liques circumdants. Les peces de l'antena s'imprimeixen en una impressora 3D. L'estat actual dels comptadors es guarda a l'EEPROM del propi controlador i es restaura en cas d'un tall de corrent inesperat. Els intervals de temps per al recompte els proporciona el xip RTC DS3231 en forma de mòdul amb una bateria de seguretat. La font d'alimentació utilitza 3 mòduls, la font de pols real 220/5V HLK-PM01 600mA, un convertidor d'1-5V a 5V HW-553 и 03962A - controlador de bateria amb esquema protecció contra curtcircuit, sobredescàrrega i sobrecàrrega. Tots els components es van comprar al lloc web d'Aliexpress.

Tauler de paSistema de recollida de dades autònom local
Comptador de 4 canals. Hi ha filtres LC a les entrades per protegir contra interferències a través d'una línia de comunicació de parell trenat. Les dades sobre l'estat dels objectes de control es llegeixen constantment una vegada per segon i es mostren en color a la pantalla LCD. Les lectures s'actualitzen i es registren a la memòria no volàtil cada 1 segons. 36 segons és 36/1 d'hora, aquest és el format en què es requereixen les dades. Cada 100 segons. es transmet informació sobre el nombre de segons de funcionament de cada unitat de control. La memòria EEPROM té un nombre limitat de cicles d'escriptura-esborrat, segons el fabricant, 12 vegades. La pitjor opció és quan almenys una cel·la s'actualitza constantment. El volum del 100000r comptador és de 1 bytes, aquest és un nombre de format llarg, 4 comptadors, un total de 4 bytes està ocupat per un registre. La longitud de la memòria del xip és de 16 bytes; després de 1024 entrades de 64 comptadors, la gravació començarà de nou. A la biblioteca EEPROM, el mètode EEPROM.put no escriu; si el valor de la cel·la i la informació que s'escriu coincideix, no hi haurà degradació de les cel·les. Com a resultat, el temps de funcionament de la memòria garantit serà de més de 4 anys. El temps de treball possible però no garantit pot ser molt més llarg.

Esquema de connexionsSistema de recollida de dades autònom local
Programa en Arduino IDE//12 bytes (328%)

#incloure // Biblioteca de gràfics bàsics
#incloure // Biblioteca específica del maquinari
#incloure
#incloure
#incloure
#incloure
#incloure
ràdio RF24 (9, 10); // objecte de ràdio per treballar amb la biblioteca RF24,
// i números de pin nRF24L01+ (CE, CSN)
#incloure
DS3231 rtc (SDA, SCL);
Temps t;

//#definir TFT_CS 10
#definir TFT_CS 8
#define TFT_RST -1 // també podeu connectar-ho al restabliment d'Arduino
// en aquest cas, establiu aquest pin #define a -1!
//#define TFT_DC 9 // DC=RS=A0 - opcions de designació per seleccionar una comanda o registre de dades.
#definir TFT_DC 3

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

// Opció 2: utilitzeu qualsevol agulla però una mica més lent!
#define TFT_SCLK 13 // establiu-los perquè siguin els pins que vulgueu!
#define TFT_MOSI 11 // establiu-los perquè siguin els pins que vulgueu!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include

desplaçament de bytes = 52;
byte pinState;
bomba llarga sense signar[4];// matriu amb valors de comptador de 4 segons
flotador m = 3600.0;
adreça int sense signar = 0;
int rc;// variable per als comptadors
sumprim llarg sense signar = 0;
Sumsec llarg sense signe = 0;
byte i = 0;
byte k = 34;
int sense signe z = 0;
byte b = B00000001;
byte pumrcounter[4]; // matriu per emmagatzemar estats d'objecte, 1 - desactivat, 0 - activat.
int inici = 0; //

void setup () {

rtc.begin();
radio.begin(); // Iniciar el treball nRF24L01+
radio.setChannel(120); // canal de dades (de 0 a 127).
radio.setDataRate(RF24_250KBPS); // velocitat de transferència de dades (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // potència del transmissor (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Obre una canonada amb un identificador per a la transferència de dades

// Per establir l'hora, descomenta les línies necessàries
//rtc.setDOW(1); // Dia de la setmana
//rtc.setTime(21, 20, 0); // Hora, en format de 24 hores.
//rtc.setDate(29, 10, 2018); // Data, 29 d'octubre de 2018

tft.initR(INITR_BLACKTAB); // inicialitzeu un xip ST7735S, pestanya negra
// Utilitzeu aquest inicialitzador (descomentar) si feu servir un TFT d'1.44".
//tft.initR(INITR_144GREENTAB); // inicialitzeu un xip ST7735S, pestanya RCB RED
tft.setTextWrap(fals); // Permet que el text surti per la vora dreta
tft.setRotation(2); // per a PCB NEGRE i VERMELL tft.setRotation(0) o no.
tft.fillScreen(ST7735_BLACK); // esborra la pantalla

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // l'ajustament del programari funciona, alt nivell -
// els objectes controlats "no funcionen", "4" s'escriu als 1 ports superiors D, no es fa cap recompte.

per ( rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + majúscules); // mostra els números de posició dels objectes de control
tft.print(rc + 1);
}

tft.setCursor(12, 0); // emet 3 línies de text
tft.println("DESENVOLUPADORS I CONSTRUCCIÓ"); // lloar-se els éssers estimats
tft.setCursor(24, 10); // o copyright malvat
tft.print("DESENVOLUPADOR MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//recuperació de dades////////////////////////////////////////////// ///////////

per ( z = 0; z < 1023; z += 16 ) { // Itera per totes les cel·les de la indústria
//i escriu en una matriu de 4 variables de bomba, 4 bytes per a cada comptador, perquè
// variable llarga sense signar. Hi ha 4 comptadors, un registre dels 4 pren 16 bytes.
EEPROM.get(z, bomba[0]); // per tant, sense el bucle for, menys volum
EEPROM.get(z+4, bomba[1]);
EEPROM.get(z+8, bomba[2]);
EEPROM.get(z+12, bomba[3]);

// assignant un nou valor següent per a la suma de 4 comptadors
sumprim = (bomba [0] + bomba [1] + bomba [2] + bomba [3]);

// compara el nou valor de la suma de 4 comptadors de la variable sumprim amb el valor anterior de la variable
// sumsec i si la suma anterior és menor o igual que la nova suma, s'assigna la nova major o igual
// valor sumsec.

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

//i el valor actual z s'assigna a la variable d'adreça, z és l'adreça del començament d'un bloc de 16 bytes de 4 valors
// comptadors enregistrats al mateix temps (ja que quan sondeja un port, els 8 bits del mateix s'escriuen simultàniament,
// incloent els nostres 4 bits alts necessaris del port D).
adreça = z;
}
}

// accedint de nou a la memòria eeprom a l'adreça de l'inici d'un bloc de 16 bytes de 4 valors de comptador registrats
// últim, és a dir. valors abans d'apagar-se o reiniciar a causa de la congelació. Gravació de l'últim
// comptador de valors en una matriu de 4 variables bomba.

EEPROM.get(adreça, bomba[0]);
EEPROM.get(adreça + 4, bomba[1]);
EEPROM.get(adreça + 8, bomba[2]);
EEPROM.get(adreça + 12, bomba[3]);

adreça += 16; //augmentant l'adreça per escriure el següent bloc sense sobreescriure les dades de l'últim registre

//final de la recuperació de dades///////////////////////////////////////////////////////////////////////// //////////////////

attachInterrupt(0, recompte, AUJENT); // pin D2, activa les interrupcions, arriba cada segon
// polsos de RTC DS3231 des de la sortida SQW

wdt_enable(WDTO_8S); // inicieu el temporitzador de control, reinicieu el controlador en cas de congelació, temps,
// per al qual heu d'emetre l'ordre de reinici del temporitzador wdt_reset (i eviteu reiniciar durant el funcionament normal - 8 seg.
// per a les proves no es recomana establir el valor a menys de 8 segons. En aquest cas, el temporitzador es reinicia preferentment
// sacsejada, i passa cada segon.

}

void loop () {
// cicle buit, aquí es controlarà el funcionament en fase oberta del motor elèctric
}

nombre de buits () {

tft.setTextColor(ST7735_WHITE); // estableix el color de la font
t = rtc.getTime(); // hora de lectura
tft.setCursor(5, 120); // estableix la posició del cursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // esborra l'àrea de sortida del temps
tft.print(rtc.getTimeStr()); // emet lectures del rellotge

wdt_reset(); // restableix el gos guardià cada cicle, és a dir, segons

for (rc = 0; rc < 4; rc ++) // inici del cicle per comprovar el compliment de l'estat d'entrada
// bits del port a l'estat de lectura anterior dels bits del port D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // i si no coincideix, aleshores
pumrcounter[rc] = pinState; // assignant a la variable d'estat del bit del port un nou valor 1/0
}
// indicació de l'estat dels objectes de control de color
// BLUE és un petit error de la pantalla existent (o biblioteca?), RGB i BGR es barregen.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + majúscula)), 7, 7, ST7735_BLUE); // per a un recompte de nivell baix canvieu de VERD a BLAU
} Else {
tft.fillRect(15, ((rc * 10 + majúscula)), 7, 7, ST7735_GREEN); // per a un recompte de nivell baix canvieu de BLAU a VERD
bomba [rc] += 1; // afegeix 1 segon al comptador de temps de funcionament
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // esborra l'àrea de visualització del temps de funcionament
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // i dates

tft.setCursor(60, 120); // estableix la posició del cursor
tft.print(rtc.getDateStr()); // mostra la data a la pantalla LCD

per a (rc = 0; rc < 4; rc ++) //hores de funcionament de sortida en total, dècimes i
{
tft.setCursor ( 30, rc * 10 + shift ); // centèsimes d'hora amb un desplaçament de pantalla cap avall de 10 píxels
tft.println(bomba [rc] / m);
}

// escrivint valors d'hores de funcionament "en brut" (en segons) a l'EEPROM ///////////////////////////////

per (rc = 0; rc < 4; rc++)
{
EEPROM.put(adreça, bomba [rc]);
adreça += sizeof(float); // incrementa la variable d'adreça d'escriptura
}
}

// envia dades pel canal de ràdio a partir de dades que indiquen quants bytes s'han d'enviar.
si ((k == 6 ) || (k == 18 ) || (k == 30 )) {

dades llargues sense signar;

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

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

Unes notes al final. El recompte es produeix a un nivell lògic baix a les entrades.

Les resistències pull-up R2-R5 són de 36 kOhm per a l'opció amb fotoresistències GL5516. En el cas d'un optoacoblador i relé fototransistor, establiu-lo a 4,7-5,1 kOhm. El carregador d'arrencada Arduino Nano v3.0 es va substituir per l'Arduino Uno utilitzant el programador TL866A per al correcte funcionament del temporitzador de vigilant. Els fusibles es corregeixen perquè funcionin a tensions superiors a 4,3 V. No s'ha utilitzat el circuit de reinici extern R6 C3. Al programa de mostra, la freqüència del transmissor no correspon a l'interval sense llicència; l'interval de 2,4 MHz està limitat a les freqüències 2400.0-2483.5 MHz.

El rang del transmissor E01-ML01DP05 és de 2400-2525 MHz. L'amplada de banda d'un canal és d'1 MHz, quan s'estableix la velocitat com a "RF24_2MBPS", s'ocuparà el canal radio.setChannel(120) especificat i el següent, és a dir. la banda serà de 2 MHz.

Font: www.habr.com

Afegeix comentari