Paikallinen autonominen tiedonkeruujärjestelmä

Yritys osti Next Technologiesin kotimaassa valmistamat NEKST-M-valvontatolpat. Pumppuyksiköiden toiminnan visualisoinnin varmistamiseksi,
palo- ja turvahälyttimet, jännitteen läsnäolo käynnistyksissä, huonelämpötila, hätävesitaso. NEKST-M:n sydän on ATMEGA 1280, ja tämä seikka on rohkaiseva, mitä tulee mahdollisuuteen luoda oma sarja tiettyihin tarpeisiin.

Tehtävänä oli luoda täysin autonominen paikallinen lähetysjärjestelmä erityistarpeisiin mahdollisimman lyhyessä ajassa ja pienin kustannuksin. Perus on mikro-ohjain. Kehitys, valmistus, henkilöstön itsensä luoma.

Järjestelmän tulee toimia ilman riippuvuutta matkapuhelinverkoista, palvelimista, Internetistä ja radiotaajuusresurssien käyttölupajärjestelmästä, ei saa käyttää tietokoneita valvonta- ja ohjausjärjestelmän toiminnassa tai korkeintaan määräajoin kannettavia tietokoneita ilman pääsyä esineitä pitkään (6-9 kuukautta). Verkkokokoonpanolla on säteittäinen rakenne. Tiedot kerätään yhdessä vaiheessa ja lähetetään sitten käsittelyyn tavallisten viestintäkanavien kautta tai paperikopiona.

Järjestelmän tulee tarjota:

  • pumppuyksiköiden toiminnan valvonta
  • teknologinen automaatio
  • suojaa hätätilanteiden seurauksilta
  • hätämerkinanto
  • käyttöajan laskeminen
  • kulutetun sähkön määrän laskeminen
  • laitteiden lämpötilan säätö
  • turva- ja palovaroitin
  • säännöllinen tietojen etätallennus
  • tuntemattomat tulevaisuuden vaatimukset

Työolot:

  • peittoalue 1 neliökilometriä.
  • suora näkyvyys esineiden välillä
  • lämpötila +50 - -50 C
  • kosteus jopa 100 %
  • biologisesti aktiiviset kerrostumat (home, sulfaattia vähentävät bakteerit)
  • GOST ISO 1-2-10816 mukaisten luokkien 1-97 koneiden tärinä, ei enää
  • sähkömagneettinen ympäristö - sähkömoottoreiden kytkentä KT 6053 kontaktorilla, RVS-DN pehmokäynnistyslaitteisto, SIEMENS MICROMASTER PID ohjauslaitteisto, säteily ISM- ja GSM-alueella näiden laitteiden vaatimusten mukaisesti, manuaalinen kaarihitsaus paikan päällä
  • liiallinen verkkojännite, lyhytaikaiset sähkökatkokset, ukkosylijännitteet, vaiheepätasapaino ilmajohtojohdon katketessa 6-10 kV jakeluverkoissa.

Näistä tiukoista vaatimuksista huolimatta toteutus on melko yksinkertaista, kun ongelma ratkaistaan ​​askel askeleelta.

Kun kaikki otetaan huomioon, "Arduino Nano 3.0" -levystä tuli suunnitelman "aivot". Robotdyn-kortissa on ATMEGA 328 -ohjain, tarvittava 3,3 V jännitteenvakain
virta 800 mA ja muunnin CH340G UART-USB:ksi.

Ensinnäkin käyttötuntilaskurit luotiin ajantasaisimmiksi. Aiemmin käytetyt teollisuusmittarit, jotka oli koottu muuntajattomalla virtapiirillä varustetuille PIC:ille, epäonnistuivat jännitepiikin vuoksi vuoden sisällä. Vain kotitekoisilla 5 V virtalähteillä kytketyt säilyivät ehjinä. Asennuksen ja liitännän monipuolisuuden nopeuttamiseksi signaali yksiköiden tilasta otetaan kytkinlaitteiden liittimistä, ts. ensimmäisen vaiheen jännitteen olemassaolon rekisteröinti kolmivaiheisella 1 V:n virtalähteellä. Ohjaimen kanssa koordinoimiseksi käytetään välirelettä, jossa on 380 V käämitys tai optoerotin, joka koostuu LEDistä ja GL220-valovastuksesta tai PC5516 optoerottimesta. Kaikki vaihtoehdot testattiin. LED saa virtansa tasasuuntautuneesta jännitteestä virtarajoituksella käyttämällä kahta SVV817-kondensaattoria, jotka on suunniteltu 22 V:n jännitteelle, jotka on kytketty sarjaan turvallisuuden takaamiseksi piirien vahingossa tapahtuvan testauksen aikana megaohmimittarilla.
Käyttöaikalukemien lukeminen ST7735S LCD-näytöllä, reaaliaikainen tiedonsiirto radion kautta E01-ML01DP05 moduulilla 2,4 MHz taajuudella. Tämä laite sisältää nRF24L01+-sirun ja RFX2401C lähetys-/vastaanottovahvistimen,
lähtöteho jopa 100 mW. Halutulle alueelle suunnitellut kierukkaantennit online-laskimessa paikka. Antennityypin valinta määräytyy sen perusteella, että ympäröivistä metallirakenteista ei voi vastaanottaa yksitellen heijastuneita aaltoja. Antenniosat tulostetaan 3D-tulostimella. Laskurien nykyinen tila tallennetaan itse ohjaimen EEPROM-muistiin ja palautuu odottamattoman sähkökatkon sattuessa. Laskennan aikavälit tarjoaa RTC-siru DS3231 moduulin muodossa, jossa on vara-akku. Virtalähteessä on 3 moduulia, varsinainen pulssilähde 220/5V HLK-PM01 600mA, muuntaja 1-5V - 5V HW-553 и 03962A - akun ohjain ohjelma suoja oikosulkua, ylipurkausta ja ylilatausta vastaan. Kaikki komponentit ostettiin Aliexpressin verkkosivuilta.

LeipälautaPaikallinen autonominen tiedonkeruujärjestelmä
4-kanavainen laskuri. Tuloissa on LC-suodattimet, jotka suojaavat häiriöiltä kierretyn parin tietoliikennelinjan kautta. Ohjausobjektien tilatietoja luetaan jatkuvasti kerran sekunnissa ja ne näytetään värillisinä LCD-näytössä. Lukemat päivitetään ja tallennetaan haihtumattomaan muistiin 1 sekunnin välein. 36 sekuntia on 36/1 tunnista, tässä muodossa tiedot vaaditaan. 100 sekunnin välein. jokaiselle ohjausyksikölle lähetetään tiedot sekuntien lukumäärästä. EEPROM-muistissa on rajoitettu määrä kirjoitus-poistojaksoja, valmistajan mukaan 12 100000 kertaa. Pahin vaihtoehto on, kun vähintään yhtä solua päivitetään jatkuvasti. Ensimmäisen laskurin tilavuus on 1 tavua, tämä on pitkä muotonumero, 4 laskuria, yhteensä 4 tavua vie yksi tietue. Sirun muistin pituus on 16 tavua, 1024 64 laskurin syöttämisen jälkeen tallennus alkaa alusta. EEPROM-kirjastossa EEPROM.put-metodi ei kirjoita; jos solun arvo ja kirjoitettava tieto täsmäävät, solujen huononemista ei tapahdu. Tämän seurauksena taattu muistin toiminta-aika on yli 4 vuotta. Mahdollisen, mutta ei taatun työn aika voi olla paljon pidempi.

PiirikaavioPaikallinen autonominen tiedonkeruujärjestelmä
Ohjelma Arduino IDE:ssä//12 328 tavua (38 %)

#sisältää // Grafiikkakirjasto
#include // Laitteistokohtainen kirjasto
#sisältää
#sisällytä
#sisältää
#include
#include
RF24-radio(9, 10); // radioobjekti RF24-kirjaston kanssa työskentelemiseen,
// ja pin-numerot nRF24L01+ (CE, CSN)
#sisältää
DS3231 rtc (SDA, SCL);
aika t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // voit myös yhdistää tämän Arduinon nollaukseen
// Tässä tapauksessa aseta tämä #define pin arvoon -1!
//#define TFT_DC 9 // DC=RS=A0 - nimitysvaihtoehdot komennon tai tietorekisterin valitsemiseksi.
#define TFT_DC 3

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

// Vaihtoehto 2: käytä mitä tahansa nastaa, mutta hieman hitaammin!
#define TFT_SCLK 13 // Aseta nämä haluamiisi pinsseihin!
#define TFT_MOSI 11 // Aseta nämä haluamiisi pinsseihin!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#sisältää

tavusiirto = 52;
tavu pinState;
etumerkitön pitkä pumppu[4];// ryhmä 4 sekunnin laskuriarvoilla
float m = 3600.0;
allekirjoittamaton int-osoite = 0;
int rc;// muuttuja laskureita varten
etumerkitön pitkä suprim = 0;
etumerkittömät pitkät summat = 0;
tavu i = 0;
tavu k = 34;
etumerkitön int z = 0;
tavu b = B00000001;
tavupumrcounter[4]; // taulukko objektien tilojen tallentamiseen, 1 - off, 0 - on.
int aloitus = 0; //

tyhjä asennus () {

rtc.begin();
radio.begin(); // Aloita työ nRF24L01+
radio.setChannel(120); // datakanava (0 - 127).
radio.setDataRate(RF24_250KBPS); // tiedonsiirtonopeus (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // lähettimen teho (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Avaa putki, jossa on tunniste tiedonsiirtoa varten

// Asettaaksesi ajan, poista tarvittavat rivit
//rtc.setDOW(1); // Viikonpäivä
//rtc.setTime(21, 20, 0); // Aika, 24 tunnin muodossa.
//rtc.setDate(29, 10, 2018); // Päivämäärä, 29. lokakuuta 2018

tft.initR(INITR_BLACKTAB); // alusta ST7735S-siru, musta välilehti
// Käytä tätä alustustoimintoa (poista kommenttia), jos käytät 1.44" TFT:tä
//tft.initR(INITR_144GREENAB); // alusta ST7735S-siru, PUNAINEN rcB-välilehti
tft.setTextWrap(false); // Anna tekstin valua oikeasta reunasta
tft.setRotation( 2 ); // MUSTA PCB:lle ja RED:lle tft.setRotation(0) vai ei.
tft.fillScreen(ST7735_MUSTA); // Tyhjennä näyttö

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // ohjelmiston kiristys toimii, korkea taso -
// ohjatut objektit "ei toimi", "4" kirjoitetaan kaikkiin 1 vanhempiin portteihin D, laskentaa ei tapahdu.

for (rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + vaihto ); // ohjausobjektien sijaintinumeroiden näyttäminen
tft.print(rc + 1);
}

tft.setCursor(12, 0); // tulostaa 3 riviä tekstiä
tft.println("KEHITTÄJÄT & RAKENNA"); // kehua itseäsi rakkaat
tft.setCursor(24, 10); // tai paha tekijänoikeus
tft.print("DEVELOPER M.M.");
tft.setCursor(28, 20);
tft.print("BUILD-ER D.D.");

//tietojen palautus////////////////////////////////////////////// ////////////

for (z = 0; z < 1023; z += 16 ) { // Iteroituu alan kaikkien solujen läpi
//ja kirjoittaa 4 pumppumuuttujan taulukkoon, 4 tavua jokaiselle laskurille, koska
// etumerkitön pitkä muuttuja. Laskuria on 4, yksi tietue kaikista neljästä vie 4 tavua.
EEPROM.get(z, pumppu[0]); // joten ilman for-silmukkaa pienempi äänenvoimakkuus
EEPROM.get(z+4, pumppu[1]);
EEPROM.get(z+8, pumppu[2]);
EEPROM.get(z+12, pumppu[3]);

// uuden seuraavan arvon määrittäminen 4 laskurin summalle
sumprim = (pumppu [0] + pumppu [1] + pumppu [2] + pumppu [3]);

// vertaa sumprim-muuttujan 4 laskurin summan uutta arvoa muuttujan edelliseen arvoon
// summasek ja jos edellinen summa on pienempi tai yhtä suuri kuin uusi summa, määrätään uusi suurempi tai yhtä suuri
// summasec arvo.

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

//ja nykyinen arvo z on osoitettu osoitemuuttujalle, z on 16-tavuisen 4 arvon lohkon alun osoite
// samanaikaisesti tallennetut laskurit (koska porttia pollattaessa, sen kaikki 8 bittiä kirjoitetaan samanaikaisesti,
// mukaan lukien tarvittavat korkeat 4 bittiä portista D).
osoite = z;
}
}

// jälleen kerran pääsy eeprom-muistiin 16 tallennetun laskuriarvon 4 tavun lohkon alussa
// viimeinen, ts. arvot ennen sammuttamista tai uudelleenkäynnistystä jäätymisen vuoksi. Viimeisimmän nauhoitus
// laskuriarvot 4 muuttujan joukkoon pumppu.

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

osoite += 16; //lisätään seuraavan lohkon kirjoitusosoitetta ilman, että viimeisen tietueen tietoja ylikirjoitetaan

//tietojen palautuksen loppu///////////////////////////////////////////// ///////////////////

attachInterrupt(0, määrä, NOUSEVA); // pin D2, salli keskeytykset, tulee joka sekunti
// pulsseja RTC DS3231:stä SQW-lähdöstä

wdt_enable(WDTO_8S); // käynnistä vahtikoiran ajastin, käynnistä ohjain uudelleen jäätymisen varalta, aika,
// jota varten sinun on annettava ajastimen nollauskomento wdt_reset( ja vältettävä uudelleenkäynnistystä normaalin toiminnan aikana - 8 sek.
// testeissä ei ole suositeltavaa asettaa arvoa alle 8 sekuntiin. Tässä tapauksessa ajastin nollataan mieluiten
// nykiminen, ja sitä tapahtuu joka sekunti.

}

void loop () {
// tyhjä sykli, tässä ohjataan sähkömoottorin avoimen vaiheen toimintaa
}

void count() {

tft.setTextColor(ST7735_VALKOINEN); // aseta fontin väri
t = rtc.getTime(); // lukuaika
tft.setCursor(5, 120); // kohdistimen paikan asettaminen
tft.fillRect(5, 120, 50, 7, ST7735_MUSTA); // tyhjennetään aikatulostusalue
tft.print(rtc.getTimeStr()); // ulostulo kellon lukemat

wdt_reset(); // nollaa vahtikoiran joka sykli, eli sekunti

for (rc = 0; rc < 4; rc ++) // jakson alku tulotilan yhteensopivuuden tarkistamiseksi
// porttibitit portin D-bittien edelliseen lukutilaan
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // ja jos ei täsmää, niin
pumrcounter[rc] = pinState; // porttibitin tilamuuttujan asettaminen uudelle arvolle 1/0
}
// värinhallintaobjektien tilan ilmaisin
// SININEN on pieni häiriö olemassa olevassa näytössä (tai kirjastossa?), RGB ja BGR ovat sekaisin.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // matalan tason laskentaa varten vaihda VIHREÄ SININEN
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // matalan tason laskentaa varten muuta SININEN VIHREÄksi
pumppu [rc] += 1; // lisää 1 sekunti käyttöaikalaskuriin
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_MUSTA); // toiminta-ajan näyttöalueen tyhjentäminen
tft.fillRect(60, 120, 73, 7, ST7735_MUSTA); // ja päivämäärät

tft.setCursor(60, 120); // kohdistimen paikan asettaminen
tft.print(rtc.getDateStr()); // näyttää päivämäärän LCD-näytöllä

for (rc = 0; rc < 4; rc ++) //lähtö käyttötunnit kokonaisina, kymmenesosina ja
{
tft.setCursor ( 30, rc * 10 + shift ); // tunnin sadasosat, kun näyttöä siirretään 10 pikseliä alaspäin
tft.println(pumppu [rc] / m);
}

// "raaka" käyttötuntien arvojen (sekunteina) kirjoittaminen EEPROMiin ///////////////////////////////

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(osoite, pumppu [rc]);
osoite += sizeof(float); // lisää kirjoitusosoitemuuttujaa
}
}

// lähettää dataa radiokanavan yli tiedoista, jotka osoittavat kuinka monta tavua tulee lähettää.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

allekirjoittamaton pitkä data;

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

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

Lopussa muutama huomautus. Laskenta tapahtuu alhaisella loogisella tasolla tuloissa.

Vetovastukset R2-R5 ovat 36 kOhm vaihtoehdossa, jossa on valovastukset GL5516. Jos kyseessä on fototransistori optoerotin ja rele, aseta arvoksi 4,7-5,1 kOhm. Arduino Nano v3.0 -käynnistyslatain korvattiin Arduino Unolla käyttämällä TL866A-ohjelmoijaa vahtikoiran ajastimen oikean toiminnan varmistamiseksi. Sulakkeet on korjattu toimimaan yli 4,3 V:n jännitteillä. Ulkoista kuittauspiiriä R6 C3 ei käytetty. Esimerkkiohjelmassa lähettimen taajuus ei vastaa lisensoimatonta aluetta, vaan 2,4 MHz:n alue on rajoitettu taajuuksille 2400.0-2483.5 MHz.

E01-ML01DP05 lähettimen kantama on 2400-2525 MHz. Yhden kanavan kaistanleveys on 1 MHz, kun nopeudeksi asetetaan “RF24_2MBPS” määritetty radio.setChannel(120) kanava ja seuraava on varattu, ts. taajuus on 2 MHz.

Lähde: will.com

Lisää kommentti