Lokalt autonomt dataindsamlingssystem

Virksomheden købte NEKST-M overvågningsposter, produceret på hjemmemarkedet af Next Technologies. For at sikre visualisering af driften af ​​pumpeenheder,
brand- og sikkerhedsalarmer, spændingstilstedeværelse ved startere, rumtemperatur, nødvandstand. Hjertet i NEKST-M er ATMEGA 1280, og dette faktum er opmuntrende i forhold til muligheden for at skabe dit eget sæt til specifikke behov.

Opgaven var sat til at skabe et fuldt autonomt lokalt afsendelsessystem til specifikke behov på kortest mulig tid og med minimale omkostninger. Grundlaget er en mikrocontroller. Udvikling, fremstilling, skabt af personalet selv.

Systemet skal fungere uden afhængighed af mobilnetværk, servere, internettet og licenssystemet til brug af radiofrekvensressourcer, ikke bruge computere i driften af ​​overvågnings- og kontrolsystemet eller højst periodisk bruge bærbare computere, uden adgang til genstande i lang tid (6-9 måneder). Netværkskonfigurationen har en radial struktur. Data indsamles på et tidspunkt og sendes derefter til behandling via almindelige kommunikationskanaler eller som en papirkopi.

Systemet skal give:

  • overvågning af driften af ​​pumpeenheder
  • teknologisk automatisering
  • beskyttelse mod konsekvenserne af nødsituationer
  • nødsignalering
  • driftstidsberegning
  • beregne mængden af ​​forbrugt elektricitet
  • udstyrs temperaturkontrol
  • sikkerhed og brandalarm
  • periodisk fjernregistrering af information
  • ukendte fremtidige krav

Arbejdsvilkår:

  • dækningsareal 1 kvadratkilometer.
  • direkte synlighed mellem objekter
  • temperatur fra +50 til -50 C
  • luftfugtighed op til 100%
  • biologisk aktive aflejringer (skimmel, sulfatreducerende bakterier)
  • vibrationer, ikke mere, af maskiner i klasse 1-2 i henhold til GOST ISO 10816-1-97
  • elektromagnetisk miljø - kobling af elektriske motorer med KT 6053 kontaktorer, RVS-DN softstart udstyr, SIEMENS MICROMASTER PID kontroludstyr, stråling i ISM og GSM området i henhold til kravene til disse enheder, manuel lysbuesvejsning på stedet
  • for høj netspænding, kortvarige afbrydelser i strømforsyningen, lynoverspændinger, faseubalance, når en luftledning går i stykker i 6-10 kV distributionsnet.

På trods af sådanne strenge krav er implementeringen ret enkel, når man løser problemet trin for trin.

Tager alt i betragtning, blev "Arduino Nano 3.0"-brættet "hjernen" i planen. Robotdyn-kortet har en ATMEGA 328-controller, den nødvendige 3,3V spændingsstabilisator til
strøm 800 mA og konverter til CH340G UART-USB.

Først og fremmest blev driftstimetællere oprettet som de mest opdaterede. Tidligere brugte industrimålere samlet på PIC'er med et transformerløst strømforsyningskredsløb fejlede på grund af spændingsstigninger inden for et års drift. Kun de tilsluttede ved hjælp af hjemmelavede 5V strømforsyninger forblev intakte. For at fremskynde installationen og alsidigheden af ​​forbindelsen tages et signal om enhedernes tilstand fra kontaktenhedernes terminaler, dvs. registrering af tilstedeværelsen af ​​1. fase spænding med en trefaset strømforsyning på 380V. For at koordinere med controlleren anvendes et mellemrelæ med en 220V vikling eller en optokobler sammensat af en LED og en GL5516 fotomodstand eller en PC817 optokobler. Alle muligheder blev testet. LED'en drives af en ensrettet spænding med strømbegrænsning ved hjælp af to SVV22 kondensatorer designet til en spænding på 630V forbundet i serie for sikkerhed under utilsigtet test af kredsløbene med et megohmmeter.
Aflæsning af driftstidsaflæsninger ved hjælp af ST7735S LCD-skærm, realtidsdatatransmission via radio ved hjælp af E01-ML01DP05-modulet ved en frekvens på 2,4 MHz. Denne enhed indeholder nRF24L01+ chippen og RFX2401C sende/modtage forstærker,
udgangseffekt op til 100 mW. Spiralformede antenner designet til den ønskede rækkevidde i online-beregneren сайта. Valget af antennetype bestemmes af udelukkelsen af ​​modtagelse af enkeltreflekterede bølger fra omgivende metalstrukturer. Antennedele printes på en 3D-printer. Tællernes aktuelle tilstand gemmes i selve controllerens EEPROM og gendannes i tilfælde af et uventet strømafbrydelse. Tidsintervaller for optælling leveres af RTC-chippen DS3231 i form af et modul med et backup-batteri. Strømforsyningen bruger 3 moduler, selve pulskilden 220/5V HLK-PM01 600mA, en konverter fra 1-5V til 5V HW-553 и 03962A - batteri controller med ordningen beskyttelse mod kortslutning, overafladning og overopladning. Alle komponenter blev købt på Aliexpress-webstedet.

BrødbrætLokalt autonomt dataindsamlingssystem
4-kanals tæller. Der er LC-filtre ved indgangene for at beskytte mod interferens over en parsnoet kommunikationslinje. Data om tilstanden af ​​kontrolobjekter aflæses konstant en gang i sekundet og vises i farver på LCD'et. Aflæsninger opdateres og registreres i ikke-flygtig hukommelse hvert 1. sekund. 36 sekunder er 36/1 af en time, dette er det format, som dataene kræves i. Hvert 100. sek. der sendes information om antallet af sekunders drift for hver styreenhed. EEPROM-hukommelse har et begrænset antal skrive-slettecyklusser, ifølge producenten, 12 gange. Den værste mulighed er, når mindst én celle konstant bliver opdateret. Volumen af ​​den 100000. tæller er 1 bytes, dette er et langt format nummer, 4 tællere, i alt 4 bytes er optaget af en post. Længden af ​​chippens hukommelse er 16 bytes; efter 1024 indtastninger af 64 tællere starter optagelsen forfra. I EEPROM-biblioteket skriver EEPROM.put-metoden ikke; hvis værdien af ​​cellen og den information, der skrives, stemmer overens, vil der ikke være nogen forringelse af cellerne. Som følge heraf vil den garanterede hukommelsesdriftstid være mere end 4 år. Tiden for muligt, men ikke garanteret arbejde, kan være meget længere.

KredsløbsdiagramLokalt autonomt dataindsamlingssystem
Program i Arduino IDE//12 bytes (328 %)

#omfatte // Kernegrafikbibliotek
#omfatte // Hardware-specifikt bibliotek
#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
RF24 radio(9, 10); // radioobjekt til at arbejde med RF24-biblioteket,
// og pin-numre nRF24L01+ (CE, CSN)
#omfatte
DS3231 rtc(SDA, SCL);
Tid t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // du kan også forbinde dette til Arduino-nulstillingen
// i hvilket tilfælde, sæt denne #define pin til -1!
//#define TFT_DC 9 // DC=RS=A0 - betegnelsesmuligheder for valg af kommando eller dataregister.
#define TFT_DC 3

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

// Mulighed 2: Brug alle stifter, men lidt langsommere!
#define TFT_SCLK 13 // indstil disse til at være, hvad end du kan lide!
#define TFT_MOSI 11 // indstil disse til at være de pins du kan lide!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#omfatte

byteskift = 52;
byte pinState;
usigneret lang pumpe[4];// array med 4 sekunders tællerværdier
flyder m = 3600.0;
usigneret int-adresse = 0;
int rc;// variabel for tællere
usigneret lang sumprim = 0;
usigneret lang sumsek = 0;
byte i = 0;
byte k = 34;
usigneret int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // array til lagring af objekttilstande, 1 - off, 0 - on.
int start = 0; //

ugyldig opsætning () {

rtc.begin();
radio.begin(); // Igangsætte arbejde nRF24L01+
radio.setChannel(120); // datakanal (fra 0 til 127).
radio.setDataRate(RF24_250KBPS); // dataoverførselshastighed (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // sendereffekt (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Åbn et rør med en identifikator til dataoverførsel

// For at indstille klokkeslættet skal du fjerne kommentarer til de nødvendige linjer
//rtc.setDOW(1); // Dag i ugen
//rtc.setTime(21, 20, 0); // Tid, i 24 timers format.
//rtc.setDate(29, 10, 2018); // Dato, 29. oktober 2018

tft.initR(INITR_BLACKTAB); // initialiser en ST7735S-chip, sort fane
// Brug denne initializer (ikke kommenter), hvis du bruger en 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialiser en ST7735S-chip, RØD rcB-fane
tft.setTextWrap(false); // Tillad tekst at løbe fra højre kant
tft.setRotation( 2 ); // for SORT PCB og RØD tft.setRotation(0) eller ej.
tft.fillScreen(ST7735_BLACK); // Ryd skærm

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softwarestramning virker, højt niveau -
// kontrollerede objekter “virker ikke”, “4” skrives til alle 1 seniorporte D, ingen optælling sker.

for (rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // viser positionsnumre for kontrolobjekter
tft.print(rc + 1);
}

tft.setCursor(12, 0); // output 3 linjer tekst
tft.println("UDVIKLER & BYG"); // at prise dig selv kære
tft.setCursor(24, 10); // eller ond ophavsret
tft.print("UDVIKLER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//datagendannelse/////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Itererer gennem alle industriens celler
//og skriver til en matrix med 4 pumpevariable, 4 bytes for hver tæller, fordi
// lang variabel uden fortegn. Der er 4 tællere, en post af alle 4 tager 16 bytes.
EEPROM.get(z, pumpe[0]); // så, uden for-løkken, mindre volumen
EEPROM.get(z+4, pumpe[1]);
EEPROM.get(z+8, pumpe[2]);
EEPROM.get(z+12, pumpe[3]);

// tildele en ny næste værdi for summen af ​​4 tællere
sumprim = (pumpe [0] + pumpe [1] + pumpe [2] + pumpe [3]);

// sammenligner den nye værdi af summen af ​​4 tællere i sumprim-variablen med den tidligere værdi i variablen
// sumsec og hvis den tidligere sum er mindre end eller lig med den nye sum, tildeles den nye større eller lig
// sumsec værdi.

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

//og den aktuelle værdi z er tildelt adressevariablen, z er adressen på begyndelsen af ​​en 16-byte blok med 4 værdier
// tællere optaget på samme tid (da når man poller en port, skrives alle 8 bits af den samtidigt,
// inklusive vores nødvendige høje 4 bits af port D).
adresse = z;
}
}

