Lokalt autonomt datainnsamlingssystem

Selskapet kjøpte NEKST-M overvåkingsposter, produsert innenlands av Next Technologies. For å sikre visualisering av driften av pumpeenheter,
brann- og trygghetsalarm, spenningstilstede ved startere, romtemperatur, nødvannstand. Hjertet til NEKST-M er ATMEGA 1280, og dette faktum er oppmuntrende når det gjelder muligheten for å lage ditt eget sett for spesifikke behov.

Oppgaven ble satt til å lage et fullt autonomt lokalt utsendelsessystem for spesifikke behov på kortest mulig tid og til minimale kostnader. Grunnlaget er en mikrokontroller. Utvikling, produksjon, laget av personalet selv.

Systemet må fungere uten avhengighet av mobilnettverk, servere, internett og lisenssystemet for bruk av radiofrekvensressurser, ikke bruke datamaskiner i driften av overvåkings- og kontrollsystemet eller høyst periodisk bruke bærbare datamaskiner, uten tilgang til gjenstander i lang tid (6-9 måneder). Nettverkskonfigurasjonen har en radiell struktur. Data samles inn på ett tidspunkt og sendes deretter til behandling via vanlige kommunikasjonskanaler eller som papirkopi.

Systemet må gi:

  • overvåking av driften av pumpeenheter
  • teknologisk automatisering
  • beskyttelse mot konsekvensene av nødsituasjoner
  • nødsignalering
  • driftstidsberegning
  • beregne mengden strøm som forbrukes
  • utstyrs temperaturkontroll
  • sikkerhet og brannalarm
  • periodisk fjernregistrering av informasjon
  • ukjente fremtidige krav

Arbeidsforhold:

  • dekningsområde 1 kvadratkilometer.
  • direkte synlighet mellom objekter
  • temperatur fra +50 til -50 C
  • fuktighet opptil 100%
  • biologisk aktive avleiringer (mugg, sulfatreduserende bakterier)
  • vibrasjon, ikke mer, av maskiner i klasse 1-2 i henhold til GOST ISO 10816-1-97
  • elektromagnetisk miljø - kobling av elektriske motorer med KT 6053 kontaktorer, RVS-DN mykstartutstyr, SIEMENS MICROMASTER PID kontrollutstyr, stråling i ISM- og GSM-området i henhold til kravene til disse enhetene, manuell lysbuesveising på stedet
  • for høy nettspenning, kortvarige avbrudd i strømforsyningen, lynoverspenninger, faseubalanse når en luftledning ryker i 6-10 kV distribusjonsnett.

Til tross for slike strenge krav, er implementeringen ganske enkel når du løser problemet trinn for trinn.

Med alt i betraktning, ble "Arduino Nano 3.0"-tavlen "hjernen" i planen. Robotdyn-kortet har en ATMEGA 328-kontroller, den nødvendige 3,3V spenningsstabilisator for
strøm 800 mA og omformer til CH340G UART-USB.

Først og fremst ble driftstimetellere laget som de mest oppdaterte. Tidligere brukte industrimålere satt sammen på PIC-er med en transformatorløs strømforsyningskrets sviktet på grunn av spenningsstøt innen ett års drift. Bare de som var koblet til med hjemmelagde 5V-strømforsyninger forble intakte. For å øke hastigheten på installasjonen og allsidigheten av tilkoblingen, tas et signal om enhetens tilstand fra terminalene til bryterenhetene, dvs. registrering av tilstedeværelsen av 1. fase spenning med en trefase strømforsyning på 380V. For å koordinere med kontrolleren brukes et mellomrelé med en 220V vikling eller en optokobler som består av en LED og en GL5516 fotomotstand eller en PC817 optokobler. Alle alternativer ble testet. LED-en drives av en likerettet spenning med strømbegrensning ved bruk av to SVV22-kondensatorer designet for en spenning på 630V koblet i serie for sikkerhet under utilsiktet testing av kretsene med et megohmmeter.
Lesing av driftstidsavlesninger ved hjelp av ST7735S LCD-skjerm, sanntidsdataoverføring via radio ved bruk av E01-ML01DP05-modulen ved en frekvens på 2,4 MHz. Denne enheten inneholder nRF24L01+-brikken og RFX2401C sende-/mottaksforsterker,
utgangseffekt opp til 100 mW. Spiralformede antenner designet for ønsket rekkevidde i online-kalkulatoren сайта. Valget av antennetype bestemmes av utelukkelsen av mottak av enkeltreflekterte bølger fra omkringliggende metallstrukturer. Antennedeler skrives ut på en 3D-printer. Gjeldende tilstand for tellerne lagres i EEPROM til selve kontrolleren og gjenopprettes i tilfelle et uventet strømbrudd. Tidsintervaller for telling leveres av RTC-brikken DS3231 i form av en modul med et reservebatteri. Strømforsyningen bruker 3 moduler, selve pulskilden 220/5V HLK-PM01 600mA, en omformer fra 1-5V til 5V HW-553 и 03962A - batterikontroller med ordningen beskyttelse mot kortslutning, overutladning og overlading. Alle komponentene ble kjøpt på Aliexpress-nettstedet.

BrødbrettLokalt autonomt datainnsamlingssystem
4-kanals teller. Det er LC-filtre ved inngangene for å beskytte mot interferens over en tvunnet parkommunikasjonslinje. Data om tilstanden til kontrollobjekter leses konstant én gang per sekund og vises i farger på LCD-skjermen. Avlesningene oppdateres og registreres i ikke-flyktig minne hvert 1. sekund. 36 sekunder er 36/1 av en time, dette er formatet som dataene kreves i. Hvert 100. sek. det overføres informasjon om antall sekunders drift for hver kontrollenhet. EEPROM-minne har et begrenset antall skrive-slettesykluser, ifølge produsenten, 12 100000 ganger. Det verste alternativet er når minst én celle kontinuerlig oppdateres. Volumet til den første telleren er 1 byte, dette er et tall i langt format, 4 tellere, totalt 4 byte er okkupert av en post. Lengden på brikkens minne er 16 byte; etter 1024 oppføringer av 64 tellere vil opptaket starte på nytt. I EEPROM-biblioteket skriver ikke EEPROM.put-metoden; hvis verdien av cellen og informasjonen som skrives samsvarer, vil det ikke være noen degradering av cellene. Som et resultat vil den garanterte minnedriftstiden være mer enn 4 år. Tiden for mulig, men ikke garantert arbeid, kan være mye lengre.

KretsskjemaLokalt autonomt datainnsamlingssystem
Program i Arduino IDE//12 328 byte (38 %)

#inkludere // Kjernegrafikkbibliotek
#inkludere // Maskinvarespesifikt bibliotek
#inkludere
#inkludere
#inkludere
#inkludere
#inkludere
RF24 radio(9, 10); // radioobjekt for arbeid med RF24-biblioteket,
// og pin-nummer nRF24L01+ (CE, CSN)
#inkludere
DS3231 rtc(SDA, SCL);
Tid t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // du kan også koble denne til Arduino-tilbakestillingen
// i så fall, sett denne #define-pinnen til -1!
//#define TFT_DC 9 // DC=RS=A0 - betegnelsesalternativer for valg av kommando eller dataregister.
#define TFT_DC 3

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

// Alternativ 2: bruk hvilken som helst pinne, men litt tregere!
#define TFT_SCLK 13 // sett disse til å være de pinnene du liker!
#define TFT_MOSI 11 // sett disse til å være de pinnene du liker!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#inkludere

byte shift = 52;
byte pinState;
unsigned long pump[4];// array med 4 sekunder tellerverdier
flyte m = 3600.0;
usignert int-adresse = 0;
int rc;// variabel for tellere
usignert lang sumprim = 0;
usignert lang sumsek = 0;
byte i = 0;
byte k = 34;
usignert int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // array for lagring av objekttilstander, 1 - av, 0 - på.
int start = 0; //

ugyldig oppsett () {

rtc.begin();
radio.begin(); // Sette i gang arbeid nRF24L01+
radio.setChannel(120); // datakanal (fra 0 til 127).
radio.setDataRate(RF24_250KBPS); // dataoverføringshastighet (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); // Åpne et rør med en identifikator for dataoverføring

// For å stille inn tiden, fjern kommentarene til de nødvendige linjene
//rtc.setDOW(1); // Ukedag
//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-brikke, svart fane
// Bruk denne initialiseringen (ikke kommenter) hvis du bruker en 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialiser en ST7735S-brikke, RØD rcB-fane
tft.setTextWrap(false); // La tekst løpe fra høyre kant
tft.setRotation( 2 ); // for SVART PCB og RØD tft.setRotation(0) eller ikke.
tft.fillScreen(ST7735_BLACK); // klar skjerm

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // programvaretilstramming fungerer, høyt nivå -
// kontrollerte objekter “fungerer ikke”, “4” skrives til alle 1 seniorporter D, ingen telling skjer.

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

tft.setCursor(12, 0); // ut 3 linjer med tekst
tft.println("UTVIKLER OG BYGG"); // å prise deg selv kjære
tft.setCursor(24, 10); // eller ond opphavsrett
tft.print("UTVIKLER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//datarekonstruksjon////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Itererer gjennom alle cellene i industrien
//og skriver til en matrise med 4 pumpevariabler, 4 byte for hver teller, fordi
// lang variabel uten fortegn. Det er 4 tellere, en post av alle 4 tar 16 byte.
EEPROM.get(z, pumpe[0]); // så, uten for-løkken, mindre volum
EEPROM.get(z+4, pumpe[1]);
EEPROM.get(z+8, pumpe[2]);
EEPROM.get(z+12, pumpe[3]);

// å tildele en ny neste verdi for summen av 4 tellere
sumprim = (pumpe [0] + pumpe [1] + pumpe [2] + pumpe [3]);

// sammenligner den nye verdien av summen av 4 tellere i sumprim-variabelen med den forrige verdien i variabelen
// sumsec og hvis den forrige summen er mindre enn eller lik den nye summen, tildeles den nye større eller lik
// sumsec-verdi.

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

//og den nåværende verdien z er tilordnet adressevariabelen, z er adressen til begynnelsen av en 16-byte blokk med 4 verdier
// tellere registrert på samme tid (siden når du poller en port, skrives alle 8 biter av den samtidig,
// inkludert våre nødvendige høye 4 biter av port D).
adresse = z;
}
}

// igjen tilgang til eeprom-minnet på adressen til begynnelsen av en blokk på 16 byte med 4 registrerte tellerverdier
// sist, dvs. verdier før avslutning eller omstart på grunn av frysing. Tar opp det siste
// tellerverdier inn i en rekke med 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; //øke adressen for å skrive neste blokk uten å overskrive dataene til den siste posten

//slutt på datagjenoppretting///////////////////////////////////////// //////////////////

attachInterrupt(0, telling, STIGENDE); // pin D2, aktiver avbrudd, kommer hvert sekund
// pulser fra RTC DS3231 fra SQW-utgang

wdt_enable(WDTO_8S); // start watchdog-timeren, start kontrolleren på nytt i tilfelle fryser, tid,
// som du må utstede timerreset-kommandoen wdt_reset( og unngå omstart under normal drift - 8 sek.
// for tester anbefales det ikke å sette verdien til mindre enn 8 sekunder. I dette tilfellet tilbakestilles tidtakeren fortrinnsvis
// rykker, og det skjer hvert sekund.

}

ugyldig sløyfe () {
// tom syklus, her vil det være kontroll over den elektriske motorens åpenfasedrift
}

void count() {

tft.setTextColor(ST7735_WHITE); // angi skriftfargen
t = rtc.getTime(); // lesetid
tft.setCursor(5, 120); // stille inn markørposisjonen
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // sletter tidsutdataområdet
tft.print(rtc.getTimeStr()); // gir ut klokkeavlesninger

wdt_reset(); // tilbakestill vakthunden hver syklus, dvs. sekund

for (rc = 0; rc < 4; rc ++) // begynnelsen av syklusen for å kontrollere samsvaret til inngangstilstanden
// portbiter til forrige lesetilstand for port D-biter
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // og hvis ikke samsvarer, så
pumrcounter[rc] = pinState; // tildeler portbitstatusvariabelen en ny verdi 1/0
}
// indikasjon på tilstanden til fargekontrollobjekter
// BLÅT er en liten feil på den eksisterende skjermen (eller biblioteket?), RGB og BGR er blandet sammen.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // for lavt nivåtelling endre GRØNN til BLÅ
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GRØNN); // for lavt nivåtelling endre BLÅT til GRØNN
pumpe [rc] += 1; // legg til 1 sekund til driftstidstelleren
}
}

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

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

tft.setCursor(60, 120); // stille inn markørposisjonen
tft.print(rtc.getDateStr()); // viser datoen på LCD-skjermen

for (rc = 0; rc < 4; rc ++) //utgang driftstimer i hele, tideler og
{
tft.setCursor ( 30, rc * 10 + shift ); // hundredeler av en time med en skjermforskyvning ned med 10 piksler
tft.println(pumpe [rc] / m);
}

// skrive "rå" driftstimer verdier (i sekunder) til EEPROM ////////////////////////////////////////////////

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

// send data over radiokanalen fra data som indikerer hvor mange byte som skal sendes.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

usignerte lange data;

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

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

Noen få notater til slutt. Telling skjer på et lavt logisk nivå ved inngangene.

Pull-up motstand R2-R5 er 36 kOhm for alternativet med fotomotstander GL5516. I tilfelle av en fototransistor optokobler og relé, satt til 4,7-5,1 kOhm. Arduino Nano v3.0 bootloader ble erstattet med Arduino Uno ved å bruke TL866A-programmereren for riktig drift av watchdog-timeren. Sikringene er korrigert for å fungere ved spenninger over 4,3 V. Den eksterne tilbakestillingskretsen R6 C3 ble ikke brukt. I prøveprogrammet tilsvarer ikke senderfrekvensen det ulisensierte området; 2,4 MHz-området er begrenset til frekvensene 2400.0-2483.5 MHz.

Rekkevidden til E01-ML01DP05-senderen er 2400-2525 MHz. Båndbredden til en kanal er 1 MHz, når du setter hastigheten som “RF24_2MBPS” vil den spesifiserte radio.setChannel(120) kanalen og den neste være opptatt, dvs. båndet vil være 2 MHz.

Kilde: www.habr.com

Legg til en kommentar