Innehållsförteckning:

SilverLight: Arduino -baserad miljömonitor för serverrum: 3 steg (med bilder)
SilverLight: Arduino -baserad miljömonitor för serverrum: 3 steg (med bilder)

Video: SilverLight: Arduino -baserad miljömonitor för serverrum: 3 steg (med bilder)

Video: SilverLight: Arduino -baserad miljömonitor för serverrum: 3 steg (med bilder)
Video: Arduino with Silverlight 2024, Juli
Anonim
SilverLight: Arduino -baserad miljömonitor för serverrum
SilverLight: Arduino -baserad miljömonitor för serverrum
SilverLight: Arduino -baserad miljömonitor för serverrum
SilverLight: Arduino -baserad miljömonitor för serverrum
SilverLight: Arduino -baserad miljömonitor för serverrum
SilverLight: Arduino -baserad miljömonitor för serverrum
SilverLight: Arduino -baserad miljömonitor för serverrum
SilverLight: Arduino -baserad miljömonitor för serverrum

En gång fick jag i uppgift att leta efter en miljöprob för att övervaka temperaturen i mitt företags serverrum. Min första idé var: varför inte bara använda en Raspberry PI och en DHT -sensor, den kan installeras på mindre än en timme inklusive OS -installationen. För detta fick jag det kalla svaret från blindfoldiga bossiga människor att vi inte kommer att göra det eftersom det skulle kosta mer i arbetstid att sätta upp det än att köpa en enhet. Att behöva acceptera trångsynta människor så här i en del av mitt liv var en sak och jag beställde lite EATON -skräp från Ebay och kallade det men jag bestämde mig för det ögonblicket att jag för mitt eget serverrum ska bygga en helt öppen källkod Arduino baserad enhet som blir mycket bättre än vad jag just beställde.

Det här projektet är koden SilverLight, fråga mig inte var jag får dessa namn ifrån:) Jag tittade bara på den glänsande halvakryllådan och bestämde mig med detta namn, det har ingenting att göra med mikrofonprodukten vad jag fick reda på efter.

Steg 1: Hårdvarudesign

Hårdvarudesign
Hårdvarudesign
Hårdvarudesign
Hårdvarudesign
Hårdvarudesign
Hårdvarudesign

Kommersiell hårdvaruöversikt.

Ok så jag kommer inte ens igång med vars fantastiska idé var att sätta en miljömonitor i en ups men uppenbarligen finns det en marknad för det så låt oss se vad dessa kan göra:

Miljöövervakningsenhet KOMPATIBILITET

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

10/100Mb ConnectUPS-X, ConnectUPS-BD och ConnectUPS-E med FW V3.01 och högre. MÅTT (LXBXH)

2,26 x 1,48 x 1,15 (tum) 57,6 x 37,6 x 29,3 (mm) VIKT

1,19 oz (34 g)

Det är mycket användbar information eller hur? Oroa dig inte för de kan inte göra så mycket. För att ens komma igång måste din UPS ha ett annat dyrt tilläggskort för detta som ansluter detta med den miljösensor du köper separat, vanligtvis med standard CAT5-kabel (försök inte ens ansluta något till den porten eftersom det inte finns något standard om det). De hävdar att enheten behöver 10 minuter för att "värma upp" att det i verkligheten var timmar och när det väl gjorde voila dök det upp i deras långsamt uppdaterade java -gränssnitt och vi har temperatur och luftfuktighet. Det var enkelt att ställa in varningsbaserade förhållanden från den här punkten, men vem bryr sig, låt oss bygga något bättre.

Detta projekt är en sammanslagning av flera av mina projekt: Natalia väderstation, Shadow of Phoenix. Lådan kan övervaka följande miljöbegränsningar:

  • Temperatur/luftfuktighet/värmeindex
  • LPG, rök, alkohol, propan, väte, metan och kolmonoxidkoncentrationer i luften (MQ2)
  • Solkänslighet (lyser lampan i serverrummet?)
  • Motion PIR -sensor (du kan till och med slå på/av lamporna automatiskt från och med nu tack vare rörelsesensorn när någon kommer in i rummet)