// igen adgang til eeprom-hukommelsen på adressen for begyndelsen af ​​en blok på 16 bytes af 4 registrerede tællerværdier
// sidst, dvs. værdier før nedlukning eller genstart på grund af frysning. Optager det seneste
// tæller værdier i en række af 4 variabler pumpe.

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

adresse += 16; //forøgelse af adressen for at skrive den næste blok uden at overskrive dataene fra den sidste post

//slutningen af ​​datagendannelse/////////////////////////////////////////////////////////// //////////////////

attachInterrupt(0, tælle, STIGENDE); // pin D2, aktiver interrupts, kommer hvert sekund
// pulser fra RTC DS3231 fra SQW output

wdt_enable(WDTO_8S); // start watchdog-timeren, genstart controlleren i tilfælde af frysning, tid,
// som du skal udstede timer reset-kommandoen wdt_reset( og undgå genstart under normal drift - 8 sek.
// til test anbefales det ikke at indstille værdien til mindre end 8 sekunder. I dette tilfælde nulstilles timeren fortrinsvis
// rykker, og det sker hvert sekund.

}

void loop () {
// tom cyklus, her vil der være kontrol over elmotorens åbenfasedrift
}

void count() {

tft.setTextColor(ST7735_WHITE); // indstil skriftfarven
t = rtc.getTime(); // læsetid
tft.setCursor(5, 120); // indstilling af markørens position
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // rydder tidsoutputområdet
tft.print(rtc.getTimeStr()); // output ur aflæsninger

wdt_reset(); // nulstil vagthunden hver cyklus, dvs. sekund

for (rc = 0; rc < 4; rc ++) // begyndelsen af ​​cyklussen til kontrol af indgangstilstandens overensstemmelse
// portbits til den tidligere læsetilstand for port D-bits
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // og hvis ikke matcher, så
pumrcounter[rc] = pinState; // tildeler portbitstatusvariablen en ny værdi 1/0
}
// indikation af tilstanden af ​​farvekontrolobjekter
// BLÅ er en lille fejl på den eksisterende skærm (eller bibliotek?), RGB og BGR er blandet sammen.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLÅ); // for lavt niveau tæller skift GRØN til BLÅ
} Else {
tft.fillRect(15, ((rc * 10 + skift)), 7, 7, ST7735_GRØN); // for lavt niveau tæller skift BLÅ til GRØN
pumpe [rc] += 1; // tilføj 1 sekund til driftstidstælleren
}
}

k++;
hvis (k == 36) {
k er 0;

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // rydde visningsområdet for driftstid
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // og datoer

tft.setCursor(60, 120); // indstilling af markørens position
tft.print(rtc.getDateStr()); // Vis datoen på LCD-skærmen

for (rc = 0; rc < 4; rc ++) //output driftstimer i hele, tiendedele og
{
tft.setCursor ( 30, rc * 10 + shift ); // hundrededele af en time med et skærmskift ned med 10 pixels
tft.println(pumpe [rc] / m);
}

// skrive "rå" driftstimer værdier (i sekunder) til EEPROM ////////////////////////////////////////////////

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(adresse, pumpe [rc]);
adresse += sizeof(float); // forøg skriveadressevariablen
}
}

// send data over radiokanalen fra data, der angiver hvor mange bytes der skal sendes.
hvis ((k == 6 ) || (k == 18 ) || (k == 30 )) {

usignerede lange data;

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

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

Et par bemærkninger til sidst. Tælling sker på et lavt logisk niveau ved indgangene.

Pull-up modstande R2-R5 er 36 kOhm for optionen med fotomodstande GL5516. I tilfælde af en fototransistor optokobler og relæ indstilles til 4,7-5,1 kOhm. Arduino Nano v3.0 bootloaderen blev erstattet med Arduino Uno ved hjælp af TL866A programmøren for den korrekte drift af watchdog-timeren. Sikringerne er korrigeret til at fungere ved spændinger over 4,3 V. Det eksterne nulstillingskredsløb R6 C3 blev ikke brugt. I prøveprogrammet svarer senderfrekvensen ikke til det ulicenserede område; 2,4 MHz-området er begrænset til frekvenserne 2400.0-2483.5 MHz.

Rækkevidden for E01-ML01DP05-senderen er 2400-2525 MHz. Båndbredden på én kanal er 1 MHz, når man indstiller hastigheden som “RF24_2MBPS” vil den angivne radio.setChannel(120) kanal og den næste være optaget, dvs. båndet vil være 2 MHz.

Kilde: www.habr.com

Tilføj en kommentar