Lokal nga autonomous nga sistema sa pagkolekta sa datos

Gipalit sa kompanya ang mga post sa pag-monitor sa NEKST-M, nga gihimo sa domestic sa Next Technologies. Aron masiguro ang pagtan-aw sa operasyon sa mga yunit sa pumping,
mga alarma sa sunog ug seguridad, presensya sa boltahe sa mga nagsugod, temperatura sa kwarto, lebel sa tubig sa emerhensya. Ang kasingkasing sa NEKST-M mao ang ATMEGA 1280 ug kini nga kamatuoran makapadasig sa mga termino sa posibilidad sa paghimo sa imong kaugalingon nga kit alang sa piho nga mga panginahanglan.

Ang buluhaton gitakda sa paghimo sa usa ka hingpit nga awtonomiya nga lokal nga sistema sa pagpadala alang sa piho nga mga panginahanglanon sa labing kadali nga posible nga oras ug sa labing gamay nga gasto. Ang basehan mao ang usa ka microcontroller. Pag-uswag, paghimo, nga gihimo sa mga kawani mismo.

Ang sistema kinahanglan nga molihok nga wala’y pagsalig sa mga cellular network, server, Internet ug sistema sa paglilisensya alang sa paggamit sa mga kapanguhaan sa frequency sa radyo, dili mogamit mga kompyuter sa operasyon sa sistema sa pag-monitor ug pagkontrol o, sa kadaghanan, kanunay nga gigamit ang mga laptop, nga wala’y access sa mga butang sa dugay nga panahon (6-9 ka bulan). Ang network configuration adunay radial structure. Ang mga datos gikolekta sa usa ka punto ug dayon gipadala alang sa pagproseso pinaagi sa regular nga mga channel sa komunikasyon o ingon usa ka hard copy.

Ang sistema kinahanglan maghatag:

  • pagmonitor sa operasyon sa pumping units
  • teknolohiya nga automation
  • pagpanalipod gikan sa mga sangputanan sa mga kahimtang sa emerhensya
  • emergency signaling
  • kalkulasyon sa oras sa pag-operate
  • pagkalkula sa gidaghanon sa kuryente nga nakonsumo
  • pagkontrol sa temperatura sa kagamitan
  • seguridad ug alarma sa sunog
  • periodic hilit nga pagrekord sa impormasyon
  • wala mahibal-an nga umaabot nga mga kinahanglanon

Mga kondisyon sa pagtrabaho:

  • coverage area 1 sq.
  • direkta nga visibility tali sa mga butang
  • temperatura gikan sa +50 hangtod -50 C
  • humidity hangtod sa 100%
  • biologically active nga mga deposito (hulmahan, sulfate-reducing bacteria)
  • vibration, wala na, sa mga makina sa mga klase 1-2 sumala sa GOST ISO 10816-1-97
  • electromagnetic nga palibot - pagbalhin sa mga de-koryenteng motor nga adunay KT 6053 contactors, RVS-DN soft start equipment, SIEMENS MICROMASTER PID control equipment, radiation sa ISM ug GSM range sumala sa mga kinahanglanon alang niini nga mga device, manual arc welding sa site
  • sobra nga boltahe sa network, mga short-term interruptions sa power supply, kilat nga overvoltages, phase imbalance kung ang usa ka overhead line wire nabuak sa 6-10 kV distribution networks.

Bisan pa sa ingon ka higpit nga mga kinahanglanon, ang pagpatuman yano ra kung masulbad ang problema sa lakang.

Giisip ang tanan, ang "Arduino Nano 3.0" board nahimong "utok" sa plano. Ang robotdyn board adunay ATMEGA 328 controller, ang gikinahanglan nga 3,3V boltahe stabilizer alang sa
kasamtangan nga 800 mA ug converter sa CH340G UART-USB.

