Loka aŭtonoma datumkolekta sistemo

La firmao aĉetis NEKST-M-monitorajn postenojn, produktitajn nacie fare de Next Technologies. Por certigi vidadon de la funkciado de pumpaj unuoj,
fajraj kaj sekurecaj alarmoj, tensioĉeesto ĉe startigiloj, ĉambra temperaturo, kriza akvonivelo. La koro de NEKST-M estas ATMEGA 1280 kaj ĉi tiu fakto estas kuraĝiga laŭ la ebleco krei vian propran ilaron por specifaj bezonoj.

La tasko estis fiksita por krei plene aŭtonomian lokan sendosistemon por specifaj bezonoj en la plej mallonga ebla tempo kaj je minimuma kosto. La bazo estas mikroregilo. Evoluo, fabrikado, kreita de la personaro mem.

La sistemo devas funkcii sen dependeco de ĉelaj retoj, serviloj, Interreto kaj la licencsistemo por la uzo de radiofrekvencaj rimedoj, ne uzi komputilojn en la funkciado de la monitora kaj kontrola sistemo aŭ, maksimume, periode uzi tekkomputiloj, sen aliro al objektoj dum longa tempo (6-9 monatoj). La reto-konfiguracio havas radialan strukturon. Datenoj estas kolektitaj ĉe unu poento kaj tiam senditaj por prilaborado per regulaj komunikaj kanaloj aŭ kiel paperkopio.

La sistemo devas provizi:

  • monitorante la funkciadon de pumpiloj
  • teknologia aŭtomatigo
  • protekto kontraŭ la konsekvencoj de krizaj kondiĉoj
  • krizsignalado
  • kalkulo de operacia tempo
  • kalkulante la kvanton da elektro konsumita
  • ekipaĵo temperaturo kontrolo
  • sekureco kaj fajro alarmo
  • perioda fora registrado de informoj
  • nekonataj estontaj postuloj

Laboradaj Kondiĉoj:

  • kovra areo 1 kvadrataj km.
  • rekta videbleco inter objektoj
  • temperaturo de +50 ĝis -50 C
  • humido ĝis 100%
  • biologie aktivaj kuŝejoj (ŝimo, sulfat-reduktantaj bakterioj)
  • vibro, ne pli, de maŝinoj de klasoj 1-2 laŭ GOST ISO 10816-1-97
  • elektromagneta medio - ŝaltado de elektraj motoroj kun KT 6053-kontaktiroj, RVS-DN-milda starta ekipaĵo, SIEMENS MICROMASTER PID-kontrola ekipaĵo, radiado en la gamo ISM kaj GSM laŭ la postuloj por ĉi tiuj aparatoj, mana arka veldado surloke
  • troa rettensio, mallongperspektivaj interrompoj en elektroprovizo, fulmaj supertensioj, faza malekvilibro kiam supra linio drato rompiĝas en 6-10 kV distribuaj retoj.

Malgraŭ tiaj striktaj postuloj, efektivigo estas sufiĉe simpla solvante la problemon paŝon post paŝo.

Konsiderante ĉion, la tabulo "Arduino Nano 3.0" fariĝis la "cerbo" de la plano. La robotdyn-tabulo havas ATMEGA 328 regilon, la necesan 3,3V tensiostabiligilon por
aktuala 800 mA kaj konvertilo al CH340G UART-USB.

