Tokiko datuak biltzeko sistema autonomoa

Konpainiak Next Technologies etxeak ekoitzitako NEKST-M monitorizazio postuak erosi zituen. Ponpatze-unitateen funtzionamendua bistaratzeko,
sute eta segurtasun alarmak, abiarazleetan tentsio presentzia, giro-tenperatura, larrialdietako ur-maila. NEKST-M-ren muina ATMEGA 1280 da eta gertaera hori pozgarria da behar zehatzetarako zure kit propioa sortzeko aukerari dagokionez.

Behar zehatzetarako tokiko bidalketa sistema guztiz autonomoa ahalik eta denbora laburrenean eta kostu minimoan sortzea ezarri zen. Oinarria mikrokontrolagailu bat da. Garapena, fabrikazioa, langileek beraiek sortua.

Sistemak sare zelularren, zerbitzarien, Interneten eta irrati-maiztasunaren baliabideak erabiltzeko lizentzia-sistemaren menpekotasunik gabe funtzionatu behar du, ez du ordenagailurik erabili kontrol- eta kudeaketa-sistemaren funtzionamenduan edo, gehienez ere, ordenagailu eramangarriak aldian-aldian erabili behar ditu, sarbidea izan gabe. objektuak denbora luzez (6-9 hilabete). Sarearen konfigurazioak egitura erradiala du. Datuak une batean biltzen dira eta gero prozesatzeko bidaltzen dira ohiko komunikazio-kanalen bidez edo kopia gisa.

Sistemak honako hauek eman behar ditu:

  • ponpaketa-unitateen funtzionamendua kontrolatzea
  • automatizazio teknologikoa
  • larrialdi-baldintzen ondorioetatik babestea
  • larrialdi seinaleztapena
  • funtzionamendu denboraren kalkulua
  • kontsumitutako elektrizitate kopurua kalkulatuz
  • ekipoen tenperatura kontrolatzea
  • segurtasuna eta suteen alarma
  • informazioaren aldizkako urruneko grabaketa
  • etorkizuneko eskakizun ezezagunak

Lan baldintzak:

  • estaldura-eremua 1 sq. km.
  • objektuen arteko zuzeneko ikusgarritasuna
  • +50 eta -50 C arteko tenperatura
  • hezetasuna %100era arte
  • gordailuak biologikoki aktiboak (lizunduak, sulfato murrizten dituzten bakterioak)
  • bibrazioa, ez gehiago, 1-2 klaseetako makinen GOST ISO 10816-1-97 arabera
  • ingurune elektromagnetikoa - KT 6053 kontaktoreekin motor elektrikoak aldatzea, RVS-DN abiarazte leuneko ekipoak, SIEMENS MICROMASTER PID kontrol ekipoak, ISM eta GSM gamako erradiazioa gailu hauen eskakizunen arabera, eskuzko arku soldadura gunean.
  • sareko gehiegizko tentsioa, elikadura-hornidura epe laburreko etenaldiak, tximista-gaintentsioak, fase-desoreka 6-10 kV-ko banaketa-sareetan aireko kable bat hausten denean.

Baldintza zorrotzak izan arren, inplementazioa nahiko erraza da arazoa urratsez urrats konpontzen denean.

Dena kontuan hartuta, "Arduino Nano 3.0" plaka planaren "garuna" bihurtu zen. Robotdyn taulak ATMEGA 328 kontroladore bat du, beharrezkoa den 3,3 V-ko tentsio-egonkortzailea.
korronte 800 mA eta CH340G UART-USB bihurgailua.

Lehenik eta behin, funtzionamendu orduen kontagailuak sortu ziren eguneratuenak. Transformadorerik gabeko elikatze-zirkuitu batekin PICetan muntatutako industria-neurgailuak huts egin zuten funtzionamendutik urtebeteko epean tentsio gorakadengatik. Etxeko 5V-ko elikadura-iturria erabiliz konektatuta zeudenak bakarrik geratu ziren osorik. Instalazioa eta konexioaren aldakortasuna bizkortzeko, unitateen egoerari buruzko seinalea hartzen da kommutazio-gailuen terminaletatik, hau da. 1. faseko tentsioaren presentzia erregistratzea 380V-ko elikadura trifasiko batekin. Kontrolagailuarekin koordinatzeko, 220V-ko harildura duen tarteko errele bat edo LED batek eta GL5516 fotorresistentzia edo PC817 optoakoplagailu bat osatutako optoakoplagailua erabiltzen da. Aukera guztiak probatu ziren. LEDa korrontea mugatzen duen tentsio zuzenduz elikatzen da 22V-ko tentsiorako diseinatutako bi SVV630 kondentsadoreak erabiliz, megohmmetro batekin zirkuituak ustekabeko proban segurtasunerako seriean konektatuta.
Eragiketa-denbora irakurtzea ST7735S LCD pantaila erabiliz, denbora errealean datu-transmisioa irrati bidez E01-ML01DP05 modulua erabiliz 2,4 MHz-ko maiztasunean. Gailu honek nRF24L01+ txipa eta RFX2401C transmisio/jaso anplifikadorea ditu,
irteerako potentzia 100 mW arte. Lineako kalkulagailuan nahi den barrutirako diseinatutako antena helikoidalak webgune. Antena mota aukeratzea inguruko metalezko egituretatik bakarka islatutako uhinen harrera baztertzean zehazten da. Antena zatiak 3D inprimagailu batean inprimatzen dira. Kontagailuen egungo egoera kontrolagailuaren beraren EEPROMean gordetzen da eta ustekabeko elektrizitatearen etenaldi bat gertatuz gero berrezartzen da. Zenbatzeko denbora tarteak DS3231 RTC txipak eskaintzen ditu babesko bateria duen modulu moduan. Elikatze iturriak 3 modulu erabiltzen ditu, benetako pultsu iturria 220/5V HLK-PM01 600mA, 1-5V-tik 5V-rako bihurgailua. HW-553 ΠΈ 03962A - bateria kontrolagailuarekin eskema Zirkuitu laburren, gaindeskargaren eta gainkargaren aurkako babesa. Osagai guztiak Aliexpress webgunean erosi ziren.

Ogi-taulaTokiko datuak biltzeko sistema autonomoa
4 kanaleko kontagailua. Sarreretan LC iragazkiak daude pare bihurritutako komunikazio-lerro baten interferentziaren aurka babesteko. Kontrol-objektuen egoerari buruzko datuak etengabe irakurtzen dira segundoan behin eta koloretan bistaratzen dira LCD-n. Irakurketak eguneratzen dira eta memoria ez-hegazkorran erregistratzen dira 1 segundoz behin. 36 segundo orduko 36/1 da, hau da datuak behar diren formatua. 100 segunduro. kontrol-unitate bakoitzaren funtzionamendu-segundo kopuruari buruzko informazioa transmititzen da. EEPROM memoriak idazketa-ezabatze-ziklo kopuru mugatua du, fabrikatzailearen arabera, 12 aldiz. Aukerarik txarrena gutxienez gelaxka bat etengabe eguneratzen ari denean da. 100000. kontagailuaren bolumena 1 byte da, hau formatu luzeko zenbakia da, 4 kontagailu, guztira 4 byte erregistro batek okupatzen ditu. Txiparen memoriaren luzera 16 byte da; 1024 kontagailuko 64 sarreraren ondoren, grabazioa berriro hasiko da. EEPROM liburutegian, EEPROM.put metodoak ez du idazten; gelaxkaren balioa eta idazten den informazioa bat badatoz, ez da zelulen degradaziorik izango. Ondorioz, bermatutako memoriaren funtzionamendu-denbora 4 urte baino gehiagokoa izango da. Lan posible baina bermatu gabeko denbora askoz luzeagoa izan daiteke.

Zirkuitu-diagramaTokiko datuak biltzeko sistema autonomoa
Programa Arduino IDEan//12 byte (% 328)

#sartu // Oinarrizko liburutegi grafikoa
#sartu // Hardwareari dagokion liburutegia
#sartu
#sartu
#sartu
#sartu
#sartu
RF24 irratia (9, 10); // RF24 liburutegiarekin lan egiteko irrati objektua,
// eta pin zenbakiak nRF24L01+ (CE, CSN)
#sartu
DS3231 rtc (SDA, SCL);
Denbora t;

//#defini TFT_CS 10
#defini TFT_CS 8
#define TFT_RST -1 // hau ere konekta dezakezu Arduino berrezarri
// kasu horretan, ezarri #define pin hau -1!
//#define TFT_DC 9 // DC=RS=A0 - komandoa edo datu-erregistroa hautatzeko izendapen-aukerak.
#defini TFT_DC 3

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

// 2. aukera: erabili edozein pin baina pixka bat motelago!
#define TFT_SCLK 13 // ezarri hauek nahi dituzun pinak izan daitezen!
#define TFT_MOSI 11 // ezarri hauek nahi dituzun pinak izan daitezen!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#sartu

byte-aldaketa = 52;
byte pinState;
sinatu gabeko ponpa luzea[4];// array 4 segundoko kontagailu-balioekin
flotatzailea m = 3600.0;
unsigned int helbidea = 0;
int rc;// kontagailuetarako aldagaia
sinatu gabeko sumprim luzea = 0;
sinatu gabeko batura luzea = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
b byte = B00000001;
byte pumrcounter[4]; // objektu-egoerak gordetzeko array, 1 - off, 0 - on.
int hasiera = 0; //

konfigurazio hutsa () {

rtc.begin();
irratia.hasi(); // Lanari ekin nRF24L01+
radio.setChannel(120); // datu-kanala (0tik 127ra).
radio.setDataRate(RF24_250KBPS); // datu-transferentzia-tasa (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // igorlearen potentzia (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Datuak transferitzeko identifikatzaile bat duen kanalizazioa ireki

// Ordua ezartzeko, kendu komentarioak beharrezko lerroak
//rtc.setDOW(1); // Asteko eguna
//rtc.setTime(21, 20, 0); // Ordua, 24 orduko formatuan.
//rtc.setDate(29, 10, 2018); // Eguna, 29ko urriaren 2018a

tft.initR(INITR_BLACKTAB); // hasieratu ST7735S txipa, fitxa beltza
// Erabili hasieratzaile hau (iruzkindu gabe) 1.44" TFT bat erabiltzen ari bazara
//tft.initR(INITR_144GREENTAB); // hasieratu ST7735S txipa, RED rcB fitxa
tft.setTextWrap(false); // Onartu testua eskuineko ertzetik ateratzen
tft.setRotation( 2 ); // BLACK PCB eta RED tft.setRotation(0) edo ez.
tft.fillScreen(ST7735_BLACK); // pantaila garbitu

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softwarea estutzea funtzionatzen ari da, maila altua -
// kontrolatutako objektuek "ez dute funtzionatzen", "4" D nagusien 1 ataketan idazten da, ez da kontaketarik gertatzen.

for (rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // kontrol-objektuen posizio-zenbakiak bistaratzen
tft.print(rc + 1);
}

tft.setCursor(12, 0); // 3 testu-lerro atera
tft.println("GARATZAILEAK ETA ERAIKITZEN"); // maiteak zure burua goraipatzeko
tft.setCursor(24, 10); // edo copyright gaiztoa
tft.print("GARATZAILEA MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//datuak berreskuratzea/////////////////////////////////////////////////////////////////////////// ////////////

for ( z = 0; z < 1023; z += 16 ) { // Industriako gelaxka guztietan zehar errepikatzen du
//eta 4 pump aldagaiko array batean idazten du, 4 byte kontagailu bakoitzeko, zeren
// sinatu gabeko aldagai luzea. 4 kontagailu daude, 4 guztien erregistro batek 16 byte hartzen ditu.
EEPROM.get(z, pump[0]); // beraz, for begiztarik gabe, bolumen gutxiago
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// hurrengo balio berri bat esleitzen 4 zenbagailuren baturari
sumprim = (ponpa [0] + ponpa [1] + ponpa [2] + ponpa [3]);

// sumprim aldagaiko 4 kontagailuen baturaren balio berria aldagaiko aurreko balioarekin alderatzen du
// sumsec eta aurreko batura batuketa berria baino txikiagoa edo berdina bada, berria handiagoa edo berdina esleitzen da
// sumsec balioa.

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

//eta uneko z balioa helbide aldagaiari esleitzen zaio, z 16 balioko 4 byteko bloke baten hasierako helbidea da
// aldi berean grabatutako kontagailuak (ataka bat galdetzean, haren 8 bit guztiak aldi berean idazten dira,
// gure beharrezko D atakaren 4 bit altuak barne.
helbidea = z;
}
}

// berriro ere eeprom memorian sartuz 16 byte-ko bloke baten hasierako helbidean erregistratutako 4 kontagailu-balioetan
// azkena, alegia. izozteagatik itzali edo berrabiarazi aurretik balioak. Azkena grabatzen
// kontatu balioak 4 aldagaiko ponpa multzo batean.

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

helbidea += 16; //hurrengo blokea idazteko helbidea handitzea azken erregistroko datuak gainidatzi gabe

//datuen berreskurapenaren amaiera//////////////////////////////////////////////////////////////////////// //////////////////

attachInterrupt(0, zenbaketa, GOAN); // D2 pin, etenaldiak gaitu, segundoro etorri
// RTC DS3231-ren pultsuak SQW irteeratik

wdt_enable(WDTO_8S); // abiarazi watchdog tenporizadorea, berrabiarazi kontrolagailua izoztearen kasuan, denbora,
// horretarako tenporizadorea berrezartzeko komandoa eman behar duzu wdt_reset (eta saihestu funtzionamendu arruntean berrabiarazi - 8 seg.
// Probetarako ez da gomendagarria balioa 8 segundo baino gutxiago ezartzea. Kasu honetan, tenporizadorea berrezartzen da.
// jerking, eta segundoro gertatzen da.

}

hutsune begizta () {
// ziklo hutsa, hemen motor elektrikoaren fase irekiko funtzionamenduaren kontrola izango da
}

hutsen zenbaketa () {

tft.setTextColor(ST7735_WHITE); // letra-tipoaren kolorea ezarri
t = rtc.getTime(); // irakurri ordua
tft.setCursor(5, 120); // kurtsorearen posizioa ezartzen
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // denbora irteera eremua garbitzen
tft.print(rtc.getTimeStr()); // erlojuaren irakurketak atera

wdt_reset(); // Watchdog berrezarri ziklo bakoitzean, hau da, segundo

for (rc = 0; rc < 4; rc ++) // sarrerako egoera betetzen dela egiaztatzeko zikloaren hasiera
// ataka-bitak D atakaren aurreko irakurketa-egoerara
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // eta bat ez badator, orduan
pumrcounter[rc] = pinState; // ataka-bit egoera aldagaiari 1/0 balio berri bat esleitzen dio
}
// kolore-kontroleko objektuen egoeraren adierazlea
// URDINA dagoen pantailaren (edo liburutegiaren?) akats txiki bat da, RGB eta BGR nahasten dira.
bada (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // maila baxuko zenbaketarako aldatu BERDEA URDINA
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // maila baxuko zenbaketarako aldatu URDINA BERDEA
ponpa [rc] += 1; // gehitu 1 segundo funtzionamendu-denboraren kontagailuari
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // funtzionamendu-denbora bistaratzeko eremua garbitzen
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // eta datak

tft.setCursor(60, 120); // kurtsorearen posizioa ezartzen
tft.print(rtc.getDateStr()); // bistaratu data LCD pantailan

for (rc = 0; rc < 4; rc ++) //irteera funtzionamendu-orduak osorik, hamarren eta
{
tft.setCursor ( 30, rc * 10 + shift ); // ordu ehuneneko pantaila 10 pixeleko desplazamenduarekin
tft.println(ponpa [rc] / m);
}

// funtzionamendu-orduen balioak "gordinak" idazten (segundotan) EEPROMan //////////////////////////////////////////////////////

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(helbidea, pump [rc]);
helbidea += sizeof(float); // idazteko helbidearen aldagaia handitu
}
}

// irrati-kanalaren bidez datuak bidali zenbat byte bidali behar diren adierazten duten datuetatik.
bada ((k == 6 ) || (k == 18 ) || (k == 30 )) {

sinatu gabeko datu luzeak;

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

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

Bukaeran ohar batzuk. Kontaketa maila logiko baxuan gertatzen da sarreretan.

Pull-up R2-R5 erresistentziak 36 kOhm dira GL5516 fotorresistentziak dituzten aukerarako. Fototransistore optoakoplagailu eta errele baten kasuan, ezarri 4,7-5,1 kOhm. Arduino Nano v3.0 abiarazlea Arduino Uno-rekin ordezkatu zen TL866A programatzailea erabiliz, watchdog tenporizadorearen funtzionamendu zuzena lortzeko. Fusibleak 4,3 V-tik gorako tentsioetan funtzionatzeko zuzenduta daude. R6 C3 kanpoko berrezarri zirkuitua ez da erabili. Lagin-programan, igorlearen maiztasuna ez dator bat lizentziarik gabeko barrutiarekin; 2,4 MHz-ko tartea 2400.0-2483.5 MHz-ko maiztasunetara mugatzen da.

E01-ML01DP05 transmisorearen barrutia 2400-2525 MHz da. Kanal baten banda-zabalera 1 MHz da, abiadura "RF24_2MBPS" gisa ezartzean zehaztutako radio.setChannel(120) kanala eta hurrengoa okupatuko dira, hau da. banda 2 MHz izango da.

Iturria: www.habr.com

Gehitu iruzkin berria