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
Kenyér deszka
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ördiagramm
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