Antaŭ ĉio, funkciigadhorokalkuliloj estis kreitaj kiel la plej ĝisdataj. Antaŭe uzataj industriaj mezuriloj kunvenitaj sur PIC-oj kun sentransformila elektroprovizocirkvito malsukcesis pro tensiaj ŝprucoj ene de jaro da operacio. Nur tiuj konektitaj per memfaritaj 5V elektroprovizoj restis sendifektaj. Por akceli instaladon kaj versatilecon de konekto, signalo pri la stato de la unuoj estas prenita de la terminaloj de la ŝanĝaparatoj, t.e. registrado de la ĉeesto de la 1-a faza tensio kun trifaza nutrado de 380V. Por kunordigi kun la regilo, meza relajso kun 220V bobenaĵo aŭ optokupilo kunmetita de LED kaj GL5516-fotorezistilo aŭ PC817 optokupilo estas uzata. Ĉiuj opcioj estis provitaj. La LED estas funkciigita per rektigita tensio kun nuna limigo uzante du SVV22-kondensiloj dizajnitajn por tensio de 630V konektita en serio por sekureco dum hazarda testado de la cirkvitoj per megaohmetro.
Legante operaciajn tempolegaĵojn per la ST7735S LCD-ekrano, realtempa datumtranssendo per radio uzante la E01-ML01DP05-modulon ĉe ofteco de 2,4 MHz. Ĉi tiu aparato enhavas la peceton nRF24L01+ kaj la elsenda/ricevan amplifilon RFX2401C,
eligo potenco ĝis 100 mW. Helikformaj antenoj desegnitaj por la dezirata gamo en la interreta kalkulilo ejo. La elekto de antenspeco estas determinita per la ekskludo de la ricevo de unuope reflektitaj ondoj de ĉirkaŭaj metalstrukturoj. Antenaj partoj estas presitaj per 3D presilo. La aktuala stato de la nombriloj estas stokita en la EEPROM de la regilo mem kaj estas restarigita en la okazaĵo de neatendita elektropaneo. Tempaj intervaloj por kalkulado estas provizitaj de la RTC-blato DS3231 en formo de modulo kun rezerva baterio. La nutrado uzas 3 modulojn, la realan pulsfonton 220/5V HLK-PM01 600mA, konvertilon de 1-5V al 5V HW-553 и 03962A - bateria regilo kun skemo protekto kontraŭ fuŝkontakto, tromalŝarĝo kaj troŝarĝo. Ĉiuj komponantoj estis aĉetitaj en la retejo de Aliexpress.

PantabuloLoka aŭtonoma datumkolekta sistemo
4-kanala nombrilo. Estas LC-filtriloj ĉe la enigaĵoj por protekti kontraŭ interfero super tordita komunika linio. Datumoj pri la stato de kontrolobjektoj estas konstante legitaj unufoje je sekundo kaj montrataj en koloro sur la LCD. Legadoj estas ĝisdatigitaj kaj registritaj en nevolatila memoro ĉiujn 1 sekundojn. 36 sekundoj estas 36/1 de horo, ĉi tiu estas la formato en kiu la datumoj estas postulataj. Ĉiu 100 sek. informoj estas transdonitaj pri la nombro da sekundoj de operacio por ĉiu kontrolunuo. EEPROM-memoro havas limigitan nombron da skrib-viŝaj cikloj, laŭ la fabrikanto, 12 100000 fojojn. La plej malbona opcio estas kiam almenaŭ unu ĉelo estas konstante ĝisdatigita. La volumo de la 1-a nombrilo estas 4 bajtoj, ĉi tio estas longa formata nombro, 4 nombriloj, entute 16 bajtoj estas okupata de unu registro. La longo de la memoro de la blato estas 1024 bajtoj; post 64 eniroj de 4 nombriloj, registrado rekomencos. En la EEPROM-biblioteko, la EEPROM.put-metodo ne skribas; se la valoro de la ĉelo kaj la skriba informo kongruas, ne estos degenero de la ĉeloj. Kiel rezulto, la garantiita memora funkciada tempo estos pli ol 7 jaroj. La tempo de ebla sed ne garantiita laboro povas esti multe pli longa.

Cirkvita diagramoLoka aŭtonoma datumkolekta sistemo
Programo en Arduino IDE//12 bajtoj (328%)

#inkluzivi // Kerna grafika biblioteko
#inkluzivi // Aparataro-specifa biblioteko
#inkludu
#inkluzivi
#inkludu
#inkluzivi
#inkluzivi
RF24 radio (9, 10); // radiobjekto por labori kun la RF24-biblioteko,
// kaj pinglaj nombroj nRF24L01+ (CE, CSN)
#inkluzivi
DS3231 rtc(SDA, SCL);
Tempo t;

//#difini TFT_CS 10
#difini TFT_CS 8
#define TFT_RST -1 // vi ankaŭ povas konekti ĉi tion al la reset de Arduino
// en tiu kazo, starigu ĉi tiun #difini pinglon al -1!
//#define TFT_DC 9 // DC=RS=A0 - nomumaj elektoj por elekti komandon aŭ datuman registron.
#difini TFT_DC 3

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

// Opcio 2: uzu iujn ajn pinglojn sed iom pli malrapide!
#define TFT_SCLK 13 // agordu ĉi tiujn kiel ajn pinglojn vi ŝatas!
#define TFT_MOSI 11 // agordu ĉi tiujn kiel ajn pinglojn vi ŝatas!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#inkluzivi

bajta movo = 52;
bajto pinState;
sensigna longa pumpilo[4];// tabelo kun 4-sekundaj nombrilaj valoroj
flosilo m = 3600.0;
unsigned int adreso = 0;
int rc;// variablo por nombriloj
nesigna longa sumprim = 0;
nesigna longa sumsec = 0;
bajto i = 0;
bajto k = 34;
sensigna int z = 0;
bajto b = B00000001;
bajto pumrcounter[4]; // tabelo por stoki objektostatojn, 1 - off, 0 - on.
int komenco = 0; //

malplena agordo () {

rtc.begin();
radio.begin(); // Komencu laboron nRF24L01+
radio.setChannel(120); // datumkanalo (de 0 ĝis 127).
radio.setDataRate(RF24_250KBPS); // transdono de datumoj (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // dissendila potenco (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Malfermu tubon kun identigilo por transdono de datumoj

// Por agordi la tempon, malkomenti la necesajn liniojn
//rtc.setDOW(1); // Tago de la semajno
//rtc.setTime(21, 20, 0); // Tempo, en 24-hora formato.
//rtc.setDate (29, 10, 2018); // Dato, la 29-an de oktobro 2018

tft.initR(INITR_BLACKTAB); // pravalorigas peceton ST7735S, nigran langeton
// Uzu ĉi tiun inicialigilon (malkomento) se vi uzas 1.44" TFT
//tft.initR(INITR_144GREENTAB); // pravigu ST7735S peceton, RED rcB langeto
tft.setTextWrap (malvera); // Permesu al teksto elflui la dekstran randon
tft.setRotation( 2 ); // por NIGRA PCB kaj RUĜA tft.setRotation(0) aŭ ne.
tft.fillScreen(ST7735_BLACK); // purigi ekranon

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // programaro streĉado funkcias, altnivela -
// kontrolitaj objektoj "ne funkcias", "4" estas skribita al ĉiuj 1 altrangaj havenoj D, neniu kalkulado okazas.

por ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // montrante pozicionombrojn de kontrolobjektoj
tft.print(rc + 1);
}

tft.setCursor(12, 0); // eligas 3 liniojn de teksto
tft.println("PROGRAMAĴOJ & KONSTRUO"); // laŭdi vin karaj
tft.setCursor(24, 10); // aŭ malbona kopirajto
tft.print("DEVELOPPERO MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//datumreakiro//////////////////////////////////////////////////////////////////////////// ///////////

por ( z = 0; z < 1023; z += 16 ) { // Ripetas tra ĉiuj ĉeloj de la industrio
//kaj skribas al tabelo de 4 pumpvariabloj, 4 bajtoj por ĉiu nombrilo, ĉar
// nesubskribita longa variablo. Estas 4 nombriloj, unu registro de ĉiuj 4 prenas 16 bajtojn.
EEPROM.get(z, pumpilo[0]); // do sen la buklo por, malpli volumo
EEPROM.get(z+4, pumpilo[1]);
EEPROM.get(z+8, pumpilo[2]);
EEPROM.get(z+12, pumpilo[3]);

// asignante novan sekvan valoron por la sumo de 4 nombriloj
sumprim = (pumpilo [0] + pumpilo [1] + pumpilo [2] + pumpilo [3]);

// komparas la novan valoron de la sumo de 4 nombriloj en la sumprima variablo kun la antaŭa valoro en la variablo
// sumsec kaj se la antaŭa sumo estas malpli ol aŭ egala al la nova sumo, la nova pli granda aŭ egala estas asignita
// sumsec valoro.

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

//kaj la nuna valoro z estas asignita al la adresvariablo, z estas la adreso de la komenco de 16-bajta bloko de 4 valoroj
// nombriloj registritaj samtempe (ĉar dum sondado de haveno, ĉiuj 8 bitoj de ĝi estas skribitaj samtempe,
// inkluzive de niaj necesaj altaj 4 bitoj da haveno D).
adreso = z;
}
}

// denove alirante la eeprom-memoron ĉe la adreso de la komenco de bloko de 16 bajtoj de 4 registritaj nombrilaj valoroj
// lasta, t.e. valoroj antaŭ ol malŝalti aŭ rekomenci pro frosto. Registrante la plej novan
// nombri valorojn en tabelon de 4 variabloj pumpas.

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

adreso += 16; //pliigante la adreson por skribi la sekvan blokon sen anstataŭi la datumojn de la lasta rekordo

//fino de datumreakiro////////////////////////////////////////////////////////////////////////// //////////////////

attachInterrupt(0, kalkulo, LEVIĜO); // pinglo D2, ebligu interrompojn, venu ĉiun sekundon
// pulsoj de RTC DS3231 de SQW-eligo

wdt_enable(WDTO_8S); // lanĉu la gardan tempigilon, rekomencu la regilon en kazo de frosto, tempo,
// por kiu vi devas elsendi la tempigilon reset ordon wdt_reset (kaj eviti rekomenci dum normala funkciado - 8 sek.
// por provoj ne rekomendas agordi la valoron al malpli ol 8 sekundoj.En ĉi tiu kazo, la tempigilo estas rekomencigita prefere
// skuante, kaj ĝi okazas ĉiun sekundon.

}

malplena buklo () {
// malplena ciklo, ĉi tie estos kontrolo super la malferma-faza funkciado de la elektra motoro
}

malplena kalkulo () {

tft.setTextColor(ST7735_WHITE); // agordu la tiparkoloron
t = rtc.getTime(); // legi tempon
tft.setCursor(5, 120); // fiksante la pozicion de la kursoro
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // malbaras la tempoproduktan areon
tft.print(rtc.getTimeStr()); // eligi horloĝajn legaĵojn

wdt_restarigi(); // restarigi la gardhundon ĉiun ciklon, t.e. sekundon

por (rc = 0; rc < 4; rc ++) // komenco de la ciklo por kontroli la konformecon de la eniga stato
// havenbitoj al la antaŭa legita stato de haveno D-bitoj
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // kaj se ne kongruas, do
pumrcounter[rc] = pinState; // asignante al la portbit-statusa variablo novan valoron 1/0
}
// indiko de la stato de kolorkontrolobjektoj
// BLUA estas malgranda eraro de la ekzistanta ekrano (aŭ biblioteko?), RGB kaj BGR estas miksitaj.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // por malaltnivela kalkulado ŝanĝu VERDAN al BLUA
} Alie {
tft.fillRect(15, ((rc * 10 + movo)), 7, 7, ST7735_VERDA); // por malaltnivela kalkulado ŝanĝu BLUE al VERDA
pumpilo [rc] += 1; // aldonu 1 sekundon al la mastruma tempokalkulilo
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // malbaras la aron de montra tempo de operaciumo
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // kaj datoj

tft.setCursor(60, 120); // fiksante la pozicion de la kursoro
tft.print(rtc.getDateStr()); // montru la daton sur la LCD-ekrano

por (rc = 0; rc < 4; rc ++) //eligas funkciajn horojn entute, dekonojn kaj
{
tft.setCursor ( 30, rc * 10 + shift ); // centonoj de horo kun ekrana movo malsupren je 10 pikseloj
tft.println(pumpilo [rc] / m);
}

// skribante "krudajn" funkciajn horojn valorojn (en sekundoj) al EEPROM ///////////////////////////////

por (rc = 0; rc < 4; rc++)
{
EEPROM.put(adreso, pumpilo [rc]);
adreso += sizeof(float); // pliigas la skriba adreso-variablo
}
}

// sendu datumojn tra la radiokanalo el datumoj indikante kiom da bajtoj estu senditaj.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

nesubskribitaj longaj datumoj;

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

por (i = 0; i < 4; i++) {
datumoj = pumpilo [i];
radio.write( &datumoj, sizeof(datumoj));
}
}
}

Kelkaj notoj ĉe la fino. Kalkulado okazas je malalta logika nivelo ĉe la enigaĵoj.

Pull-up-rezistoj R2-R5 estas 36 kOhm por la opcio kun fotorezistiloj GL5516. En la kazo de fototransistora optokupilo kaj relajso, agordu al 4,7-5,1 kOhm. La Arduino Nano v3.0 ekŝargilo estis anstataŭigita kun la Arduino Uno uzante la TL866A-programiston por la ĝusta funkciado de la gardohundo-tempigilo. La fuzeoj estas korektitaj por funkcii ĉe tensioj super 4,3 V. La ekstera rekomencigita cirkvito R6 C3 ne estis uzita. En la specimena programo, la dissendila frekvenco ne respondas al la senlicenca gamo; la 2,4 MHz-intervalo estas limigita al frekvencoj 2400.0-2483.5 MHz.

La intervalo de la dissendilo E01-ML01DP05 estas 2400-2525 MHz. La bendolarĝo de unu kanalo estas 1 MHz, kiam oni fiksas la rapidon kiel "RF24_2MBPS" la specifita radio.setChannel(120) kanalo kaj la sekva estos okupita, t.e. la bando estos 2 MHz.

fonto: www.habr.com

Aldoni komenton