Alla dessa data visas snyggt på en LCD -skärm samtidigt som de vidarebefordrades till en dator (Orange PI Zero) för vidare bearbetning och varningar. Även om det skulle vara möjligt att ansluta digitala sensorer som DHT och digitalpinnen på MQ2 direkt till OrangePI, föredrar jag alltid att använda dedikerade mikro för dessa uppgifter och när du också måste uppdatera LCD -skärmen och göra andra låga nivåer saker Arduino är bara oslagbar och kan pålitligt köra non-stop i många år (faktiskt inte en enda Arduino som körs 24/7 misslyckades på mig ännu). OrangePI med sina brister (låt oss inse det är en 10 $ dator) som oanvändbar för tung arbetsbelastning, inget bsd -stöd, integrerat wifi är uppblåst etc kan enkelt hantera liten arbetsbelastning som att ta sensoravläsningar via seriell (USB) och bearbeta dem.

Detta är en mycket enkel projektmaskinvara som kräver följande komponenter:

  • Arduino PRO Micro
  • LCD -skärm 2x16 tecken RGB
  • AC-DC isolerande strömbrytarmodul 220V till 5V HLK-5M05 (dessa är mycket bra för Arduino/ESP-projekt), detta är 5V/5W-versionen!
  • 2x300ohm motstånd
  • 2xleds (röd/grön)
  • PIR rörelsesensor
  • MQ2 -sensor
  • DHT22
  • LDR
  • 2X10Kohm motstånd
  • Summer
  • Orange PI noll
  • mini USB -datakabel

Jag brydde mig inte ens om att göra ett kretskort för detta, jag använde bara vanlig brödbräda eftersom komponenterna helt enkelt kan anslutas till Arduino (se bilderna bifogade):

-DHT22 kräver en 10K pullup till VCC (digital)

-LDR kommer att kräva en 10K nedrullning till GND (analog)

-MQ2 kan anslutas direkt till alla analoga stift (analog) <föredrar att använda analog för varför inte när vi har en MCU med analoga stift där vi kan få det exakta värdet istället för att justera någon kruka på enhetens baksida för att få HIGH eller LÅG ur det, på grund av limningen i min design som ändå är otillgänglig. Kolla:

-PIR kan anslutas direkt till valfri stift (digital)

-LCD: kan drivas med 4 stift, kan anslutas till valfri stift (digital) kommer att behöva +2 RS/E (digital)

-Buzzer: kan anslutas direkt till alla Arduino -stift (digitala)

Pinout jag använde kan ses i koden. Att koppla ihop allt efter det här är ganska rakt framåt, du kan också göra dem en efter en, se till att 1 sensor fungerar perfekt och fortsätt sedan till nästa, allt du kan få fel är av misstag att ansluta ledningar till fel platser (t.ex. byta vcc /gnd för en sensor, hittills har detta aldrig dödat någon av mina enheter). Vad jag skulle notera här att det var för många VCC och GND staplade upp för mig, jag kunde inte pressa dem genom en plint så jag lödde dem alla.

Också om DHT: erna glöm inte från mina andra projekt: om du lägger DHT -biblioteket i din kod och DHT -sensorn inte är ansluten eller fel är DHT ansluten (t.ex. 11 definierad i kod använder du 22) som kan leda till programmet att hänga för alltid i början.

Om PIR rörelsedetekteringssensorer, som du kan se på min bild finns det massor av falska förfalskningar av dessa, faktiskt skulle jag till och med ha svårt att köpa en äkta från Ebay. Förfalskningarna fungerar lika bra, även på lång sikt, men de har sin krets speglad vilket gör att + och - stiften vänds, även dessa är lätta att känna igen från: kommer med blå kretskort inte den vanliga gröna, saknar etiketterna för krukmätarna. Jag hade turen att hitta en äkta i min låda, annars skulle positionen täcka de 2 lysdioderna för mig. Jag har upptäckt att båda krukorna vevade till halvvägs fungerar för mig. Detta ger dig tillräckligt lång räckvidd för avkänning också när det är rörelse det digitala benet kommer att hållas i HÖG position i cirka en minut, så du behöver inte göra upp i koden för detta. På förfalskningarna är det lätt att avgöra vilken sida som är - och + titta bara på motsvarande ben för elektrolytkåporna som är anslutna till stiften.

För att klippa lådan använde jag diamantdremelhuvud (vilket var en överkillning men fungerade bra) och vanlig borrmaskin. Dessa kopplingsdosor är lätta att arbeta med och även om jag inte gillar att limma hade jag inte skruvar och bultar till hands när jag byggde detta, så jag gjorde fyndet att limma ihop saker (som också lätt kan värmas upp och tas isär senare med hjälp av samma limpistol utan filament i den).

Steg 2: Programvarudesign

Programvarudesign
Programvarudesign
Programvarudesign
Programvarudesign

Arduino -koden är också enkel, den drar i princip alla sensoravläsningar i början av varje slinga. Tänder lysdioderna om det finns rörelse eller rök och spelar också ett larmljud på summern om det finns rök (detta är den enda blockeringskoden så jag gjorde det kort), visar sedan data på LCD -skärmen och skickar det slutligen över datorn med en 10 sekunders hållperiod för att inte översvämma hamnen.

Detta projekt använder envägskommunikation från Arduino-> OrangePI, det finns inga kommandon av något slag implementerade. Även om detta skulle vara fullt möjligt att göra det som jag gjorde det i ett av mina andra projekt där datorn kan skicka LCD_PRINT1 eller LCD_PRINT2 för att skriva över en rad på LCD -skärmen med sitt eget meddelande (t.ex.: ip -adress, upptid, systemdatum, cpu -användning), skärmområdet är så litet för att visa data från 3 sensorer att jag inte ens störde. SOL- och SMK-värdena kan båda gå upp till 4 siffror 0000-1023 och tar redan upp 8 värdefulla tecken på skärmen.

Med LCD -skärmen kan du märka ett litet trick i koden att efter varje uppmätt värde appliceras ett tryck av vita mellanslag (""), sedan flyttar jag markören till fasta positioner för att placera de nya ikonerna och data. Dessa finns där eftersom LCD -skärmen inte är så smart att förstå siffror, den ritar bara vad den får och till exempel om du hade ett solvärde på 525 som plötsligt minskade till 3 så kommer det att visa 325 lämnar det gamla skräpet på skärmen där.

En C -kontrollkod som körs på OrangePI och loggar miljödata och skickar e -postvarningar vid behov.

OrangePI kör Armbian (som i skrivande stund baserat på Debian Stretch). Jag kommer att inkludera detta i programvarudelen angående att det var ett hw -problem vad det löste. Här är enhetens genomsnittliga strömförbrukning:

0,17 A - endast Arduino + sensorer

0.5-0.62 A - OrangePI -uppstart

0,31 A - Orange PI i viloläge

0.29 A - Orange PI avstängd (kan inte riktigt stänga av den, den har inte ACPI eller något liknande)

0,60 A - Stresstest 100% CPU -användning på 4 kärnor

Jag har haft denna OrangePI i en låda sedan länge. Med den gamla kärnan tappade enheten så mycket ström (som mätaren sa nådde en topp på cirka 0,63 A) vad han PSU antagligen inte kunde ge att den helt enkelt inte startade, startprocessen fastnade och jag fick de två ethernet -lysdioderna att lysa upp ständigt och gör ingenting.

Nu är det lite irriterande eftersom HLK-5M05 hävdar att det kan göra 5W på 5V vilket gör att det kan ge 1 Amp men med dessa enheter som kommer ut från Kina vet du bara aldrig, 0,63 A-toppen var mycket lägre än den nominella max värde. Så jag körde enkla omstartstester, från 10 omstarter skulle OrangePI bara starta upp två gånger framgångsrikt, vilket nästan fick mig att slänga det från projektet eftersom jag inte gillar buggy inkonsekvent beteende i kretsar. Så jag började googla runt kanske det finns ett sätt att sänka strömförbrukningen vid starttid från programvara (eftersom det bara var ett problem då) och hittade någon artikel som talade om att finjustera script.bin men det var för Orange PI -datorn och filer saknades från lagringen, så oavsett som en sista utväg har jag gjort den magiska "apt -uppgraderingen" för att uppgradera firmware, kärnan och allt annat, i hopp om att det kommer att tömmas mindre och enheten kan starta in och:

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

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

Det fungerade! Att kasta hårdvara till ett mjukvaruproblem är vanligtvis de lata Java -utvecklarna att gå, men i det här fallet har vi löst ett hårdvaruproblem med programvara vilken stor framgång. Jag har gjort som ytterligare 20 omstartstester, enheten startade upp varje fall. Jag skulle fortfarande notera att strömspänningen från att slå på Opi (ansluta/koppla bort) är så stor att den kommer att återställa Arduino vid en viss tidpunkt (en enkel omstart kommer bara att flimra LCD -skärmen men orsakar inga ytterligare problem), men det här problemet kvarstår dold eftersom de 2 kommer att startas tillsammans.

Jag har också tittat på kärnmodulerna:

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

Vad behöver vi egentligen av dessa? Ok pwr och termisk kan vara användbart men ljud, seriell port, wifi (trasig hw redan) vi behöver inte alla dessa kan svartlistas. Jag kommer också att skapa en anpassad kärna med bara de nödvändiga modulerna senare.

Det vi behöver och som inte laddas som standard är CDC ACM för att kommunicera med Arduino, aktivera det med:

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

Efter detta kan du redan testa anslutningen med:

skärm /dev /ttyACM0 9600

Du bör se att statusdata skickas var 10: e sekund.

Varningar och övervakning

När det gäller varningar lägger jag bara in system () -anrop i C -kontrollkoden som tar emot data från seriell så inga externa verktyg krävs. Några exempelvarningar:

- Temperaturen går över 30 C

- Luftfuktigheten går över 70 % (inte hälsosamt för servrarna)

- Rörelse upptäckt i rummet (detta kan vara irriterande om du fortsätter i ditt serverrum)

- Rök eller gas upptäckt (varningar över 100 kan tas på allvar, jag har lekt med den här sensorn och den tänds för massor av saker, till exempel skapade rök bredvid sensorn med lödkolv resulterade lite över 50 medan rökning nästa o det spikade upp till 500, det upptäckte till och med gas från vanlig deodorant långt ifrån)

För att behålla historiska data brydde jag mig inte om att utveckla ett verktyg, varför skulle jag uppfinna hjulet igen när vi fick utmärkta övervakningsramar där ute. Jag kommer att visa ett exempel på hur jag kan integrera detta i min personliga favorit, Zabbix:

apt-get installera zabbix-agent

Lägg till i slutet 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}'

Att köra zabbix_agentd -p bör nu returnera rätt värden:

silverlight.hum [t | 41]

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

Värmeindexet, jag samlar det men ser ingen praktisk användning av det så det loggas bara. I C -kontrollkoden har jag implementerat 2 loggningsfunktioner, den första loggar alla data i användarvänligt format:

[SILVERLIGHT] Data mottagen 2019-09-10 23:36:08 => Luftfuktighet: 44, Temp: 22, Hej: 25, Sol: 0, Rörelse: 0, Rök: 21

[SILVERLIGHT] Data mottagen 2019-09-10 23:36:18 => Luftfuktighet: 44, Temp: 22, Hej: 25, Sol: 0, Motion: 0, Rök: 21 [SILVERLIGHT] Data mottagen 2019-09 -10 23:36:29 => Luftfuktighet: 44, Temp: 22, Hej: 25, Sol: 0, Rörelse: 0, Rök: 22 [SILVERLIGHT] Data mottagen 2019-09-10 23:36:39 => Luftfuktighet: 44, Temp: 22, Hej: 25, Sol: 0, Rörelse: 0, Rök: 21

Den andra:

void logger2 (char *text) {

FIL *f = fopen ("/dev/shm/silverlight-zbx.log", "w"); if (f == NULL) {printf ("Fel vid öppning av minnesloggfil! / n"); lämna tillbaka; } fprintf (f, "%s", text); fclose (f); lämna tillbaka; }

Detta kommer att lägga en 1 -raders logg i minnet (eliminera onödiga rw -operationer på sd -kortet) som alltid kommer att skrivas över nästa gång. Denna logg kommer bara att innehålla de 6 datakolumnerna och ingen tidsstämpel, den är lättläst för Zabbix.

Som en sista bonus: hur man programmerar Arduino direkt från OrangePI så att du inte behöver gå upp till enheten varje gång och ansluta din bärbara dator.

Det finns 2 sätt:

-Lätt sätt: Installera fullständig Arduino IDE och bibliotek använder något fjärrskrivbord som X11 med vidarebefordran, Xrdp, Xvnc, Nxserver etc

-Hårt sätt: Installera Arduino IDE och använd kommandoraden

Vi kommer att göra det hårda sättet den här gången eftersom jag inte gillar att installera X11 på servrar. För detta behöver du 6 komponenter:

1, Arduino IDE för ARM 32 bitars ->

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

3, Arduino Makefile -projekt -> git -klon

4, DHT -bibliotek

5, Sparkfun -kortdefinitioner

6, SilverLight.ino, huvudkod

För att göra det enklare har jag samlat de filer som behövs för de fyra sista punkterna (sketchbook.tgz) så du behöver bara de två första

Först är det bäst att skapa en vanlig användare som har rw -åtkomst till USB -porten:

adduser silver

usermod -a -G dialout silver

SCP sketchbook.tgz till enheten i den nyskapade användarens hemkatalog och extrahera den där:

cd /hem /silver

tar xvzf sketchbook.tgz

För att förstå lite vad som händer under huven när du använder den grafiska IDE:

Arbetsflödet för att bygga en Arduino -skiss när du använder Arduino IDE beskrivs på Arduinos webbplats https://www.arduino.cc/en/Hacking/BuildProcess och mer detaljerat här: https://www.arduino.cc/ sv/Hacking/BuildProcess

I allmänhet är standard Arduino -byggprocess:

Kombinera.ino -filer i huvudskissfilen. Transformation av huvudskissfilen: lägg till #include -satsen; skapa funktionsdeklarationer (prototyper) för alla funktioner i huvudskissfilen; lägg till innehållet i målets main.cxx -fil till huvudskissfilen. Kompilera koden till objektfiler. Länka objektfilerna till en.hex -fil som är klar för uppladdning till Arduino.

Det finns några små skillnader mellan Arduino-standardprocessen och byggprocessen med Arduino-Makefile:

Endast en.ino -fil stöds. Funktionsdeklarationer skapas inte automatiskt i.ino -filen. Användaren måste ta hand om att skapa rätt funktionsdeklarationer.

Hjärtat i byggprocessen är Makefile. Oroa dig inte, allt är förberett för dig, det är lite mer komplicerat när du sammanställer detta sätt för icke -standardkort 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

Och allt du behöver skriva är en: ladda upp (som kommer att bygga.hex -filerna först och sedan använder avrdude för att ladda upp dem), det kommer att sluta med något som:

mkdir -p build-promicro-16MHzatmega32U4

gör återställning gör [1]: Ange katalog '/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 blixt: w: build -promicro -16MHzatmega32U4/sketchbook. hex: i Anslutning till programmerare:. Hittade programmerare: Id = "CATERIN"; typ = S Programvaruversion = 1.0; Ingen maskinvaruversion ges. Programmeraren stöder automatisk tilläggsökning. Programmeraren stöder buffrad minnesåtkomst med buffertstorlek = 128 byte. Programmeraren stöder följande enheter: Enhetskod: 0x44 avrdude: AVR-enhet initialiserad och redo att acceptera instruktioner avrdude: Enhetssignatur = 0x1e9587 (troligen m32u4) avrdude: läser inmatningsfil "build-promicro-16MHzatmega32U4/sketchbook.hex" avrdude: skriver flash (11580 byte): avrdude: 11580 byte med flashskrivet avrdude: safemode: Säkringar OK (E: CB, H: D8, L: FF) avrdude gjort. Tack.

Tja tack avrdude, och nu återställs vår Arduino och programmeras med den nya koden, vad du bara kan redigera med vi eller din favoritredigerare lokalt, inget behov av IDE: er. Jag skulle notera att du bör stänga både C -kontrollprogrammet, skärmen eller något annat som kommer åt arduino medan du laddar upp, annars kommer porten tillbaka som /dev /ttyACM1 efter återställning.

Steg 3: Avslutning och Todo -lista

Avslutning och Todo -lista
Avslutning och Todo -lista
Avslutning och Todo -lista
Avslutning och Todo -lista
Avslutning och Todo -lista
Avslutning och Todo -lista

Även om jag skapade denna miljösensorbox för serverrum kan du använda den för kemi/elektroniska laboratorier, lager, vanliga rum och allt annat. Och ja, eftersom det använder TCP/IP är det en IoT -enhet, G jag borde ha lagt det till titeln också för att göra det mer driftigt:)

Du kan enkelt modifiera både hårdvaran och programvaran för att kunna tända lamporna i rummet automatiskt. Ta en titt på mitt andra projekt: Shadow of phoenix hur fungerar det för ljuskontroll, du har all hårdvara till hands för att göra samma sak (den använder hålltimrar för att hålla lamporna på så länge det upptäcktes rörelse inom en tidsperiod, om det är rörelse igen kommer en timer att stötas upp).

Med OrangePI som kör en full stack Armbian är möjligheterna obegränsade, du kan skapa ett lokalt webbgränssnitt skrivet från grunden i php för att visa historisk data på grafer. Är det inte redan bättre att du har en helt öppen källkodsenhet som övervakar ditt serverrum vad du kan vara stolt över att bygga, om du tycker det så bygg det själv!

Rekommenderad: