Helyi autonóm adatgyűjtési rendszer

A cég megvásárolta a Next Technologies által belföldön gyártott NEKST-M mérőoszlopokat. A szivattyúegységek működésének megjelenítéséhez,
tűz- és biztonsági riasztó, feszültség jelenléte az indítóknál, szobahőmérséklet, szükségvízszint. A NEKST-M szíve az ATMEGA 1280, és ez a tény biztató abból a szempontból, hogy saját készletet készíthet egyedi igényekhez.

A feladat egy teljesen autonóm helyi diszpécserrendszer létrehozása volt a legrövidebb időn belül és minimális költséggel, egyedi igények kielégítésére. Az alap egy mikrokontroller. Fejlesztés, gyártás, a munkatársak maguk készítették.

A rendszernek mobilhálózatoktól, szerverektől, internettől és a rádiófrekvenciás erőforrások használatára vonatkozó engedélyezési rendszertől való függés nélkül kell működnie, a felügyeleti és vezérlőrendszer működése során nem szabad számítógépet, vagy legfeljebb időszakosan laptopot használni, hozzáférés nélkül tárgyakat hosszú ideig (6-9 hónapig). A hálózati konfiguráció radiális szerkezetű. Az adatokat egy ponton gyűjtik, majd rendszeres kommunikációs csatornákon vagy nyomtatott formában továbbítják feldolgozásra.

A rendszernek biztosítania kell:

  • a szivattyúegységek működésének felügyelete
  • technológiai automatizálás
  • védelem a vészhelyzetek következményei ellen
  • vészjelzés
  • üzemidő számítás
  • az elfogyasztott villamos energia mennyiségének kiszámítása
  • berendezés hőmérséklet szabályozása
  • biztonsági és tűzjelző
  • az információk időszakos távoli rögzítése
  • ismeretlen jövőbeli követelmények

Munkakörülmények:

  • lefedettség 1 négyzetkilométer.
  • közvetlen láthatóság az objektumok között
  • hőmérséklet +50 és -50 C között
  • páratartalom akár 100%
  • biológiailag aktív lerakódások (penész, szulfátredukáló baktériumok)
  • vibráció, nem több, 1-2 osztályú gépeknél a GOST ISO 10816-1-97 szerint
  • elektromágneses környezet - villanymotorok kapcsolása KT 6053 kontaktorokkal, RVS-DN lágyindító berendezés, SIEMENS MICROMASTER PID vezérlő berendezés, sugárzás az ISM és GSM tartományban ezen eszközök követelményeinek megfelelően, kézi ívhegesztés a helyszínen
  • túlzott hálózati feszültség, rövid ideig tartó áramkimaradások, villám túlfeszültségek, fáziskiegyensúlyozatlanság, amikor egy felsővezeték vezeték szakad a 6-10 kV-os elosztó hálózatokban.

Az ilyen szigorú követelmények ellenére a megvalósítás meglehetősen egyszerű, ha lépésről lépésre megoldja a problémát.

Mindent figyelembe véve az „Arduino Nano 3.0” tábla lett a terv „agya”. A robotdyn kártya ATMEGA 328 vezérlővel, a szükséges 3,3 V-os feszültségstabilizátorral rendelkezik
áramerősség 800 mA és átalakító CH340G UART-USB-re.

Mindenekelőtt az üzemóra számlálók készültek, mint a legkorszerűbbek. A korábban használt, PIC-re szerelt, transzformátor nélküli tápáramkörrel szerelt ipari fogyasztásmérők egy éven belüli feszültséglökések miatt meghibásodtak. Csak azok maradtak sértetlenek, amelyek házi készítésű 5 V-os tápegységekkel voltak csatlakoztatva. A telepítés felgyorsítása és a csatlakoztatás sokoldalúsága érdekében a kapcsolókészülékek kapcsairól jelet vesznek az egységek állapotáról, pl. az 1. fázis feszültség meglétének regisztrálása 380 V-os háromfázisú tápegységgel. A vezérlővel való koordinációhoz egy közbenső relét 220 V-os tekercseléssel vagy egy LED-ből és egy GL5516 fényellenállásból vagy egy PC817 optocsatolóból álló optocsatolót használnak. Minden opciót teszteltek. A LED egyenirányított feszültséggel, áramkorlátozással működik, két 22 V-os feszültségre tervezett SVV630 kondenzátorral, amelyek sorba vannak kötve az áramkörök megaohmméterrel történő véletlenszerű tesztelésekor.
Működési idő leolvasása ST7735S LCD képernyővel, valós idejű adatátvitel rádión az E01-ML01DP05 modullal 2,4 MHz frekvencián. Ez az eszköz tartalmazza az nRF24L01+ chipet és az RFX2401C adó/vevő erősítőt,
kimeneti teljesítmény 100 mW-ig. Az online számológépben a kívánt tartományra tervezett spirális antennák hely. Az antenna típusának megválasztását az határozza meg, hogy kizárják az egyszeresen visszavert hullámok vételét a környező fémszerkezetekről. Az antenna alkatrészeit 3D nyomtatón nyomtatják ki. A számlálók aktuális állapotát magának a vezérlőnek az EEPROM-ja tárolja, és váratlan áramszünet esetén visszaáll. A számlálás időintervallumát a DS3231 RTC chip biztosítja egy tartalék akkumulátorral ellátott modul formájában. A tápegység 3 modult használ, a tényleges impulzusforrás 220/5V HLK-PM01 600mA, átalakító 1-5V-ról 5V-ra HW-553 и 03962A - akkumulátor vezérlővel rendszer rövidzárlat, túlkisülés és túltöltés elleni védelem. Minden alkatrészt az Aliexpress webhelyén vásároltak.

Kenyér deszkaHelyi autonóm adatgyűjtési rendszer
4 csatornás számláló. A bemeneteken LC szűrők vannak, amelyek védelmet nyújtanak a csavart érpárú kommunikációs vonalon keresztüli interferencia ellen. A vezérlőobjektumok állapotára vonatkozó adatok folyamatosan másodpercenként egyszer olvashatók, és színesen jelennek meg az LCD-n. A mért értékek 1 másodpercenként frissülnek és rögzítésre kerülnek a nem felejtő memóriában. A 36 másodperc az óra 36/1 része, ebben a formátumban kell megadni az adatokat. 100 másodpercenként. információ továbbításra kerül az egyes vezérlőegységek működési másodperceinek számáról. Az EEPROM memória korlátozott számú írási-törlési ciklussal rendelkezik, a gyártó szerint 12 100000 alkalommal. A legrosszabb megoldás az, ha legalább egy cellát folyamatosan frissítenek. Az 1. számláló térfogata 4 bájt, ez egy hosszú formátumszám, 4 számláló, összesen 16 bájtot foglal el egy rekord. A chip memóriájának hossza 1024 bájt, 64 számláló 4 bevitele után kezdődik elölről a rögzítés. Az EEPROM könyvtárban az EEPROM.put metódus nem ír, ha a cella értéke és az írandó információ egyezik, a cellák nem romlanak. Ennek eredményeként a memória garantált működési ideje több mint 7 év lesz. A lehetséges, de nem garantált munkavégzés ideje sokkal hosszabb lehet.

KördiagrammHelyi autonóm adatgyűjtési rendszer
Program Arduino IDE-ben//12 328 bájt (38%)

#beleértve // Grafikus alapkönyvtár
#beleértve // Hardver-specifikus könyvtár
#include
#beleértve
#include
#beleértve
#beleértve
RF24 rádió(9, 10); // rádióobjektum az RF24 könyvtár használatához,
// és PIN-számok nRF24L01+ (CE, CSN)
#beleértve
DS3231 rtc (SDA, SCL);
Idő t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // ezt is csatlakoztathatod az Arduino resethez
// ebben az esetben állítsd ezt a #define PIN-t -1-re!
//#define TFT_DC 9 // DC=RS=A0 - kijelölési lehetőségek egy parancs vagy adatregiszter kiválasztásához.
#define TFT_DC 3

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

// 2. lehetőség: használjon bármilyen tűt, de kicsit lassabban!
#define TFT_SCLK 13 // Állítsd be, hogy tetszőleges tűk legyenek!
#define TFT_MOSI 11 // Állítsd be ezeket olyan tűkre, amilyennek tetszik!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#beleértve

bájteltolás = 52;
bájt pinState;
előjel nélküli hosszú pumpa[4];// tömb 4 másodperces számlálóértékekkel
úszó m = 3600.0;
unsigned int address = 0;
int rc;// változó a számlálók számára
előjel nélküli hosszú suprim = 0;
előjel nélküli hosszú összegek = 0;
bájt i = 0;
k bájt = 34;
előjel nélküli int z = 0;
b bájt = B00000001;
byte pumrcounter[4]; // objektumállapotok tárolására szolgáló tömb, 1 - ki, 0 - be.
int start = 0; //

void setup () {

rtc.begin();
rádió.begin(); // Munka megkezdése nRF24L01+
radio.setChannel(120); // adatcsatorna (0-tól 127-ig).
radio.setDataRate(RF24_250KBPS); // adatátviteli sebesség (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // adóteljesítmény (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
rádió.openWritingPipe(0xAABBCCDD11LL); // Nyisson egy csövet adatátvitelhez azonosítóval

// Az idő beállításához törölje a megjegyzéseket a szükséges sorokból
//rtc.setDOW(1); // A hét napja
//rtc.setTime(21, 20, 0); // Idő, 24 órás formátumban.
//rtc.setDate(29, 10, 2018); // Dátum, 29. október 2018

tft.initR(INITR_BLACKTAB); // ST7735S chip inicializálása, fekete fül
// Használja ezt az inicializálót (komment nélkül), ha 1.44"-es TFT-t használ
//tft.initR(INITR_144GREENAB); // ST7735S chip inicializálása, PIROS rcB lap
tft.setTextWrap(false); // Lehetővé teszi, hogy a szöveg a jobb szélről lefusson
tft.setRotation( 2 ); // BLACK PCB és RED tft.setRotation(0) esetén vagy sem.
tft.fillScreen(ST7735_BLACK); // képernyő törlése

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // a szoftveres szigorítás működik, magas szintű -
// vezérelt objektumok „nem működnek”, „4” van írva mind a 1 fő D portra, nem történik számlálás.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // a vezérlőobjektumok pozíciószámainak megjelenítése
tft.print(rc + 1);
}

tft.setCursor(12, 0); // 3 sornyi szöveget ad ki
tft.println("FEJLESZTŐK ÉS ÉPÍTÉS"); // hogy dicsérd magad szeretteid
tft.setCursor(24, 10); // vagy gonosz szerzői jog
tft.print("FEJLESZTŐ MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//adat visszanyerés////////////////////////////////////////////// ///////////

for (z = 0; z < 1023; z += 16 ) { // Iterál az iparág összes celláján
//és 4 pumpás változóból álló tömbbe ír, minden számlálóhoz 4 bájt, mert
// előjel nélküli hosszú változó. 4 számláló van, mind a 4 egyik rekordja 16 bájtot vesz igénybe.
EEPROM.get(z, pump[0]); // tehát a for ciklus nélkül kevesebb hangerő
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// új következő érték hozzárendelése 4 számláló összegéhez
sumpprim = (szivattyú [0] + szivattyú [1] + szivattyú [2] + szivattyú [3]);

// összehasonlítja a sumprim változóban lévő 4 számláló összegének új értékét a változó előző értékével
// summec és ha az előző összeg kisebb vagy egyenlő, mint az új összeg, akkor az új nagyobb vagy egyenlő összeg kerül hozzárendelésre
// summec érték.

if ( summec <= sumprim ) {
szumsec = sumprim; //

//és az aktuális z érték a címváltozóhoz van rendelve, z pedig egy 16 bájtos 4 értékű blokk elejének címe
// egyidejűleg rögzített számlálók (mivel egy port lekérdezésekor annak mind a 8 bitje egyszerre íródik,
// beleértve a D port szükséges magas 4 bitjét).
cím = z;
}
}

// ismét elérjük az eeprom memóriát egy 16 bájtos 4 rögzített számlálóértékből álló blokk elejének címén
// utolsó, azaz leállás vagy lefagyás miatti újraindítás előtti értékek. A legújabb felvétele
// számláló értékeket egy 4 változóból álló tömbbe pumpálja.

EEPROM.get(cím, pumpa[0]);
EEPROM.get(cím + 4, pumpa[1]);
EEPROM.get(cím + 8, pumpa[2]);
EEPROM.get(cím + 12, pumpa[3]);

cím += 16; //a következő blokk írásához szükséges cím növelése az utolsó rekord adatainak felülírása nélkül

//adat-helyreállítás vége/////////////////////////////////////////// //////////////////

attachInterrupt(0, count, RISING); // D2 pin, engedélyezze a megszakításokat, másodpercenként jön
// impulzusok az RTC DS3231-ről az SQW kimenetről

wdt_enable(WDTO_8S); // indítsa el a watchdog időzítőt, indítsa újra a vezérlőt lefagyás, idő,
// amihez ki kell adni a wdt_reset( timer reset parancsot, és el kell kerülni az újraindítást normál működés közben - 8 mp.
// teszteknél nem ajánlatos az értéket 8 másodpercnél rövidebbre állítani, ilyenkor az időzítőt lehetőleg nullázzuk
// rángatózik, és ez minden másodpercben megtörténik.

}

void loop () {
// üres ciklus, itt lesz a villanymotor nyitott fázisú működése vezérlése
}

void count() {

tft.setTextColor(ST7735_WHITE); // állítsa be a betűszínt
t = rtc.getTime(); // olvasási idő
tft.setCursor(5, 120); // a kurzor pozíciójának beállítása
tft.fillRect(5; 120; 50; 7; ST7735_FEKETE); // az időkimeneti terület törlése
tft.print(rtc.getTimeStr()); // kimeneti órajelek

wdt_reset(); // a watchdog alaphelyzetbe állítása minden ciklusban, azaz másodpercben

for (rc = 0; rc < 4; rc ++) // a bemeneti állapot megfelelőségének ellenőrzésére szolgáló ciklus eleje
// a biteket a D port bitek előző olvasási állapotába portolja
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // és ha nem egyezik, akkor
pumrcounter[rc] = pinState; // a port bit állapotváltozójának új értéket adva 1/0
}
// a színvezérlő objektumok állapotának jelzése
// A KÉK a meglévő képernyő (vagy könyvtár?) kis hibája, az RGB és a BGR összekeveredett.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // az alacsony szintű számláláshoz állítsa a ZÖLDET KÉKRE
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // az alacsony szintű számláláshoz változtassa a KÉK-et ZÖLD-re
szivattyú [rc] += 1; // adjunk hozzá 1 másodpercet a működési idő számlálójához
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_FEKETE); // a működési idő kijelzési területének törlése
tft.fillRect(60, 120, 73, 7, ST7735_FEKETE); // és dátumok

tft.setCursor(60, 120); // a kurzor pozíciójának beállítása
tft.print(rtc.getDateStr()); // a dátum megjelenítése az LCD képernyőn

for (rc = 0; rc < 4; rc ++) //kimeneti üzemóra teljes, tized és
{
tft.setCursor ( 30, rc * 10 + shift ); // század óra 10 képpontos képernyőeltolással
tft.println(szivattyú [rc] / m);
}

// „nyers” üzemóra értékek írása (másodpercben) EEPROM-ba //////////////////////////////

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(cím, szivattyú [rc]);
cím += sizeof(float); // az írási cím változó növelése
}
}

// adatokat küld a rádiócsatornán keresztül azokból az adatokból, amelyek jelzik, hogy hány bájtot kell küldeni.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

aláírás nélküli hosszú adatok;

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

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

Néhány megjegyzés a végére. A számlálás alacsony logikai szinten történik a bemeneteken.

Az R2-R5 felhúzási ellenállások 36 kOhm a GL5516 fotoellenállással rendelkező opciónál. Fototranzisztoros optocsatoló és relé esetén 4,7-5,1 kOhm-ra kell beállítani. Az Arduino Nano v3.0 rendszerbetöltőt az Arduino Uno-ra cserélték, a TL866A programozó segítségével a watchdog időzítő helyes működése érdekében. A biztosítékok 4,3 V feletti feszültségen működnek. Az R6 C3 külső visszaállító áramkört nem használták. A mintaprogramban az adófrekvencia nem felel meg az engedély nélküli tartománynak, a 2,4 MHz-es tartomány a 2400.0-2483.5 MHz-es frekvenciákra korlátozódik.

Az E01-ML01DP05 adó hatótávolsága 2400-2525 MHz. Egy csatorna sávszélessége 1 MHz, „RF24_2MBPS” sebesség beállításánál a megadott radio.setChannel(120) csatorna és a következő foglalt lesz, pl. a sáv 2 MHz lesz.

Forrás: will.com

Hozzászólás