İçindekiler:

AWS & ARDUINO ile BULUT MONİTÖR - Electric Boy: 6 Adım
AWS & ARDUINO ile BULUT MONİTÖR - Electric Boy: 6 Adım

Video: AWS & ARDUINO ile BULUT MONİTÖR - Electric Boy: 6 Adım

Video: AWS & ARDUINO ile BULUT MONİTÖR - Electric Boy: 6 Adım
Video: DIY Home Energy Monitor & CT sensors explained 2024, Kasım
Anonim
AWS & ARDUINO ile BULUT MONİTÖR - Electric Boy
AWS & ARDUINO ile BULUT MONİTÖR - Electric Boy

Bu basit bir proje - bir şeyler ters gittiğinde bir ışık açın… Bu günlerde bilgisayarlarımızda bu kadar çok gösterge panosu varken bildirimlere karşı giderek daha fazla uyuşuyor, gerçekten önemli olanları gözden kaçırmadığımızdan nasıl emin olabiliriz. Cevap fiziksel bir durum göstergesidir. Veya göreve daha özel olarak, masanızın üzerine oturabilen bir Bulut Monitörü - her zaman görüş alanınızda. Adından da anlaşılacağı gibi, monitör, bulut hizmetlerinizin sağlığına dikkat etmenize yardımcı olacaktır (… Benim gibi senin bile bir tane yapman gerekiyor mu? Olmasa bile, gelecekteki IoT projeniz için bir fikriniz olabilir.

Pekala, hazırsanız başlayalım!

1. Adım: Bileşenler, Sarf Malzemeleri, Gerekli Araçlar, Uygulamalar ve Çevrimiçi Hizmet

BİLEŞENLER VE MALZEMELER

_ Arduino Micro e Genuino Micro (1 adet) …veya herhangi bir ufacık Arduino uyumlu - benim durumumda bir freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - I2C Kontrollü RGB LED (1 adet)

_ Mini bulut ışığı (1 adet) …veya seçtiğiniz herhangi bir diğer yarı saydam kap

_ USB-A - B Kablosu (1 birim) …veya A tipi fişli herhangi bir eski USB kablosu

GEREKLİ ARAÇLAR

_ Havya (jenerik)

UYGULAMALAR VE ÇEVRİMİÇİ HİZMET

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

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

2. Adım: Donanım

Donanım
Donanım
Donanım
Donanım

Gece lambası zaten yerleşik bir LED ile geliyor - benim durumumda soğuk beyaz. Farklı durumları farklı renklerle belirtmenin güzel olacağını düşündüm. Bu yüzden sadece bulut şeklindeki kasayı tuttum. Operasyonun beyni için elimdeki en küçük Arduino uyumlu olanı seçtim: Freetronics LeoStick yıllardır tercih ettiğim prototipleme platformu oldu ve bol miktarda yedek parçam var. İyi şeylerle yüklü olarak gelir: bir piezo hoparlör, iki RGB LED (biri güce bağlı, RX ve TX olsa da) ve hepsinden iyisi, basitçe bir USB bağlantı noktasına takabilirsiniz - harici FTDI veya kablo gerekmez. Ayrıca küçük ama breadboard uyumludur.

Neden bir ESP8266 seçmedim? Gerçekten kablosuz olmak için, güç kablosunu da kesebilirsiniz - bu da pil eklemek için işleri biraz daha karmaşık hale getirir ve yeniden şarj etme zahmetine neden olur. Bulut monitörü bilgisayarımın yanında olacağından USB gücünü kullanmak çok daha kolay. Ayrıca Wi-Fi bağlantısı kurmak her zaman kolay değildir. ATmega32u4'e dayanarak Arduino Micro ve LeoStick, D2'de I2C verileri ve D3'te saat bulundurma tuhaflığını paylaşıyor. Bu, BlinkM RGB LED'i bağlarken alakalı hale gelir. BlinkM kalkanını A2.. A5 başlıklarına basitçe takabileceğiniz yaygın Atmega328 kartlarının aksine, bu burada çalışmaz (yumuşak I2C kitaplığı ile uğraşmadım).

BlinkM'deki erkek başlıkları VCC ve GND'nin lehimini sökerek, daha sonra bunları kablolu olarak genişletebilir ve her şeyi takılabilir küçük bir pakette tutabilirim. Arduino bağlı olmadan kodlanmış renk desenlerini oynatın. Neredeyse bir WS2812'nin (Adafruits NeoPixels harika) bana daha iyi hizmet edeceğini hissediyorum - ne yazık ki elimde hiç yoktu. Donanım parçasını bitirmek için, erkek A tipi USB fişinin karşı ucunu kestim, bulut ışığının tabanına yakın önceden delinmiş bir delikten geçirdim ve kabloları LeoStick'e lehimledim (kırmızı: 5V, beyaz: Veri-, yeşil:Veri+, siyah:Toprak).

Adım 3: Çözüm Mimarisi

Çözüm Mimarisi
Çözüm Mimarisi
Çözüm Mimarisi
Çözüm Mimarisi

Kendime dayattığım tek güçlü gereksinim, monitörün bir güvenlik duvarının arkasında çalıştırılmasıydı. Çok önemli bir özellik olmasına rağmen, bu, olay değişiklikleri için web kancalarını kullanışsız hale getirdi. Bir yoklama mekanizması TCP trafiği açısından maliyetlidir ve yoklama sıklığına bağlı olarak olayları geciktirebilir.

Çözüm, tam çift yönlü iletişim sağlayan WebSockets'te bulunur. Amazon'un IoT hizmeti, WebSockets üzerinden MQTT'yi destekleyen bir ileti aracısı sağlar. Görünüşe göre hizmet, Şeyler, Gölgeler, İlkeler veya Kurallar'ı yapılandırmak zorunda kalmadan çağrılabilir.

Arduino Yún için bir cihaz SDK'sı mevcuttur ve SDK'yı ESP8266 gibi diğer platformlara taşımak için bazı çabalar sarf edilmektedir. Ancak monitör her zaman seri arabirimle bağlanacağından, istemci API'sini uygulamak ve Arduino'yu yalnızca renk kodlarını almak ve görüntülemek için kullanmak için bir NodeJS uygulamasına (masaüstü bilgisayarda çalışan) sahip olmaya erken karar verdim. Bu şekilde, yazılım yüklemeleriyle uğraşmadan JavaScript'te kolayca değişiklikler yapılabilir. Test için küçük bir örnek altyapı gereklidir. Diyelim ki, bir web sunucusu örneğinde sağlık kontrolleri yapan ve CPU yüküne dayalı otomatik ölçeklendirme politikaları yapan kullanılabilirlik bölgelerinde etkinleştirilmiş bir yük dengeleyicimiz var. İlgili CloudFormation şablonu ▶️ Tasarımcıda görüntülenebilir veya ▶️ doğrudan konsoldan oluşturulabilir. Not: Bu yığındaki hizmetlerden bazıları ücrete tabi olabilir.

Şablonu Lambda işlevi için özellikler ve gerekli izinlerle genişlettim. Daha sonra, IoT REST API uç noktasının parametre olarak eklenmesini gerektirir. Bunu otomatikleştirmek için, ARN'yi (> aws iot tarif-uç noktası) istemek için CLI'yi kullanan ve ardından satır içi parametreyle create-stack çağıran küçük bir kabuk betiği yazdım. Veya yine de elle yapabilirsiniz:

// IoT REST API UÇ NOKTASINI AL

aws iot açıklama-uç noktası

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

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

İdeal olarak, Lambda işlevini de çağırmak ve bu şekilde monitörün durumunu güncellemek için otomatik ölçeklendirmeyi tetikleyen aynı alarm eşiklerini kullanmalıyım. Şu anda bu, yalnızca SNS'yi bir ara madde olarak kullanırken mümkündür. O sırada bu ekstra katman gereksiz geliyordu ve Lambda'yı doğrudan aramak için CloudWatch EC2 yaşam döngüsü Kurallarını kullanmaya karar verdim. Yine de gelecekte SNS → Lambda seçeneğini keşfetmek istiyorum.

4. Adım: Yazılım

Arduino Sketch'i yazarak başladım. Ana döngü(), seri bağlantıdan Karakterleri okuyor ve yeni satır karakteri alana kadar bir String oluşturuyor. Daha sonra bir hex renk kodunun gönderildiği ve uygun I2C komutunun BlinkM LED'ine yazıldığı varsayılır. Bu, kolaylık olarak verimlilikle ilgili değildir. Bu Sketch ve diğer dosyalar için eksiksiz kaynaklar GitHub'dan edinilebilir. Aşağıda bazı ilgili kod parçacıkları verilmiştir:

boşluk döngüsü () {

while (Serial.available()) {

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

if (inChar == '\n') {

uzun sayı = strtol(inputString.c_str(), NULL, 16);

bayt r = sayı >> 16;

bayt g = sayı >> 8 & 0xFF;

bayt b = sayı & 0xFF;

BlinkM_fadeToRGB(blinkm_addr, r, g, b);

inputString = "";

} Başka {

inputString += inChar;

}

}

}

NodeJS Uygulaması, AWS ve Arduino'ya arayüzler uygulamak zorundadır. Daha sonra, mükemmel serialport paketini kullanırken sadece birkaç satır kodla gerçekleştirilebilir:

var serialport = require('serialport');port = yeni seriport(PORT_COM_NAME, {

baudHızı: SERIAL_BAUD_RATE

});

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

});

port.on('hata', fonksiyon(hata) {

});

AWS IoT'ye bağlanmak da neredeyse hiç çaba gerektirmez. Tek sorun, 443 numaralı bağlantı noktası üzerinden MQTT+WebSockets kullanmanın Erişim Anahtarları aracılığıyla kimlik doğrulama gerektirdiğini bilmektir. SDK bunları ortam değişkenlerinden okuyacaktır. AWS_ACCESS_KEY_ID ve AWS_SECRET_ACCESS_KEY'i açıkça dışa aktarmak gerekebilir.

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

clientId: 'MiniCloudMonitor-' + (Math.floor((Math.random() * 100000) + 1)), bölge: AWS_REGION, protokol: 'wss', bağlantı noktası: 443, hata ayıklama: doğru

});

device.on('bağlan', function() {

device.subscribe(MQTT_TOPIC);

});

device.on('message', function(konu, yük) {

if (bağlantı noktası && yük && konu == MQTT_TOPIC) {

var mesaj = JSON.parse(yük);

if (message.hasOwnProperty(MQTT_JSON_KEY))

{ dönüş;

}

}

});

Lambda işlevi, bir renk kodunu giriş parametresi olarak kabul eder - bu aşamada hoş değil, ancak çok esnektir. MQTT konusuna yayın yapabilmek için, IoT REST API uç noktası gerektiren bir IotData nesnesinin örneğini oluşturur. CloudFormation şablonu, yığının oluşturulması sırasında bununla ilgilendi.

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

bitiş noktası: process.env. MQTT_ENDPOINT});

export.handler = function(olay, bağlam, geri arama) {

var params = {

konu: process.env. MQTT_TOPIC, yük: '{"color\":\"' + event.color + '\"}', qos: 0

};

mqtt.publish(paramlar, fonksiyon(hata, veri) {

geri arama(hata);

});

};

Adım 5: Sonuç

Bulutta "doğmuş" bir sanal olayı fiziksel dünyaya getirmekten gerçekten keyif aldım. Ve benim küçük evcil hayvan projem olarak çok eğlenceliydi. Bunu bir sonraki seviyeye taşımak için düşünürdüm…

  • sağlamlık ve istisna işleme konusunda iyileştirme
  • AWS bulut ölçümlerini entegre etmenin daha iyi yollarını keşfedin
  • göstergeler, çubuk grafikler gibi daha fazla fiziksel göstergeyle denemeler yapın…
  • Azure, Google, Heroku gibi diğer platformlara geçme seçeneğine sahip olun…
  • Jenkins, GitHub için uygulamaya özel olayları izleyin, …

Umarım bu kılavuzu okumaktan zevk almışsınızdır ve belki de yol boyunca yeni bir şey bulmuşsunuzdur. İşleri yapmanın farklı/daha iyi bir yolunu düşünebiliyorsanız, lütfen aşağıdaki yorumlarda paylaşın. Ve elbette, eğer hataları tespit ettiyseniz, bir uyarı çok takdir edilecektir. Zaman ayırdığınız için teşekkürler.

Önerilen: