Indholdsfortegnelse:

SKYMONITOR Med AWS & ARDUINO - Elektrisk dreng: 6 trin
SKYMONITOR Med AWS & ARDUINO - Elektrisk dreng: 6 trin

Video: SKYMONITOR Med AWS & ARDUINO - Elektrisk dreng: 6 trin

Video: SKYMONITOR Med AWS & ARDUINO - Elektrisk dreng: 6 trin
Video: All Sky Infrared and Visible Sky Monitor (ASIVA) 2024, Juli
Anonim
SKYMONITOR Med AWS & ARDUINO - Elektrisk dreng
SKYMONITOR Med AWS & ARDUINO - Elektrisk dreng

Det er et simpelt projekt - tænd et lys, når noget går galt … Bliver stadig mere følelsesløs mod notifikationer med så mange dashboards på vores computere i disse dage, hvordan kan vi sikre, at vi ikke går glip af de virkelig vigtige. Svaret er en fysisk statusindikator. Eller mere specifik for opgaven, en Cloud Monitor, der kan sidde på dit skrivebord - altid i udsigt. Som navnet antyder, hjælper skærmen med at holde øje med sundheden for dine skytjenester (… eller noget andet virkelig, himlen er grænsen, undskyld ordspillet). Selv du, ligesom mig, har brug for at lave en? Selvom ikke, har du måske en idé til et fremtidigt IoT -projekt.

Nå, hvis du er klar, lad os starte!

Trin 1: Komponenter, forbrugsvarer, nødvendige værktøjer, apps og onlineservice

KOMPONENTER OG FORSYNINGER

_ Arduino Micro e Genuino Micro (1 enhed) … eller en hvilken som helst lille Arduino -kompatibel - i mit tilfælde en freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - I2C kontrolleret RGB LED (1 enhed)

_ Mini skylys (1 enhed) … eller enhver anden gennemskinnelig beholder efter eget valg

_ USB-A til B-kabel (1 enhed) … eller et gammelt USB-kabel med et type-A-stik

NØDVENDIGT VÆRKTØJ

_ Loddejern (generisk)

APPS & ONLINE SERVICE

_ Amazon Web Services AWS Lambda (https://aws.amazon.com/it/lambda/)

_ Amazon Web Services AWS IoT (https://aws.amazon.com/it/iot/)

Trin 2: Hardware

Hardware
Hardware
Hardware
Hardware

Natlyset kommer allerede med en indbygget LED - kold hvid i mit tilfælde. Jeg tænkte, at det ville være rart at angive forskellige status med forskellige farver. Så jeg beholdt kun det skyformede hus. Til hjernen i operationen valgte jeg den mindste Arduino -kompatible, jeg havde til rådighed: Freetronics LeoStick har været min foretrukne prototypeplatform i årevis, og jeg har masser af reservedele. Den kommer fyldt med gode ting: en piezo -højttaler, to RGB -lysdioder (den ene er bundet til strøm, RX og TX dog) og bedst af alt, kan du simpelthen tilslutte den til en USB -port - ingen ekstern FTDI eller kabel nødvendig. Det er også lille, men alligevel brødbræt kompatibelt.

Hvorfor valgte jeg ikke en ESP8266? For at være virkelig trådløs kan du lige så godt skære i netledningen - hvilket gør tingene lidt mere komplicerede for at tilføje et batteri og besvær med genopladning. Da cloud -skærmen sidder ved siden af min computer, er det meget lettere at bruge USB -strøm. Opsætning af Wi-Fi-forbindelsen er ikke altid ligetil. Baseret på ATmega32u4 deler Arduino Micro og LeoStick det underlige ved at have I2C-data på D2 og ur på D3. Dette bliver relevant ved tilslutning af BlinkM RGB LED. I modsætning til de almindelige Atmega328 -tavler, hvor du simpelthen kan tilslutte BlinkM -skjoldet til overskrifterne A2.. A5, virker dette ikke her (jeg gad ikke det bløde I2C -bibliotek).

Ved at aflodde de mandlige overskrifter VCC og GND på BlinkM, kunne jeg derefter forlænge dem med ledning og opbevare alt i en stikbar lille pakke. BlinkM har sin egen mikrokontroller om bord og giver mulighed for avancerede applikationer: f.eks. spil manuskriptfarvemønstre uden en Arduino tilsluttet. Jeg føler næsten, at en WS2812 (Adafruits NeoPixels er gode) ville have tjent mig bedre - desværre havde jeg ingen tilgængelig. For at afslutte hardware-bit, skar jeg den modsatte ende af det han-type-A USB-stik, trådede det gennem et forboret hul nær bunden af skylyset og lodde ledningerne til LeoStick (rød: 5V, hvid: Data-, grøn: Data+, sort: Jord).

Trin 3: Løsningsarkitektur

Løsningsarkitektur
Løsningsarkitektur
Løsningsarkitektur
Løsningsarkitektur

Det eneste stærke krav, jeg pålagde mig selv, var at få skærmen til at køre bag en firewall. Selvom det er en afgørende funktion, gjorde dette webkroge til hændelsesændringer upraktiske. En afstemningsmekanisme er dyr med hensyn til TCP -trafik og kan forsinke begivenheder afhængigt af afstemningsfrekvensen.

Løsningen findes i WebSockets, som giver fuld duplex kommunikation. Amazons IoT -service giver en meddelelsesmægler, der understøtter MQTT over WebSockets. Som det viser sig, kan tjenesten kaldes uden at skulle konfigurere ting, skygger, politikker eller regler.

Der er en SDK til rådighed for Arduino Yún, og der gøres en indsats for at overføre SDK'en til andre platforme som ESP8266. Men fordi skærmen altid vil være forbundet med et serielt interface, besluttede jeg tidligt at have et NodeJS -program (kørt på den stationære computer) til at implementere klient -API'et og kun bruge Arduino til at modtage og vise farvekoder. På den måde kan ændringer let foretages i JavaScript uden at skulle bekymre sig om firmware -uploads. For at teste et lille eksempel på infrastruktur er det nødvendigt. Lad os sige, at vi har en load balancer aktiveret på tværs af tilgængelighedszoner, der foretager sundhedstjek på en webserverforekomst og automatiske skaleringspolitikker baseret på CPU -belastning. Den tilsvarende CloudFormation -skabelon kan ▶ ️ ses i Designer eller ▶ ️ oprettes direkte fra konsollen. Bemærk: Nogle af tjenesterne i denne stak kan medføre gebyrer.

Jeg udvidede skabelonen med egenskaber til Lambda -funktionen og nødvendige tilladelser. Senere skal IoT REST API -endepunktet indsættes som en parameter. For at automatisere dette skrev jeg et lille shell-script, der bruger CLI til at anmode om ARN (> aws iot beskriver-slutpunkt) og derefter kalder create-stack med parameteren in-line. Eller du kan stadig gøre det i hånden:

// RETRIVE IoT REST API ENDPOINT

aws iot beskrive-slutpunkt

// CREATE STACK> aws cloudformation create-stack --stack-name MiniCloudMonitor --template-body file: //cfn-template.json --parameters ParameterKey = IotRestApiEndpoint, ParameterValue = {IoT_REST_API_ENDPOINT} --capabilities CAPABILITY_NAMEDI

// DELETE STACK> aws cloudformation delete-stack --stack-name MiniCloudMonitor

Ideelt set skulle jeg bruge de samme alarmgrænser, der udløser den automatiske skalering, for også at kalde Lambda -funktionen og på den måde opdatere monitorens status. I øjeblikket er dette kun muligt, når du bruger SNS som et mellemprodukt. På det tidspunkt føltes dette ekstra lag overflødigt, og jeg besluttede at bruge CloudWatch EC2 livscyklusregler til at ringe til Lambda direkte. Alligevel vil jeg undersøge muligheden for SNS → Lambda i fremtiden.

Trin 4: Software

Jeg startede med at skrive Arduino Sketch. Hovedsløjfen () læser tegn fra den serielle forbindelse og opbygger en streng, indtil den modtager en ny linjetegn. Det antages derefter, at en hex -farvekode blev sendt, og den relevante I2C -kommando skrives til BlinkM LED. Dette handler ikke så meget om effektivitet som bekvemmelighed. De komplette kilder til denne Sketch og andre filer kan fås på GitHub. Følgende er nogle relevante kodeuddrag:

void loop () {

mens (Serial.available ()) {

char inChar = (char) Serial.read ();

hvis (inChar == '\ n') {

langt tal = strtol (inputString.c_str (), NULL, 16);

byte r = tal >> 16;

byte g = tal >> 8 & 0xFF;

byte b = tal & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} andet {

inputString += inChar;

}

}

}

NodeJS -appen skal implementere grænseflader til AWS og Arduino. Senere kan opnås med blot et par linjer kode, når du bruger den fremragende serieportpakke:

var serialport = require ('serialport'); port = ny serieport (PORT_COM_NAME, {

baudRate: SERIAL_BAUD_RATE

});

port.on ('åben', funktion () {

});

port.on ('fejl', funktion (fejl) {

});

Tilslutning til AWS IoT kræver heller ikke stort besvær. Den eneste faldgrube er at vide, at brug af MQTT+WebSockets over port 443 kræver godkendelse via Access Keys. SDK vil læse disse fra miljøvariablerne. Det kan være nødvendigt at eksplicit eksportere AWS_ACCESS_KEY_ID og AWS_SECRET_ACCESS_KEY.

var awsiot = require ('aws-iot-device-sdk'); var device = awsiot.device ({

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), område: AWS_REGION, protokol: 'wss', havn: 443, fejlretning: sandt

});

device.on ('connect', funktion () {

enhed. abonnere (MQTT_TOPIC);

});

device.on ('meddelelse', funktion (emne, nyttelast) {

if (port && nyttelast && topic == MQTT_TOPIC) {

var -besked = JSON.parse (nyttelast);

hvis (message.hasOwnProperty (MQTT_JSON_KEY))

{ Vend tilbage;

}

}

});

Lambda -funktionen accepterer en farvekode som en inputparameter - ikke smuk, men meget fleksibel på dette tidspunkt. For at kunne udgive til MQTT -emnet instantinerer det et IotData -objekt, hvilket kræver IoT REST API -endepunktet. CloudFormation -skabelonen tog sig af det under oprettelsen af stakken.

var AWS = require ('aws-sdk'); var mqtt = ny AWS. IotData ({

slutpunkt: process.env. MQTT_ENDPOINT});

exports.handler = funktion (hændelse, kontekst, tilbagekald) {

var params = {

emne: process.env. MQTT_TOPIC, nyttelast: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

mqtt.publish (params, function (err, data) {

tilbagekald (fejl);

});

};

Trin 5: Konklusion

Jeg nød virkelig at bringe en virtuel begivenhed "født" i skyen ind i den fysiske verden. Og som mit lille kæledyrsprojekt var det masser af sjov. For at tage dette til det næste niveau ville jeg overveje …

  • forbedring af robusthed og undtagelseshåndtering
  • udforske bedre måder at integrere AWS cloud -metrics
  • eksperimentere med flere fysiske indikatorer som målere, søjlediagrammer, …
  • har mulighed for at flytte til andre platforme som Azure, Google, Heroku, …
  • overvåge applikationsspecifikke begivenheder for Jenkins, GitHub, …

Jeg håber, at du nød at læse denne guide og måske endda hentede noget nyt undervejs. Hvis du kan tænke på en anden/bedre måde at gøre tingene, kan du dele det i kommentarerne herunder. Og selvfølgelig, hvis du opdagede fejl, ville en heads up blive meget værdsat. Tak for din tid.

Anbefalede: