Innholdsfortegnelse:

SilverLight: Arduino -basert miljømonitor for serverrom: 3 trinn (med bilder)
SilverLight: Arduino -basert miljømonitor for serverrom: 3 trinn (med bilder)

Video: SilverLight: Arduino -basert miljømonitor for serverrom: 3 trinn (med bilder)

Video: SilverLight: Arduino -basert miljømonitor for serverrom: 3 trinn (med bilder)
Video: Нагорнюк К. Обработка и визуализация изображений в веб приложениях 2024, November
Anonim
SilverLight: Arduino -basert miljømonitor for serverrom
SilverLight: Arduino -basert miljømonitor for serverrom
SilverLight: Arduino -basert miljømonitor for serverrom
SilverLight: Arduino -basert miljømonitor for serverrom
SilverLight: Arduino -basert miljømonitor for serverrom
SilverLight: Arduino -basert miljømonitor for serverrom
SilverLight: Arduino -basert miljømonitor for serverrom
SilverLight: Arduino -basert miljømonitor for serverrom

En gang fikk jeg i oppgave å lete etter en miljøprobe for å overvåke temperaturen i serverrommet til firmaet mitt. Min første idé var: hvorfor ikke bare bruke en Raspberry PI og en DHT -sensor, den kan konfigureres på mindre enn en time inkludert OS -installasjonen. For dette fikk jeg den kalde responsen fra sjefete med bind for øynene at vi ikke vil gjøre det fordi det ville koste mer i arbeidstid å sette det opp enn å kjøpe en enhet. Å måtte akseptere trange mennesker slik som dette i en del av livet mitt var en ting, og jeg bestilte EATON -søppel av enterprise grade fra Ebay og ring det, men jeg bestemte meg for det øyeblikket at jeg for mitt eget serverrom skal bygge en helt åpen kildekode Arduino basert enhet som vil være mye bedre enn det jeg nettopp bestilte.

Dette prosjektet er kodenavnet SilverLight, ikke spør meg hvor jeg får disse navnene fra:) Jeg så bare på den skinnende halv akrylboksen og bestemte meg for dette navnet, det har ingenting å gjøre med mikrohoof -produktet hva jeg fant ut om etter.

Trinn 1: Maskinvaredesign

Maskinvaredesign
Maskinvaredesign
Maskinvaredesign
Maskinvaredesign
Maskinvaredesign
Maskinvaredesign

Kommersiell maskinvareoversikt.

Ok, så jeg kommer ikke engang i gang med hvis gode idé var å sette en miljømonitor inne i en ups, men det er åpenbart et marked for det, så la oss se hva disse kan gjøre:

Miljøovervåkingsenhet KOMPATIBILITET

10/100Mb Network-MS, PXGUPS, PXGPDP og PXGMS.

10/100Mb ConnectUPS-X, ConnectUPS-BD og ConnectUPS-E med FW V3.01 og høyere. DIMENSJONER (LXWXH)

2,26 x 1,48 x 1,15 (tommer) 57,6 x 37,6 x 29,3 (mm) VEKT

1,19 oz (34 g)

Det er veldig nyttig informasjon, ikke sant? Ingen bekymringer, for de kan ikke gjøre så mye. For å komme i gang må UPS-en ha et annet dyrt tilleggskort for dette som kobler dette til miljøsensoren du kjøper separat, vanligvis med standard CAT5-kabel (ikke engang prøve å koble noe til den porten fordi det ikke er noe standard om det). De hevder at enheten trenger 10 minutter for å "varme opp" at det i virkeligheten var timer, og når den først gjorde det, dukket den opp i java -grensesnittet som sakte oppdateres, og vi har temperatur og fuktighet. Det var enkelt å sette opp varslingsbaserte forhold fra dette punktet, men hvem bryr seg, la oss bygge noe bedre.

Dette prosjektet er en samling av flere av mine prosjekter: Natalia værstasjon, Shadow of Phoenix. Boksen er i stand til å overvåke følgende miljøbegrensninger:

  • Temperatur/fuktighet/varmeindeks
  • LPG, røyk, alkohol, propan, hydrogen, metan og karbonmonoksidkonsentrasjoner i luften (MQ2)
  • Solfølsomhet (lyser lyset i serverrommet?)
  • Motion PIR -sensor (du kan til og med slå lysene av/på automatisk fra nå av takket være bevegelsessensoren når noen kommer inn i rommet)

Alle disse dataene ble pent vist på en LCD -skjerm mens de også ble videresendt til en datamaskin (Orange PI Zero) for videre behandling og varsler. Selv om det ville være mulig å koble digitale sensorer som DHT og den digitale pinnen til MQ2 direkte til OrangePI, foretrekker jeg alltid å bruke dedikerte mikroer for disse oppgavene, og når du også må oppdatere LCD -skjermen og gjøre andre lave nivåer ting Arduino er bare uslåelig og kan kjøre på en pålitelig måte i mange år (faktisk har ikke en eneste Arduino som kjører 24/7 mislyktes på meg ennå). OrangePI med sine mangler (la oss innse det er en 10 $ datamaskin) som ubrukelig for stor arbeidsmengde, ingen bsd -støtte, integrert wifi er oppblåst osv. Kan lett håndtere liten arbeidsbelastning som å ta sensoravlesninger gjennom seriell (USB) og behandle dem.

Dette er en veldig enkel prosjektmaskinvare som krever følgende komponenter:

  • Arduino PRO Micro
  • LCD -skjerm 2x16 tegn RGB
  • AC-DC isolerende bryter strømmodul 220V til 5V HLK-5M05 (disse er veldig gode for Arduino/ESP-prosjekter), dette er 5V/5W-versjonen!
  • 2x300ohm motstander
  • 2xleds (rød/grønn)
  • PIR bevegelsessensor
  • MQ2 sensor
  • DHT22
  • LDR
  • 2X10Kohm motstand
  • Summer
  • Oransje PI Zero
  • mini USB -datakabel

Jeg gadd ikke engang lage en PCB for dette, bare brukte vanlig brødbrett fordi komponentene enkelt kan kobles til Arduino (se bilder vedlagt):

-DHT22 krever en 10K pullup til VCC (digital)

-LDR vil kreve en nedtrekning på 10K til GND (analog)

-MQ2 kan kobles direkte til en hvilken som helst analog pin (analog) <foretrekker å bruke analog fordi hvorfor ikke når vi har en MCU med analoge pinner hvor vi kan få den nøyaktige verdien i stedet for å justere en gryte på baksiden av enheten for å få HIGH eller LOW out of it, på grunn av limingen i designet mitt som uansett er utilgjengelig. Sjekk:

-PIR kan kobles direkte til hvilken som helst pin (digital)

-LCD: kan drives med 4 pinner, kan kobles til hvilken som helst pinne (digital) trenger +2 RS/E (digital)

-Buzzer: kan kobles direkte til alle Arduino -pinner (digital)

Pinout jeg brukte, kan sees i koden. Å koble alt sammen etter at dette er ganske rett frem, du kan også gjøre dem en etter en, sørg for at 1 sensor fungerer perfekt, og fortsett til den neste, alt du kan få feil er ved en feil å koble ledninger til feil steder (f.eks bytte vcc /gnd for en sensor, så langt har dette aldri drept noen av enhetene mine). Det jeg vil merke her at det var for mange VCC- og GND -er stablet opp for meg, jeg kunne ikke klemme dem gjennom en terminalstripe, så jeg loddet dem alle.

Også om DHT -ene, ikke glem fra mine andre prosjekter: hvis du setter DHT -biblioteket i koden din og DHT -sensoren ikke er tilkoblet eller feil DHT -tilkoblet (f.eks. 11 definert i kode bruker du 22) som kan føre til programmet å henge for alltid i starten.

Om PIR -bevegelsessensorene, som du kan se på bildet mitt, er det tonnevis av falske forfalskninger av disse, faktisk ville jeg til og med synes det var vanskelig å kjøpe en ekte fra Ebay. Falsene fungerer like bra, selv på lang sikt, men de har kretsen speilet som gjør at + og - pinnene reverseres, også disse er enkle å kjenne igjen fra: kommer med blå PCB ikke den vanlige grønne, mangler etikettene for pottemålerne. Jeg var heldig som fant en ekte i esken min, ellers ville posisjonen dekke de 2 lysdiodene for meg. Jeg har funnet ut at begge grytene vevd til midtveis fungerer for meg. Dette vil gi deg lang nok rekkevidde til å føle også når det er bevegelse, vil det digitale benet holdes i HØY posisjon i omtrent et minutt, slik at du ikke trenger å gjøre opp i koden for dette. På forfalskninger er det lett å bestemme hvilken side som er - og + bare se på de tilsvarende benene for de elektrolytiske hettene som er koblet til pinnene.

For å kutte boksen brukte jeg diamant dremelhode (som var en overkill, men fungerte bra) og vanlig boremaskin. Disse koblingsboksene er enkle å jobbe med, og selv om jeg ikke liker liming, hadde jeg ikke skruer og bolter for hånden da jeg bygde dette, så jeg tok forhandlingen om å lime ting sammen (som også lett kan varmes opp og skilles fra hverandre senere ved å bruke samme limpistol uten filament i den).

Trinn 2: Programvaredesign

Programvare design
Programvare design
Programvare design
Programvare design

Arduino -koden er også enkel, den trekker i utgangspunktet alle sensoravlesningene i begynnelsen av hver sløyfe. Slår på lysdiodene hvis det er bevegelse eller røyk og spiller også en alarmlyd på summeren hvis det er røyk (dette er den eneste blokkeringskoden, så jeg gjorde den kort), viser deretter dataene på LCD -skjermen og sender den til slutt over PCen med en 10 sekunders ventetid, for ikke å oversvømme havnen.

Dette prosjektet bruker enveiskommunikasjon fra Arduino-> OrangePI, det er ingen kommandoer av noen art implementert. Selv om dette ville være fullt mulig å gjøre det slik jeg gjorde det i et av mine andre prosjekter der datamaskinen kan sende LCD_PRINT1 eller LCD_PRINT2 for å overskrive en linje på LCD -skjermen med sin egen melding (f.eks. Ip -adresse, oppetid, systemdato, cpu -bruk), er skjermområdet så lite for å vise data fra 3 sensorer at jeg ikke engang brydde meg. SOL- og SMK-verdiene kan begge gå opp til 4 sifre 0000-1023 og tar allerede opp 8 verdifulle tegn på skjermen.

Med LCD -skjermen kan du legge merke til et lite triks i koden om at etter hver måleverdi blir det skrevet ut et hvitt mellomrom (""), så flytter jeg markøren til faste posisjoner for å plassere de nye ikonene og dataene. Disse er der fordi LCD -skjermen ikke er så smart å forstå tall, den trekker bare hva den får, og for eksempel hvis du hadde en solverdi på 525 som plutselig gikk ned til 3, vil den vise 325 og forlate det gamle søppelet på skjermen der.

En C -kontrollkode som kjører på OrangePI og logger miljødataene og sender e -postvarsler når det er nødvendig.

OrangePI kjører Armbian (som i skrivende stund er basert på Debian Stretch). Jeg vil inkludere dette i programvaredelen angående at det var et problem hva det løste. Her er gjennomsnittlig strømforbruk for enheten:

0,17 A - bare Arduino + sensorer

0.5-0.62 A - OrangePI -oppstart

0,31 A - Oransje PI i tomgang

0.29 A - Oransje PI slått av (kan ikke slå den av, den har ikke ACPI eller noe sånt)

0,60 A - Stresstest 100% CPU -bruk på 4 kjerner

Jeg har hatt denne OrangePI i en eske siden lenge. Med den gamle kjernen tappet enheten så mye strøm (som måleren sa toppet rundt 0,63 A) det han PSU sannsynligvis ikke kunne gi at den rett og slett ikke startet opp, oppstartsprosessen satt fast og jeg fikk de to ethernet -lysene til å lyse opp konstant og gjør ingenting.

Nå er dette litt irriterende, ettersom HLK-5M05 hevder at det kan gjøre 5W på 5V, noe som gjør at det er i stand til å gi 1 ampere, men med disse enhetene som kommer ut av Kina, vet du aldri, 0,63 A-toppen var langt lavere enn den nominelle maks. verdi. Så jeg kjørte ned enkle omstartstester, fra 10 omstarter ville OrangePI bare starte opp to ganger vellykket, noe som nesten gjorde at jeg kastet det ut av prosjektet siden jeg ikke liker buggy inkonsekvent oppførsel i kretser. Så jeg begynte å google rundt, kanskje det er en måte å senke strømforbruket ved oppstart fra programvare (siden det bare var et problem da) og fant en artikkel som snakket om justering av script.bin, men det var for Orange PI PC og filer manglet fra lagringen, så uansett som en siste utvei har jeg gjort den magiske "passende oppgraderingen" for å oppgradere fastvaren, kjernen og alt annet, i håp om at det vil tømme mindre og enheten kan starte opp og:

Linux silverlight 4.14.18-sunxi #24 SMP fre 9. februar 16:24:32 CET 2018 armv7l GNU/Linux

Linux silverlight 4.19.62-sunxi #5.92 SMP ons 31. juli 22:07:23 CEST 2019 armv7l GNU/Linux

Det funket! Å kaste maskinvare til et programvareproblem er vanligvis de late java -utviklerne som skal gå, men i dette tilfellet har vi løst et maskinvareproblem med programvare, en stor suksess. Jeg har gjort som 20 flere omstartstester, enheten startet hver eneste sak. Jeg vil fortsatt legge merke til at strømbølgen fra å slå på Opi (koble/koble fra) er så stor at den vil tilbakestille Arduino til enhver tid (en enkel omstart vil bare flimre på LCD -skjermen, men forårsaker ingen flere problemer), men dette problemet gjenstår skjult siden de 2 vil starte opp sammen.

Jeg har også sett på kjernemodulene:

usb_f_acm u_serial g_serial libcomposite xradio_wlan mac80211 lima sun8i_codec_analog snd_soc_simple_card gpu_sched sun8i_adda_pr_regmap sun4i_i2s snd_soc_simple_card_utils TTM sun4i_gpadc_iio snd_soc_core cfg80211 snd_pcm_dmaengine industrialio snd_pcm snd_timer snd sun8i_ths soundcore cpufreq_dt uio_pdrv_genirq uio thermal_sys pwrseq_simple

Hva trenger vi egentlig av disse? Ok pwr og termisk kan være nyttig, men lyd, seriell port, wifi (ødelagt hw allerede) vi trenger ikke at alle disse kan bli svartelistet. Jeg vil også lage en tilpasset kjerne med bare de nødvendige modulene senere.

Det vi trenger, og som ikke er lastet inn som standard, er CDC ACM for å kommunisere med Arduino, aktivere den med:

ekko "cdc-acm" >> /etc /modules

Etter dette kan du allerede teste forbindelsen med:

skjerm /dev /ttyACM0 9600

Du bør se statusdataene bli sendt hvert 10. sekund.

Varsler og overvåking

Når det gjelder varsler, legger jeg bare inn system () -anrop i C -kontrollkoden som mottar dataene fra seriell, så det er ikke nødvendig med eksterne verktøy. Noen eksempelvarsler:

- Temperaturen går over 30 C

- Fuktigheten går over 70 % (ikke sunt for serverne)

- Bevegelse oppdaget i rommet (dette kan være irriterende hvis du fortsetter i serverrommet)

- Røyk eller gass oppdaget (varsler over 100 kan tas på alvor, jeg har lekt med denne sensoren og den slås på for mange ting, for eksempel skapte røyk ved siden av sensoren med loddejern litt over 50 mens røyking neste o den toppet opp til 500, den oppdaget til og med gass fra vanlig deodorant langt unna)

For å beholde historiske data, gadd jeg ikke å utvikle et verktøy, for hvorfor å finne opp hjulet på nytt når vi fikk gode overvåkingsrammer der ute. Jeg vil vise et eksempel på hvordan jeg kan integrere dette i min personlige favoritt, Zabbix:

apt-get installere zabbix-agent

Legg til på slutten av: /etc/zabbix/zabbix_agentd.conf

UserParameter = silverlight.hum, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 1}'

UserParameter = silverlight.tmp, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 2}' UserParameter = silverlight.sol, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 4}' UserParameter = silverlight.mot, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 5}' UserParameter = silverlight.smk, head -1 /dev/shm/silverlight-zbx.log | awk -F "," '{print $ 6}'

Å kjøre zabbix_agentd -p skal nå returnere de riktige verdiene:

silverlight.hum [t | 41]

silverlight.tmp [t | 23] silverlight.sol [t | 144] silverlight.mot [t | 0] silverlight.smk [t | 19]

Varmeindeksen, jeg samler den, men ser ingen praktisk bruk av den, så den blir bare logget. I C -kontrollkoden har jeg implementert 2 loggfunksjoner, den første logger alle dataene i brukervennlig format:

[SILVERLIGHT] Data mottatt 2019-09-10 23:36:08 => Fuktighet: 44, Temp: 22, Hei: 25, Solar: 0, Bevegelse: 0, Røyk: 21

[SILVERLIGHT] Data mottatt 2019-09-10 23:36:18 => Fuktighet: 44, Temp: 22, Hei: 25, Sol: 0, Bevegelse: 0, Røyk: 21 [SILVERLIGHT] Data mottatt 2019-09 -10 23:36:29 => Fuktighet: 44, Temp: 22, Hei: 25, Sol: 0, Bevegelse: 0, Røyk: 22 [SILVERLIGHT] Data mottatt 2019-09-10 23:36:39 => Fuktighet: 44, Temp: 22, Hei: 25, Solar: 0, Bevegelse: 0, Røyk: 21

Den andre:

void logger2 (char *text) {

FIL *f = fopen ("/dev/shm/silverlight-zbx.log", "w"); if (f == NULL) {printf ("Feil ved åpning av minneloggfil! / n"); komme tilbake; } fprintf (f, "%s", tekst); fclose (f); komme tilbake; }

Dette vil sette en 1 liner logg i minnet (eliminere unødvendige rw -operasjoner på sdkortet) som alltid vil bli overskrevet neste gang. Denne loggen vil bare inneholde de 6 datakolonnene og ingen tidsstempel, den er lett lesbar for Zabbix.

Som en siste bonus: hvordan du programmerer Arduino direkte fra OrangePI, slik at du ikke trenger å gå opp til enheten hver gang og koble til den bærbare datamaskinen.

Det er 2 måter:

-Enkel måte: Installer full Arduino IDE og biblioteker bruker et eksternt skrivebord som X11 med videresending, Xrdp, Xvnc, Nxserver osv.

-Hard way: Installer Arduino IDE og bruk kommandolinjen

Vi kommer til å gjøre den harde måten denne gangen siden jeg ikke er glad i å installere X11 på servere. For dette trenger du 6 komponenter:

1, Arduino IDE for ARM 32 bit ->

2, Python serial-> apt-get install python-serial

3, Arduino Makefile -prosjekt -> git -klon

4, DHT -bibliotek

5, Sparkfun -borddefinisjoner

6, SilverLight.ino, hovedkode

For å gjøre det enklere har jeg samlet filene som trengs for de siste 4 punktene (sketchbook.tgz), så du trenger bare de to første

Først er det best å opprette en vanlig bruker som har rw -tilgang til USB -porten:

adduser sølv

usermod -a -G dialout sølv

SCP sketchbook.tgz til enheten i den nyopprettede brukerens hjemmekatalog og trekk den ut der:

cd /hjem /sølv

tjære xvzf skissebok.tgz

For å forstå litt hva som skjer under hetten når du bruker den grafiske IDE:

Byggearbeidsflyten for å bygge en Arduino -skisse ved bruk av Arduino IDE er beskrevet på Arduino -nettstedet https://www.arduino.cc/en/Hacking/BuildProcess og mer detaljert her: https://www.arduino.cc/ no/Hacking/BuildProcess

Vanligvis er standard Arduino byggeprosess:

Kombiner.ino -filer til hovedskissefilen. Transformasjon av hovedskissefilen: legg til #include -setningen; lage funksjonserklæringer (prototyper) av alle funksjonene i hovedskissefilen; legg til innholdet i main.cxx -filen til målet til hovedskissefilen. Kompiler koden til objektfiler. Koble objektfilene til en.hex -fil som er klar til å laste den opp til Arduino.

Det er noen små forskjeller mellom Arduino standard byggeprosess og byggeprosessen ved hjelp av Arduino-Makefile:

Bare en.ino -fil støttes. Funksjonserklæringer opprettes ikke automatisk i.ino -filen. Brukeren må passe på å lage de riktige funksjonserklæringene.

Hjertet i byggeprosessen er Makefile. Ikke bekymre deg, alt er forberedt for deg, det er litt mer komplisert når du kompilerer på denne måten for ikke -standardbrett som SparkFun -serien.

BOARD_TAG = promicro

ALTERNATE_CORE = SparkFun BOARD_SUB = 16MHzatmega32U4 ARDUINO_PORT =/dev/ttyACM0 USER_LIB_PATH =/home/silver/sketchbook/libraries ARDUINO_DIR = /opt/arduino-1.8.9 include /home/silver/sketchbook/Ar

Og alt du trenger å skrive er a: lag opplasting (som vil bygge.hex -filene først og deretter bruke avrdude for å laste dem opp), vil det ende opp med noe som:

mkdir -p build-promicro-16MHzatmega32U4

gjør tilbakestill make [1]: Gå inn i katalogen '/home/silver/sketchbook'/home/silver/sketchbook/Arduino-Makefile/bin/ard-reset-arduino --caterina/dev/ttyACM0 make [1]: Leaving directory ' /home/silver/sketchbook 'make do_upload make [1]: Entering directory'/home/silver/sketchbook '/opt/arduino-1.8.9/hardware/tools/avr/bin/avrdude -q -V -p atmega32u4 - C /opt/arduino-1.8.9/hardware/tools/avr/etc/avrdude.conf -D -c avr109 -b 57600 -P/dev/ttyACM0 / -U flash: w: build -promicro -16MHzatmega32U4/sketchbook. hex: i Koble til programmerer:. Fant programmerer: Id = "CATERIN"; type = S Programvareversjon = 1.0; Ingen maskinvareversjon er gitt. Programmereren støtter automatisk tilleggsøkning. Programmereren støtter buffert minnetilgang med bufferstørrelse = 128 byte. Programmereren støtter følgende enheter: Enhetskode: 0x44 avrdude: AVR-enhet initialisert og klar til å godta instruksjoner avrdude: Enhetssignatur = 0x1e9587 (sannsynligvis m32u4) avrdude: leseinndatafil "build-promicro-16MHzatmega32U4/sketchbook.hex" avrdude: skrive blits (11580 byte): avrdude: 11580 byte med flash skrevet avrdude: safemode: Sikringer OK (E: CB, H: D8, L: FF) avrdude ferdig. Takk skal du ha.

Vel, takk avrdude, og nå er Arduino nullstilt og programmert med den nye koden, det du bare kan redigere med vi eller din favorittredaktør lokalt, ingen IDE -er er nødvendig. Jeg vil merke at du bør lukke både C -kontrollprogrammet, skjermen eller noe annet som får tilgang til arduinoen mens du laster opp, ellers kommer porten tilbake som /dev /ttyACM1 etter tilbakestilling.

Trinn 3: Avslutning og Todo -liste

Nedleggelse og Todo -liste
Nedleggelse og Todo -liste
Nedleggelse og Todo -liste
Nedleggelse og Todo -liste
Nedleggelse og Todo -liste
Nedleggelse og Todo -liste

Selv om jeg laget denne miljøsensorboksen for serverrom, kan du bruke den til kjemi/elektroniske laboratorier, lagre, vanlige rom og alt annet. Og ja, siden den bruker TCP/IP, er det en IoT -enhet, G jeg burde ha satt det til tittelen også for å gjøre det mer driftig:)

Du kan enkelt endre både maskinvare og programvare for å kunne slå på lysene i rommet automatisk. Ta en titt på det andre prosjektet mitt: Shadow of phoenix hvordan fungerer det for lysstyring, du har all maskinvare for hånden for å gjøre det samme (den bruker hold -tidtakere for å holde lysene på så lenge det ble oppdaget bevegelse i en tidsperiode, hvis det er bevegelse igjen, vil en timer bli støttet opp).

Med OrangePI som kjører en full stack Armbian, er mulighetene ubegrensede, du kan lage et lokalt webgrensesnitt skrevet fra bunnen av i php for å vise historiske data på grafer. Er ikke dette allerede bedre at du har en helt åpen kildekode -enhet som overvåker serverrommet ditt, hva du kan være stolt av å bygge, hvis du tror det, bygg det selv!

Anbefalt: