Innehållsförteckning:

MOLMONITOR Med AWS & ARDUINO - Elektrisk pojke: 6 steg
MOLMONITOR Med AWS & ARDUINO - Elektrisk pojke: 6 steg

Video: MOLMONITOR Med AWS & ARDUINO - Elektrisk pojke: 6 steg

Video: MOLMONITOR Med AWS & ARDUINO - Elektrisk pojke: 6 steg
Video: AWS re:Invent 2023 - Building a precision medicine platform using AWS HealthOmics (HLC305) 2024, Juli
Anonim
MOLMONITOR Med AWS & ARDUINO - Elektrisk pojke
MOLMONITOR Med AWS & ARDUINO - Elektrisk pojke

Det är ett enkelt projekt - tänd ett ljus när något går fel … Blir alltmer avstängd mot aviseringar med så många instrumentpaneler på våra datorer nuförtiden, hur kan vi se till att vi inte missar de riktigt viktiga. Svaret är en fysisk statusindikator. Eller mer specifik för uppgiften, en molnmonitor, som kan sitta på ditt skrivbord - alltid i sikte. Som namnet antyder hjälper skärmen till att hålla koll på hälsan hos dina molntjänster (… eller något annat egentligen, himlen är gränsen, ursäkta ordvitsen). Även du, precis som jag, behöver göra en? Även om inte, kan du ha en idé för ditt framtida IoT -projekt.

Tja, om du är redo, låt oss börja!

Steg 1: Komponenter, tillbehör, verktyg som behövs, appar och onlinetjänst

KOMPONENTER OCH LEVERANSER

_ Arduino Micro e Genuino Micro (1 enhet) … eller någon liten Arduino -kompatibel - i mitt fall en freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - I2C -styrd RGB -LED (1 enhet)

_ Mini molnljus (1 enhet) … eller något annat genomskinligt kärl efter eget val

_ USB-A till B-kabel (1 enhet) … eller någon gammal USB-kabel med typ A-kontakt

VERKTYG BEHÖVS

_ Lödkolv (generiskt)

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/)

Steg 2: Hårdvara

Hårdvara
Hårdvara
Hårdvara
Hårdvara

Nattlampan har redan en inbyggd LED - kallvitt i mitt fall. Jag tyckte att det skulle vara trevligt att ange olika status med olika färger. Så jag behöll bara det molnformade höljet. För hjärnan i operationen valde jag den minsta Arduino -kompatibla jag hade tillgänglig: Freetronics LeoStick har varit min föredragna prototypplattform i flera år och jag har gott om reservdelar. Den levereras med bra saker: en piezohögtalare, två RGB -lysdioder (en är kopplad till ström, RX och TX dock) och bäst av allt, du kan helt enkelt ansluta den till en USB -port - ingen extern FTDI eller kabel behövs. Det är också litet men brödbräda kompatibelt.

Varför valde jag inte en ESP8266? För att vara riktigt trådlös kan du lika gärna klippa av nätsladden - vilket gör saker och ting lite mer komplicerade för att lägga till ett batteri och besvär för laddning. Eftersom molnmonitorn sitter bredvid min dator är det mycket lättare att använda USB -ström. Att konfigurera Wi-Fi-anslutningen är inte alltid rakt fram. Baserat på ATmega32u4 delar Arduino Micro och LeoStick konstigheten med att ha I2C-data på D2 och klocka på D3. Detta blir relevant vid anslutning av BlinkM RGB LED. Till skillnad från de vanliga Atmega328 -korten där du helt enkelt kan ansluta BlinkM -skölden till rubrikerna A2.. A5, fungerar det inte här (jag störde mig inte på det mjuka I2C -biblioteket).

Genom att avlödda de manliga rubrikerna VCC och GND på BlinkM kunde jag sedan förlänga dem med tråd och behålla allt i ett pluggbart litet paket. BlinkM har en egen mikrokontroller ombord och möjliggör avancerade applikationer: t.ex. spela manuella färgmönster utan att en Arduino är ansluten. Jag känner nästan att en WS2812 (Adafruits NeoPixels är bra) skulle ha tjänat mig bättre - tyvärr hade jag ingen tillgänglig. För att slutföra hårdvarubiten skar jag den motsatta änden av den manliga typ-A-USB-kontakten, trådade den genom ett förborrat hål nära basen av molnljuset och lodde ledningarna till LeoStick (röd: 5V, vit: Data-, grön: Data+, svart: Ground).

Steg 3: Lösningsarkitektur

Lösningsarkitektur
Lösningsarkitektur
Lösningsarkitektur
Lösningsarkitektur

Det enda starka kravet jag ställde på mig själv var att monitorn körs bakom en brandvägg. Även om det är en avgörande funktion, gjorde detta webbkrokar för händelseändringar opraktiska. En omröstningsmekanism är kostsam när det gäller TCP -trafik och kan fördröja händelser beroende på omröstningsfrekvens.

Lösningen finns i WebSockets som tillhandahåller full duplex-kommunikation. Amazons IoT -tjänst tillhandahåller en meddelandemäklare som stöder MQTT över WebSockets. Som det visar sig kan tjänsten anropas utan att behöva konfigurera saker, skuggor, policyer eller regler.

Det finns en enhet -SDK tillgänglig för Arduino Yún och vissa ansträngningar görs för att överföra SDK till andra plattformar som ESP8266. Men eftersom monitorn alltid kommer att anslutas med ett seriellt gränssnitt, bestämde jag mig tidigt för att ha ett NodeJS -program (körs på den stationära datorn) för att implementera klient -API: et och använda Arduino endast för att ta emot och visa färgkoder. På så sätt kan ändringar enkelt göras i JavaScript, utan att behöva krångla till uppladdning av fast programvara. För att testa lite exempelinfrastruktur behövs. Låt oss säga att vi har en belastningsutjämnare aktiverad över tillgänglighetszoner som gör hälsokontroller på en webbserverinstans och automatisk skalningspolicy baserad på CPU -belastning. Motsvarande CloudFormation -mall kan ▶ ️ ses i Designer eller ▶ ️ skapas direkt från konsolen. Obs: vissa av tjänsterna i den här stacken kan medföra avgifter.

Jag utökade mallen med egenskaper för Lambda -funktionen och nödvändiga behörigheter. Senare krävs att IoT REST API -slutpunkten infogas som en parameter. För att automatisera detta skrev jag ett litet skalskript som använder CLI för att begära ARN (> aws iot beskriver-slutpunkt) och sedan kallar create-stack med parametern in-line. Eller så kan du fortfarande göra det för hand:

// RETRIVE IoT REST API ENDPOINT

aws iot beskriver-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

Helst skulle jag använda samma larmtrösklar som utlöser automatisk skalning, för att även ringa till Lambda -funktionen och på så sätt uppdatera bildskärmens status. För närvarande är detta endast möjligt när SNS används som mellanprodukt. Då kändes detta extra lager överflödigt och jag bestämde mig för att använda CloudWatch EC2 livscykelregler för att ringa Lambda direkt. Ändå vill jag utforska alternativet SNS → Lambda i framtiden.

Steg 4: Programvara

Jag började med att skriva Arduino Sketch. Huvudslingan () läser tecken från den seriella anslutningen och bygger en sträng tills den får ett nyradstecken. Det antas då att en hex -färgkod har skickats och lämpligt I2C -kommando skrivs till BlinkM LED. Detta handlar inte så mycket om effektivitet som bekvämlighet. De fullständiga källorna för denna Sketch och andra filer kan erhållas på GitHub. Här följer några relevanta kodavsnitt:

void loop () {

medan (Serial.available ()) {

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

if (inChar == '\ n') {

långt nummer = strtol (inputString.c_str (), NULL, 16);

byte r = nummer >> 16;

byte g = tal >> 8 & 0xFF;

byte b = nummer & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} annat {

inputString += inChar;

}

}

}

NodeJS -appen måste implementera gränssnitt till AWS och Arduino. Senare kan åstadkommas med bara några rader kod när du använder det utmärkta serieportpaketet:

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

baudRate: SERIAL_BAUD_RATE

});

port.on ('open', function () {

});

port.on ('fel', funktion (err) {

});

Att ansluta till AWS IoT kräver knappast mycket ansträngning heller. Den enda fallgropen är att veta att användning av MQTT+WebSockets över port 443 kräver autentisering via åtkomstnycklar. SDK kommer att läsa dessa från miljövariablerna. Det kan vara nödvändigt att uttryckligen exportera AWS_ACCESS_KEY_ID och AWS_SECRET_ACCESS_KEY.

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

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), region: AWS_REGION, protokoll: 'wss', hamn: 443, felsökning: sant

});

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

enhet. prenumerera (MQTT_TOPIC);

});

device.on ('meddelande', funktion (ämne, nyttolast) {

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

var meddelande = JSON.parse (nyttolast);

if (message.hasOwnProperty (MQTT_JSON_KEY))

{ lämna tillbaka;

}

}

});

Lambda -funktionen accepterar en färgkod som en ingångsparameter - inte vacker, men väldigt flexibel i detta skede. För att kunna publicera till MQTT -ämnet, instansierar det ett IotData -objekt, vilket kräver IoT REST API -slutpunkten. CloudFormation -mallen tog hand om det under skapandet av stapeln.

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

slutpunkt: process.env. MQTT_ENDPOINT});

exports.handler = funktion (händelse, sammanhang, återuppringning) {

var params = {

ämne: process.env. MQTT_TOPIC, nyttolast: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

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

återuppringning (fel);

});

};

Steg 5: Slutsats

Jag njöt verkligen av att föra en virtuell händelse "född" i molnet in i den fysiska världen. Och som mitt lilla husdjursprojekt var det massor av kul. För att ta detta till nästa nivå skulle jag överväga …

  • förbättra robustheten och undantagshanteringen
  • utforska bättre sätt att integrera AWS -molnmätvärden
  • experimentera med fler fysiska indikatorer som mätare, stapeldiagram, …
  • har möjlighet att flytta till andra plattformar som Azure, Google, Heroku, …
  • övervaka applikationsspecifika händelser för Jenkins, GitHub, …

Jag hoppas att du tyckte om att läsa den här guiden och kanske till och med fick upp något nytt på vägen. Om du kan tänka dig ett annat/bättre sätt att göra saker, dela det i kommentarerna nedan. Och naturligtvis, om du upptäckte misstag skulle en heads up uppskattas mycket. Tack för din tid.

Rekommenderad: