Lokaal autonoom gegevensverzamelingssysteem

Het bedrijf kocht NEKST-M-meetposten, in eigen land geproduceerd door Next Technologies. Om visualisatie van de werking van pompeenheden te garanderen,
brand- en beveiligingsalarmen, aanwezigheid van spanning bij starters, kamertemperatuur, noodwaterniveau. Het hart van NEKST-M is ATMEGA 1280 en dit feit is bemoedigend in termen van de mogelijkheid om uw eigen kit voor specifieke behoeften te creëren.

De taak was om in de kortst mogelijke tijd en tegen minimale kosten een volledig autonoom lokaal expeditiesysteem te creëren voor specifieke behoeften. De basis is een microcontroller. Ontwikkeling, productie, gecreëerd door het personeel zelf.

Het systeem moet werken zonder afhankelijkheid van mobiele netwerken, servers, internet en het licentiesysteem voor het gebruik van radiofrequentiebronnen, geen computers gebruiken bij de werking van het monitoring- en controlesysteem of hoogstens periodiek laptops gebruiken, zonder toegang tot objecten voor een lange tijd (6-9 maanden). De netwerkconfiguratie heeft een radiale structuur. Gegevens worden op een gegeven moment verzameld en vervolgens ter verwerking verzonden via reguliere communicatiekanalen of als hardcopy.

Het systeem moet voorzien in:

  • toezicht houden op de werking van pompeenheden
  • technologische automatisering
  • bescherming tegen de gevolgen van noodsituaties
  • noodsignalering
  • berekening van de bedrijfstijd
  • het berekenen van de hoeveelheid verbruikte elektriciteit
  • temperatuurregeling van apparatuur
  • beveiliging en brandalarm
  • periodieke registratie op afstand van informatie
  • onbekende toekomstige vereisten

Arbeidsvoorwaarden:

  • dekkingsgebied 1 vierkante kilometer.
  • directe zichtbaarheid tussen objecten
  • temperatuur van +50 tot -50 C
  • luchtvochtigheid tot 100%
  • biologisch actieve afzettingen (schimmels, sulfaatreducerende bacteriën)
  • trillingen, niet meer, van machines van klasse 1-2 volgens GOST ISO 10816-1-97
  • elektromagnetische omgeving - schakelen van elektromotoren met KT 6053-magneetschakelaars, RVS-DN softstartapparatuur, SIEMENS MICROMASTER PID-regelapparatuur, straling in het ISM- en GSM-bereik volgens de vereisten voor deze apparaten, handmatig booglassen ter plaatse
  • overmatige netwerkspanning, kortstondige onderbrekingen in de stroomvoorziening, overspanning door blikseminslag, fase-onbalans wanneer een bovenleidingsdraad breekt in 6-10 kV-distributienetwerken.

Ondanks zulke strenge eisen is de implementatie vrij eenvoudig bij het stap voor stap oplossen van het probleem.

Alles in aanmerking genomen, werd het “Arduino Nano 3.0” -bord het “brein” van het plan. Het robotdyn-bord beschikt over een ATMEGA 328-controller, die de benodigde 3,3V-spanningsstabilisator voor zorgt
stroom 800 mA en converter naar CH340G UART-USB.

Allereerst zijn er bedrijfsurentellers gemaakt die het meest up-to-date zijn. Eerder gebruikte industriële meters gemonteerd op PIC's met een transformatorloos voedingscircuit vielen uit vanwege spanningspieken binnen een jaar na gebruik. Alleen de apparaten die waren aangesloten via zelfgemaakte 5V-voedingen bleven intact. Om de installatie en de veelzijdigheid van de verbinding te versnellen, wordt een signaal over de status van de eenheden afkomstig van de klemmen van de schakelapparaten, d.w.z. registratie van de aanwezigheid van de 1e fase spanning bij een driefasige voeding van 380V. Voor coördinatie met de controller wordt een tussenrelais met een 220V-wikkeling of een optocoupler bestaande uit een LED en een GL5516-fotoresistor of een PC817-optocoupler gebruikt. Alle opties werden getest. De LED wordt gevoed door een gelijkgerichte spanning met stroombegrenzing met behulp van twee SVV22-condensatoren die zijn ontworpen voor een spanning van 630 V en in serie zijn geschakeld voor de veiligheid tijdens het onbedoeld testen van de circuits met een megohmmeter.
Uitlezen van de bedrijfstijd via het ST7735S LCD-scherm, real-time gegevensoverdracht via radio met behulp van de E01-ML01DP05-module met een frequentie van 2,4 MHz. Dit apparaat bevat de nRF24L01+ chip en de RFX2401C zend/ontvangstversterker,
uitgangsvermogen tot 100 mW. Spiraalvormige antennes ontworpen voor het gewenste bereik in de online calculator сайта. De keuze van het antennetype wordt bepaald door de uitsluiting van de ontvangst van enkelvoudig gereflecteerde golven van omringende metalen constructies. Antenneonderdelen worden geprint op een 3D-printer. De huidige status van de tellers wordt opgeslagen in de EEPROM van de controller zelf en wordt hersteld bij een onverwachte stroomuitval. Tijdsintervallen voor het tellen worden geleverd door de RTC-chip DS3231 in de vorm van een module met een back-upbatterij. De voeding maakt gebruik van 3 modules, de eigenlijke pulsbron 220/5V HLK-PM01 600mA, een converter van 1-5V naar 5V HW-553 и 03962A - batterijcontroller met schema bescherming tegen kortsluiting, overontlading en overbelasting. Alle componenten zijn gekocht op de AliExpress-website.

BroodplankLokaal autonoom gegevensverzamelingssysteem
4-kanaals teller. Er zijn LC-filters bij de ingangen om te beschermen tegen interferentie via een twisted pair-communicatielijn. Gegevens over de status van besturingsobjecten worden voortdurend één keer per seconde uitgelezen en in kleur weergegeven op het LCD-scherm. De meetwaarden worden elke 1 seconden bijgewerkt en opgeslagen in het niet-vluchtige geheugen. 36 seconden is 36/1 van een uur, dit is het formaat waarin de gegevens nodig zijn. Elke 100 sec. Er wordt informatie verzonden over het aantal bedrijfsseconden voor elke besturingseenheid. EEPROM-geheugen heeft volgens de fabrikant een beperkt aantal schrijf-wiscycli, namelijk 12 keer. De slechtste optie is wanneer ten minste één cel voortdurend wordt bijgewerkt. Het volume van de 100000e teller is 1 bytes, dit is een lang formaatnummer, 4 tellers, in totaal worden 4 bytes ingenomen door één record. De lengte van het geheugen van de chip is 16 bytes; na 1024 invoeren van 64 tellers begint de opname opnieuw. In de EEPROM-bibliotheek schrijft de EEPROM.put-methode niet; als de waarde van de cel en de informatie die wordt geschreven overeenkomen, zal er geen degradatie van de cellen plaatsvinden. Als gevolg hiervan zal de gegarandeerde gebruiksduur van het geheugen meer dan 4 jaar bedragen. De tijd van mogelijk maar niet gegarandeerd werk kan veel langer zijn.

SchakelschemaLokaal autonoom gegevensverzamelingssysteem
Programmeren in Arduino IDE//12 bytes (328%)

#erbij betrekken // Core grafische bibliotheek
#erbij betrekken // Hardwarespecifieke bibliotheek
#include
#erbij betrekken
#inclusief
#erbij betrekken
#erbij betrekken
RF24-radio(9, 10); // radioobject voor het werken met de RF24-bibliotheek,
// en pinnummers nRF24L01+ (CE, CSN)
#erbij betrekken
DS3231 rtc(SDA, SCL);
Tijd t;

//#define TFT_CS 10
#defineTFT_CS 8
#define TFT_RST -1 // je kunt dit ook verbinden met de Arduino-reset
// in dat geval stelt u deze #define-pin in op -1!
//#define TFT_DC 9 // DC=RS=A0 - aanduidingsopties voor het selecteren van een commando of dataregister.
#definieer TFT_DC 3

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

// Optie 2: gebruik alle pinnen, maar een beetje langzamer!
#define TFT_SCLK 13 // stel deze in op de pinnen die je leuk vindt!
#define TFT_MOSI 11 // stel deze in op welke pinnen je maar wilt!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#erbij betrekken

byteverschuiving = 52;
byte pinState;
niet-ondertekende lange pomp[4];// array met tellerwaarden van 4 seconden
vlotter m = 3600.0;
niet-ondertekend int-adres = 0;
int rc;// variabele voor tellers
niet-ondertekende lange sumprim = 0;
niet-ondertekende lange somsec = 0;
byte ik = 0;
byte k = 34;
niet-ondertekend int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // array voor het opslaan van objectstatussen, 1 - uit, 0 - aan.
int begin = 0; //

void setup () {

rtc.begin();
radio.begin(); // Start werkzaamheden nRF24L01+
radio.setChannel(120); // datakanaal (van 0 tot 127).
radio.setDataRate(RF24_250KBPS); // gegevensoverdrachtsnelheid (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // zendervermogen (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Open een pipe met een identificatie voor gegevensoverdracht

// Om de tijd in te stellen, verwijdert u de commentaartekens op de benodigde regels
//rtc.setDOW(1); // Dag van de week
//rtc.setTime(21, 20, 0); // Tijd, in 24-uursnotatie.
//rtc.setDate(29, 10, 2018); // Datum, 29 oktober 2018

tft.initR(INITR_BLACKTAB); // initialiseer een ST7735S-chip, zwart lipje
// Gebruik deze initializer (geen commentaar geven) als u een 1.44" TFT gebruikt
//tft.initR(INITR_144GREENTAB); // initialiseer een ST7735S-chip, ROOD rcB-tabblad
tft.setTextWrap(false); // Laat tekst over de rechterrand lopen
tft.setRotation( 2 ); // voor ZWARTE PCB en RODE tft.setRotation(0) of niet.
tft.fillScreen(ST7735_BLACK); // leeg scherm

DDRD = DDRD | B00000000;
POORTD = POORTD | B11110000; // softwareverscherping werkt, hoog niveau -
// gecontroleerde objecten “werken niet”, “4” wordt naar alle 1 senior poorten D geschreven, er vindt geen telling plaats.

voor (rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + shift); // weergave van positienummers van besturingsobjecten
tft.print(rc + 1);
}

tft.setCursor(12, 0); // voer 3 regels tekst uit
tft.println("ONTWIKKELAARS & BOUW"); // om jezelf geliefden te prijzen
tft.setCursor(24, 10); // of kwaadaardig auteursrecht
tft.print("ONTWIKKELAAR MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//data herstel////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) {// Itereert door alle cellen van de industrie
//en schrijft naar een array van 4 pompvariabelen, 4 bytes voor elke teller, omdat
// niet-ondertekende lange variabele. Er zijn 4 tellers, één record van alle 4 neemt 16 bytes in beslag.
EEPROM.get(z, pomp[0]); // dus, zonder de for-lus, minder volume
EEPROM.get(z+4, pomp[1]);
EEPROM.get(z+8, pomp[2]);
EEPROM.get(z+12, pomp[3]);

// een nieuwe volgende waarde toewijzen voor de som van 4 tellers
sumprim = (pomp [0] + pomp [1] + pomp [2] + pomp [3]);

// vergelijkt de nieuwe waarde van de som van 4 tellers in de sumprim-variabele met de vorige waarde in de variabele
// sumsec en als de vorige som kleiner is dan of gelijk is aan de nieuwe som, wordt de nieuwe groter of gelijk toegewezen
// somsec-waarde.

als ( somsec <= somprim ) {
somsec = somprim; //

//en de huidige waarde z wordt toegewezen aan de adresvariabele, z is het adres van het begin van een blok van 16 bytes met 4 waarden
// tellers die tegelijkertijd worden geregistreerd (aangezien bij het pollen van een poort alle 8 bits ervan tegelijkertijd worden geschreven,
// inclusief onze noodzakelijke hoge 4 bits van poort D).
adres = z;
}
}

// opnieuw toegang tot het eeprom-geheugen op het adres van het begin van een blok van 16 bytes met 4 geregistreerde tellerwaarden
// laatste, d.w.z. waarden voordat u afsluit of opnieuw opstart vanwege bevriezing. Het laatste opnemen
// tellerwaarden in een array van 4 variabelen pompen.

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

adres += 16; //het adres verhogen voor het schrijven van het volgende blok zonder de gegevens van het laatste record te overschrijven

//einde van gegevensherstel///////////////////////////////////////// / ///////////////////

AttachInterrupt(0, tellen, STIJGEND); // pin D2, schakel interrupts in, komen elke seconde
// pulsen van RTC DS3231 vanaf SQW-uitvoer

wdt_enable(WDTO_8S); // start de watchdog-timer, start de controller opnieuw op in geval van bevriezing, tijd,
// waarvoor u het timer-resetcommando wdt_reset( moet geven en opnieuw opstarten tijdens normaal gebruik moet vermijden - 8 sec.
// voor tests wordt het afgeraden om de waarde op minder dan 8 seconden in te stellen. In dit geval wordt de timer bij voorkeur gereset
// schokkend, en het gebeurt elke seconde.

}

leegte lus () {
// lege cyclus, hier is er controle over de open-fase-werking van de elektromotor
}

ongeldige telling() {

tft.setTextColor(ST7735_WHITE); // stel de kleur van het lettertype in
t = rtc.getTime(); // leestijd
tft.setCursor(5, 120); // de cursorpositie instellen
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // het tijduitvoergebied leegmaken
tft.print(rtc.getTimeStr()); // uitvoerklokmetingen

wdt_reset(); // reset de watchdog elke cyclus, d.w.z. elke seconde

for (rc = 0; rc < 4; rc ++) // begin van de cyclus voor het controleren van de conformiteit van de invoerstatus
// poortbits naar de vorige leesstatus van poort D-bits
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc]!= pinState) {// en als komt niet overeen, dan
pumrcounter[rc] = pinState; // de poortbitstatusvariabele een nieuwe waarde 1/0 toekennen
}
// indicatie van de status van kleurcontroleobjecten
// BLAUW is een klein probleempje met het bestaande scherm (of bibliotheek?), RGB en BGR zijn door elkaar gehaald.
als (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // voor tellen op laag niveau, verander GROEN in BLAUW
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // voor tellen op laag niveau, verander BLAUW in GROEN
pomp [rc] += 1; // voeg 1 seconde toe aan de bedrijfstijdteller
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // het weergavegebied voor de bedrijfstijd leegmaken
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // en datums

tft.setCursor(60, 120); // de cursorpositie instellen
tft.print(rtc.getDateStr()); // toon de datum op het LCD-scherm

for (rc = 0; rc < 4; rc ++) //output bedrijfsuren in geheel, tienden en
{
tft.setCursor ( 30, rc * 10 + shift ); // honderdsten van een uur met een schermverschuiving van 10 pixels omlaag
tft.println(pomp [rc] / m);
}

// schrijven van “ruwe” bedrijfsurenwaarden (in seconden) naar EEPROM /////////////////////////////

voor (rc = 0; rc < 4; rc++)
{
EEPROM.put(adres, pomp [rc]);
adres += groottevan(zwevend); // verhoog de schrijfadresvariabele
}
}

// verzend gegevens via het radiokanaal op basis van gegevens die aangeven hoeveel bytes moeten worden verzonden.
als ((k == 6 ) || (k == 18 ) || (k == 30 )) {

niet-ondertekende lange gegevens;

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

voor (ik = 0; ik <4; ik++) {
gegevens = pomp [i];
radio.write(&data, groottevan(data));
}
}
}

Een paar opmerkingen aan het eind. Het tellen gebeurt op een laag logisch niveau aan de ingangen.

Optrekweerstanden R2-R5 zijn 36 kOhm voor de optie met fotoweerstanden GL5516. In het geval van een fototransistor-optocoupler en relais, stel deze in op 4,7-5,1 kOhm. De Arduino Nano v3.0 bootloader werd vervangen door de Arduino Uno met behulp van de TL866A-programmeur voor de juiste werking van de watchdog-timer. De zekeringen zijn gecorrigeerd om te werken bij spanningen boven 4,3 V. Het externe resetcircuit R6 C3 werd niet gebruikt. In het voorbeeldprogramma komt de zenderfrequentie niet overeen met het niet-gelicentieerde bereik; het bereik van 2,4 MHz is beperkt tot frequenties 2400.0-2483.5 MHz.

Het bereik van de E01-ML01DP05 zender is 2400-2525 MHz. De bandbreedte van één kanaal is 1 MHz, bij het instellen van de snelheid op “RF24_2MBPS” zal het opgegeven radio.setChannel(120) kanaal en het volgende bezet zijn, d.w.z. de band zal 2 MHz zijn.

Bron: www.habr.com

Voeg een reactie