Una sa tanan, ang mga oras sa pag-operate gimugna isip pinakabag-o. Kaniadto gigamit nga mga metro sa industriya nga gi-assemble sa mga PIC nga adunay usa ka transformerless power supply circuit napakyas tungod sa mga pagtaas sa boltahe sulod sa usa ka tuig nga operasyon. Ang mga konektado lamang gamit ang homemade 5V power supply ang nagpabiling wala. Aron mapadali ang pag-instalar ug versatility sa koneksyon, usa ka signal bahin sa kahimtang sa mga yunit gikuha gikan sa mga terminal sa mga switching device, i.e. pagrehistro sa presensya sa 1st phase nga boltahe nga adunay tulo ka hugna nga suplay sa kuryente nga 380V. Aron makig-coordinate sa controller, usa ka intermediate relay nga adunay 220V winding o usa ka optocoupler nga gilangkuban sa usa ka LED ug usa ka GL5516 photoresistor o usa ka PC817 optocoupler ang gigamit. Ang tanan nga mga kapilian gisulayan. Ang LED gipadagan sa usa ka gitul-id nga boltahe nga adunay kasamtangan nga limitasyon gamit ang duha ka SVV22 capacitors nga gidisenyo alang sa boltahe nga 630V nga konektado sa serye alang sa kaluwasan sa panahon sa aksidenteng pagsulay sa mga sirkito nga adunay megohmmeter.
Pagbasa sa oras sa pag-operate nga pagbasa gamit ang ST7735S LCD screen, real-time nga pagpadala sa datos pinaagi sa radyo gamit ang E01-ML01DP05 module sa frequency nga 2,4 MHz. Kini nga device naglangkob sa nRF24L01+ chip ug ang RFX2401C transmit/receive amplifier,
gahum sa output hangtod sa 100 mW. Helical antenna nga gidisenyo alang sa gitinguha nga range sa online calculator site. Ang pagpili sa tipo sa antenna gitino pinaagi sa dili pag-apil sa pagdawat sa usa nga gipabanaag nga mga balud gikan sa palibot nga mga istruktura nga metal. Ang mga parte sa antenna giimprinta sa 3D printer. Ang kasamtangan nga kahimtang sa mga counter gitipigan sa EEPROM sa controller mismo ug gipahiuli kung adunay wala damha nga pagkawala sa kuryente. Ang mga agwat sa oras alang sa pag-ihap gihatag sa RTC chip DS3231 sa porma sa usa ka module nga adunay backup nga baterya. Ang suplay sa kuryente naggamit sa 3 nga mga module, ang tinuud nga gigikanan sa pulso 220 / 5V HLK-PM01 600mA, usa ka converter gikan sa 1-5V hangtod 5V HW-553 и 03962A - controller sa baterya nga adunay laraw proteksyon batok sa short circuit, overdischarge ug overcharge. Ang tanan nga mga sangkap gipalit sa Aliexpress website.

Bread boardLokal nga autonomous nga sistema sa pagkolekta sa datos
4-channel nga counter. Adunay mga LC filter sa mga input aron mapanalipdan batok sa interference sa usa ka twisted pair nga linya sa komunikasyon. Ang datos sa estado sa kontrol nga mga butang kanunay nga gibasa kausa matag segundo ug gipakita sa kolor sa LCD. Ang mga pagbasa gi-update ug girekord sa dili mabag-o nga memorya matag 1 segundos. Ang 36 segundos mao ang 36/1 sa usa ka oras, kini ang format diin gikinahanglan ang datos. Matag 100 seg. impormasyon gipasa mahitungod sa gidaghanon sa mga segundos sa operasyon alang sa matag control unit. Ang memorya sa EEPROM adunay limitado nga gidaghanon sa mga siklo sa pagsulat-pagpapas, sumala sa tiggama, 12 ka beses. Ang pinakagrabe nga kapilian mao kung labing menos usa ka cell ang kanunay nga gi-update. Ang gidaghanon sa 100000st counter mao ang 1 bytes, kini usa ka taas nga format nga numero, 4 nga mga counter, usa ka kinatibuk-an nga 4 bytes ang giokupar sa usa ka rekord. Ang gitas-on sa memorya sa chip mao ang 16 bytes; human sa 1024 ka entries sa 64 ka counter, ang pagrekord magsugod na usab. Sa librarya sa EEPROM, ang EEPROM.put nga paagi wala magsulat; kung ang kantidad sa cell ug ang kasayuran nga gisulat magkatugma, wala’y pagkadaot sa mga cell. Ingon usa ka sangputanan, ang gigarantiyahan nga oras sa pag-operate sa memorya labaw pa sa 4 ka tuig. Ang panahon sa posible apan dili garantiya nga trabaho mahimong mas taas pa.

Diagram sa sirkitoLokal nga autonomous nga sistema sa pagkolekta sa datos
Programa sa Arduino IDE//12 byte (328%)

#apil // Core graphics library
#apil // librarya nga espesipiko sa hardware
# ilakip
#apil
# ilakip
#apil
#apil
RF24 nga radyo(9, 10); // radio object alang sa pagtrabaho kauban ang RF24 library,
// ug mga numero sa pin nRF24L01+ (CE, CSN)
#apil
DS3231 rtc(SDA, SCL);
Oras t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // makonektar usab nimo kini sa Arduino reset
// kung asa, ibutang kini nga #define pin sa -1!
//#define TFT_DC 9 // DC=RS=A0 - mga opsyon sa pagtudlo alang sa pagpili og command o data register.
#define TFT_DC 3

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

// Opsyon 2: gamita ang bisan unsang mga pin pero mas hinay!
#define TFT_SCLK 13 // itakda kini nga bisan unsang mga pin nga imong gusto!
#define TFT_MOSI 11 // itakda kini nga bisan unsang mga pin nga imong gusto!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#apil

byte pagbalhin = 52;
byte pinState;
unsigned long pump[4];// array nga adunay 4 segundos nga counter values
float m = 3600.0;
unsigned int address = 0;
int rc; // variable para sa mga counter
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // array para sa pagtipig sa mga estado sa butang, 1 - off, 0 - on.
int pagsugod = 0; //

wala’y pulos nga pag-setup () {

rtc.begin();
radio.begin(); // Pagsugod sa trabaho nRF24L01+
radio.setChannel(120); // channel sa datos (gikan sa 0 hangtod 127).
radio.setDataRate(RF24_250KBPS); // rate sa pagbalhin sa datos (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // gahum sa transmitter (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Ablihi ang tubo nga adunay identifier alang sa pagbalhin sa datos

// Aron itakda ang oras, i-uncomment ang kinahanglan nga mga linya
//rtc.setDOW(1); // Adlaw sa semana
//rtc.setTime(21, 20, 0); // Oras, sa 24 oras nga pormat.
//rtc.setDate(29, 10, 2018); // Petsa, Oktubre 29, 2018

tft.initR(INITR_BLACKTAB); // pagsugod ug ST7735S chip, itom nga tab
// Gamita kini nga initializer (uncomment) kung naggamit ka ug 1.44" TFT
//tft.initR(INITR_144GREENTAB); // pagsugod ug ST7735S chip, RED rcB tab
tft.setTextWrap(bakak); // Tugoti ang teksto nga modagan sa tuo nga kilid
tft.setRotation( 2 ); // para sa BLACK PCB ug RED tft.setRotation(0) o dili.
tft.fillScreen(ST7735_BLACK); // klaro nga screen

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // ang software tightening nagtrabaho, taas nga lebel -
// kontrolado nga mga butang "dili molihok", "4" gisulat sa tanan nga 1 senior port D, walay pag-ihap mahitabo.

alang sa ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // nagpakita sa mga numero sa posisyon sa kontrol nga mga butang
tft.print(rc + 1);
}

tft.setCursor(12, 0); // output 3 linya sa teksto
tft.println("DEVELOPERS & BUILD"); // sa pagdayeg sa imong kaugalingon mga minahal
tft.setCursor(24, 10); // o daotan nga copyright
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//pagbawi sa datos////////////////////////////////////////// ///////////

alang sa (z = 0; z <1023; z += 16) {// Nag-uli sa tanang mga selula sa industriya
//ug nagsulat sa usa ka han-ay sa 4 pump variables, 4 bytes alang sa matag counter, tungod kay
// unsigned long variable. Adunay 4 ka mga counter, usa ka rekord sa tanan nga 4 nagkinahanglan og 16 ka bytes.
EEPROM.get(z, bomba[0]); // busa, kung wala ang for loop, gamay nga gidaghanon
EEPROM.get(z+4, bomba[1]);
EEPROM.get(z+8, bomba[2]);
EEPROM.get(z+12, bomba[3]);

// pag-assign ug bag-ong sunod nga kantidad para sa sum nga 4 ka counter
sumprim = (bomba [0] + bomba [1] + bomba [2] + bomba [3]);

// nagtandi sa bag-ong bili sa sum sa 4 ka counter sa sumprim variable sa miaging value sa variable
// sumsec ug kung ang nauna nga kantidad mas gamay o parehas sa bag-ong kantidad, ang bag-o nga mas dako o parehas i-assign
// sumsec nga kantidad.

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

//ug ang kasamtangan nga bili z gi-assign sa address variable, z mao ang adres sa sinugdanan sa usa ka 16-byte block sa 4 values
// ang mga counter nga natala sa samang higayon (sukad sa pagboto sa usa ka pantalan, ang tanan nga 8 ka bits niini gisulat nga dungan,
// lakip ang among gikinahanglan nga taas nga 4 bits sa port D).
adres = z;
}
}

// sa makausa pa pag-access sa eeprom memory sa adres sa sinugdanan sa usa ka block nga 16 bytes sa 4 nga natala nga counter values
// katapusan, i.e. mga kantidad sa wala pa pagsira o pag-reboot tungod sa pagyelo. Pagrekord sa pinakabag-o
// counter values ​​​​sa usa ka han-ay sa 4 variables pump.

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

adres += 16; //pagdugang sa adres alang sa pagsulat sa sunod nga bloke nga walay pag-overwrite sa datos sa katapusang rekord

//katapusan sa data recovery//////////////////////////////////////// /////////////////

attachInterrupt(0, ihap, RISING); // pin D2, mahimo ang mga interrupts, moabut matag segundo
// pulses gikan sa RTC DS3231 gikan sa SQW output

wdt_enable(WDTO_8S); // sugdi ang watchdog timer, i-reboot ang controller sa kaso sa pagyelo, oras,
// diin kinahanglan nimo nga i-isyu ang timer reset command wdt_reset( ug likayi ang pag-reboot sa panahon sa normal nga operasyon - 8 sec.
// alang sa mga pagsulay dili girekomenda nga itakda ang kantidad sa dili moubos sa mga segundo sa 8. Sa kini nga kaso, mas maayo nga i-reset ang timer
// jerking, ug kini mahitabo matag segundo.

}

void loop () {
// walay sulod nga siklo, dinhi adunay kontrol sa open-phase nga operasyon sa electric motor
}

void count() {

tft.setTextColor(ST7735_WHITE); // itakda ang kolor sa font
t = rtc.getTime(); // oras sa pagbasa
tft.setCursor(5, 120); // pagbutang sa posisyon sa cursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // paglimpyo sa time output area
tft.print(rtc.getTimeStr()); // mga pagbasa sa orasan sa output

wdt_reset(); // i-reset ang watchdog matag cycle, i.e. segundo

alang sa (rc = 0; rc <4; rc ++) // pagsugod sa cycle alang sa pagsusi sa pagsunod sa input state
// port bits ngadto sa miaging read state sa port D bits
{
pinState = (PIND >> 4) & ( b << rc );

kung (pumrcounter [rc] != pinState) {/ // ug kung dili motakdo, nan
pumrcounter[rc] = pinState; // pag-assign sa port bit status variable og bag-ong value 1/0
}
// timailhan sa kahimtang sa mga butang nga kontrol sa kolor
// Ang BLUE usa ka gamay nga glitch sa kasamtangan nga screen (o librarya?), RGB ug BGR gisagol.
kon (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // para sa ubos nga lebel nga pag-ihap usbon ang GREEN ngadto sa BLUE
} Laing {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // para sa ubos nga lebel nga pag-ihap usbon ang BLUE ngadto sa GREEN
bomba [rc] += 1; // idugang ang 1 segundo sa operating time counter
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // paglimpyo sa operating time display area
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // ug mga petsa

tft.setCursor(60, 120); // pagbutang sa posisyon sa cursor
tft.print(rtc.getDateStr()); // ipakita ang petsa sa LCD screen

alang sa (rc = 0; rc <4; rc ++) // mga oras sa pag-operate sa output sa kinatibuk-an, ikanapulo ug
{
tft.setCursor ( 30, rc * 10 + shift ); // gatos sa usa ka oras nga adunay screen shift sa 10 pixels
tft.println(pump [rc] / m);
}

// pagsulat sa "hilaw" nga mga oras sa operasyon (sa mga segundo) sa EEPROM ///////////////////////////

alang sa (rc = 0; rc < 4; rc++)
{
EEPROM.put(adres, bomba [rc]);
adres += sizeof(float); // dugangan ang write address variable
}
}

// ipadala ang datos sa channel sa radyo gikan sa datos nga nagpakita kung pila ka byte ang kinahanglan ipadala.
kon ((k == 6 ) || (k == 18 ) || (k == 30 )) {

unsigned taas nga data;

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

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

Pipila ka mga nota sa katapusan. Ang pag-ihap mahitabo sa ubos nga lohikal nga lebel sa mga input.

Pull-up resistances R2-R5 mao ang 36 kOhm alang sa kapilian sa photoresistors GL5516. Sa kaso sa usa ka phototransistor optocoupler ug relay, gibutang sa 4,7-5,1 kOhm. Ang Arduino Nano v3.0 bootloader gipulihan sa Arduino Uno gamit ang TL866A programmer para sa saktong operasyon sa watchdog timer. Ang mga piyus gitul-id aron molihok sa mga boltahe nga labaw sa 4,3 V. Ang external reset circuit R6 C3 wala gigamit. Sa sample nga programa, ang frequency sa transmitter dili katumbas sa dili lisensyado nga range; ang 2,4 MHz range limitado sa mga frequency nga 2400.0-2483.5 MHz.

Ang sakup sa E01-ML01DP05 transmitter mao ang 2400-2525 MHz. Ang bandwidth sa usa ka channel mao ang 1 MHz, kung itakda ang katulin ingon "RF24_2MBPS" ang espesipikong radio.setChannel(120) channel ug ang sunod nga paga-okupar, i.e. ang banda mahimong 2 MHz.

Source: www.habr.com

Idugang sa usa ka comment