Πίνακας περιεχομένων:

ΠΑΡΑΚΟΛΟΥΘΗΣ ΝΕΦΩΣΗΣ Με AWS & ARDUINO - Electric Boy: 6 Βήματα
ΠΑΡΑΚΟΛΟΥΘΗΣ ΝΕΦΩΣΗΣ Με AWS & ARDUINO - Electric Boy: 6 Βήματα

Βίντεο: ΠΑΡΑΚΟΛΟΥΘΗΣ ΝΕΦΩΣΗΣ Με AWS & ARDUINO - Electric Boy: 6 Βήματα

Βίντεο: ΠΑΡΑΚΟΛΟΥΘΗΣ ΝΕΦΩΣΗΣ Με AWS & ARDUINO - Electric Boy: 6 Βήματα
Βίντεο: E27 WIFI Smart Home Bulb Camera 2024, Νοέμβριος
Anonim
ΠΑΡΑΚΟΛΟΥΘΗΣ ΝΕΦΩΣΗΣ Με AWS & ARDUINO - Electric Boy
ΠΑΡΑΚΟΛΟΥΘΗΣ ΝΕΦΩΣΗΣ Με AWS & ARDUINO - Electric Boy

Είναι ένα απλό έργο - ανάψτε ένα φως όταν κάτι δεν πάει καλά … Μουδιάζοντας όλο και περισσότερο προς τις ειδοποιήσεις με τόσους πίνακες ελέγχου στους υπολογιστές μας αυτές τις μέρες, πώς μπορούμε να βεβαιωθούμε ότι δεν θα χάσουμε τα πραγματικά σημαντικά. Η απάντηση είναι ένας δείκτης φυσικής κατάστασης. Or πιο συγκεκριμένα για την εργασία, ένα Cloud Monitor, που μπορεί να κάθεται στο γραφείο σας - πάντα σε προβολή. Όπως υποδηλώνει το όνομα, η οθόνη θα σας βοηθήσει να παρακολουθείτε την υγεία των υπηρεσιών cloud σας (… ή οτιδήποτε άλλο πραγματικά, ο ουρανός είναι το όριο, συγχωρέστε το λογοπαίγνιο). Ακόμα κι εσύ, όπως εγώ, πρέπει να φτιάξεις ένα; Ακόμα κι αν όχι, μπορεί να έχετε μια ιδέα για ένα μελλοντικό σας έργο IoT.

Λοιπόν, αν είστε έτοιμοι, ας ξεκινήσουμε!

Βήμα 1: Εξαρτήματα, αναλώσιμα, εργαλεία που απαιτούνται, εφαρμογές και διαδικτυακή υπηρεσία

ΣΥΣΤΑΤΙΚΑ ΚΑΙ ΠΡΟΜΗΘΕΙΑ

_ Arduino Micro e Genuino Micro (1 μονάδα)… ή οποιοδήποτε μικρό συμβατό με Arduino - στην περίπτωσή μου ένα freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - I2C Controlled RGB LED (1 μονάδα)

_ Μικρό φως σύννεφων (1 μονάδα)… ή οποιοδήποτε άλλο ημιδιαφανές σκάφος της επιλογής σας

_ Καλώδιο USB-A έως B (1 μονάδα)… ή οποιοδήποτε παλιό καλώδιο USB με βύσμα τύπου A

ΕΡΓΑΛΕΙΑ ΧΡΕΙΑΖΟΝΤΑΙ

_ Συγκολλητικό σίδερο (γενικό)

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

Βήμα 2: Υλικό

Σκεύη, εξαρτήματα
Σκεύη, εξαρτήματα
Σκεύη, εξαρτήματα
Σκεύη, εξαρτήματα

Το νυχτερινό φως έρχεται ήδη με ενσωματωμένο LED - κρύο λευκό στην περίπτωσή μου. Σκέφτηκα ότι θα ήταν ωραίο να υποδεικνύω διαφορετική κατάσταση με διαφορετικά χρώματα. Έτσι κράτησα μόνο το περίβλημα σε σχήμα σύννεφου. Για τον εγκέφαλο της λειτουργίας επέλεξα το μικρότερο συμβατό με Arduino που είχα διαθέσιμο: Το Freetronics LeoStick ήταν η προτιμώμενη πλατφόρμα πρωτοτύπων μου εδώ και χρόνια και έχω πολλά ανταλλακτικά. Έρχεται φορτωμένο με καλά πράγματα: ένα πιεζοηχείο, δύο LED RGB (το ένα είναι συνδεδεμένο στην τροφοδοσία, RX και TX όμως) και το καλύτερο από όλα, μπορείτε απλά να το συνδέσετε σε μια θύρα USB - δεν απαιτείται εξωτερικό FTDI ή καλώδιο. Είναι επίσης μικρό αλλά συμβατό με το breadboard.

Γιατί δεν επέλεξα ένα ESP8266; Για να είστε πραγματικά ασύρματοι, θα μπορούσατε επίσης να κόψετε το καλώδιο τροφοδοσίας - κάτι που κάνει τα πράγματα λίγο πιο περίπλοκα για την προσθήκη μπαταρίας και την ταλαιπωρία της επαναφόρτισης. Δεδομένου ότι η οθόνη cloud θα καθίσει δίπλα στον υπολογιστή μου, είναι πολύ πιο εύκολο να χρησιμοποιήσω τροφοδοσία USB. Επίσης, η ρύθμιση της σύνδεσης Wi-Fi δεν είναι πάντα απλή. Με βάση το ATmega32u4, το Arduino Micro και το LeoStick μοιράζονται το περίεργο να έχουν δεδομένα I2C στο D2 και ρολόι στο D3. Αυτό καθίσταται σημαντικό κατά τη σύνδεση του LED BlinkM RGB. Σε αντίθεση με τους κοινούς πίνακες Atmega328 όπου μπορείτε απλά να συνδέσετε την ασπίδα BlinkM στις κεφαλίδες A2.. A5, αυτό δεν θα λειτουργήσει εδώ (δεν ασχολήθηκα με τη μαλακή βιβλιοθήκη I2C).

Αποκολλώντας τις αρσενικές κεφαλίδες VCC και GND στο BlinkM, θα μπορούσα στη συνέχεια να τις επεκτείνω με σύρμα και να τις κρατήσω σε ένα μικρό πακέτο με δυνατότητα σύνδεσης. Το BlinkM έχει το δικό του μικροελεγκτή στο σκάφος και επιτρέπει προηγμένες εφαρμογές: π.χ. αναπαραγωγή σεναρίων μοτίβων χρώματος χωρίς σύνδεση Arduino. Σχεδόν αισθάνομαι ότι ένα WS2812 (το Adafruits NeoPixels είναι υπέροχο) θα με είχε εξυπηρετήσει καλύτερα - δυστυχώς δεν είχα κανένα διαθέσιμο. Για να τελειώσω το κομμάτι του υλικού, έκοψα το αντίθετο άκρο του αρσενικού βύσματος USB τύπου A, το πέρασα μέσα από μια προ-τρυπημένη τρύπα κοντά στη βάση του φωτός του σύννεφου και κόλλησα τα καλώδια στο LeoStick (κόκκινο: 5V, λευκό: Δεδομένα-, πράσινο: Data+, μαύρο: Ground).

Βήμα 3: Αρχιτεκτονική λύσεων

Αρχιτεκτονική Λύσης
Αρχιτεκτονική Λύσης
Αρχιτεκτονική Λύσης
Αρχιτεκτονική Λύσης

Η μόνη ισχυρή απαίτηση που επέβαλα στον εαυτό μου ήταν να λειτουργήσει η οθόνη πίσω από ένα τείχος προστασίας. Αν και ένα κρίσιμο χαρακτηριστικό, αυτό έκανε τους γάντζους ιστού για αλλαγές συμβάντων μη πρακτικούς. Ένας μηχανισμός ψηφοφορίας είναι δαπανηρός από την άποψη της επισκεψιμότητας TCP και μπορεί να καθυστερήσει τα συμβάντα ανάλογα με τη συχνότητα των δημοσκοπήσεων.

Η λύση βρίσκεται στα WebSockets που παρέχουν επικοινωνία διπλής όψης. Η υπηρεσία Amazons IoT παρέχει έναν μεσίτη μηνυμάτων που υποστηρίζει MQTT μέσω WebSockets. Όπως αποδεικνύεται, η υπηρεσία μπορεί να κληθεί χωρίς να χρειαστεί να διαμορφώσετε πράγματα, σκιές, πολιτικές ή κανόνες.

Υπάρχει διαθέσιμο SDK συσκευής για το Arduino Yún και καταβάλλονται προσπάθειες για τη μεταφορά του SDK σε άλλες πλατφόρμες όπως το ESP8266. Αλλά επειδή η οθόνη θα είναι πάντα συνδεδεμένη με σειριακή διεπαφή, αποφάσισα από νωρίς να έχω μια εφαρμογή NodeJS (που εκτελείται σε επιτραπέζιο υπολογιστή) για την υλοποίηση του API του πελάτη και τη χρήση του Arduino μόνο για τη λήψη και την εμφάνιση χρωματικών κωδικών. Με αυτόν τον τρόπο, οι αλλαγές μπορούν να γίνουν εύκολα στο JavaScript, χωρίς να χρειάζεται να ασχοληθείτε με τις μεταφορτώσεις υλικολογισμικού. Για τη δοκιμή απαιτείται ένα μικρό παράδειγμα υποδομής. Ας υποθέσουμε ότι έχουμε ενεργοποιήσει έναν εξισορροπητή φορτίου σε όλες τις ζώνες διαθεσιμότητας που πραγματοποιεί ελέγχους υγείας σε μια παρουσία διακομιστή ιστού και πολιτικές αυτόματης κλιμάκωσης με βάση το φορτίο της CPU. Το αντίστοιχο πρότυπο CloudFormation μπορεί ▶ ️ να προβληθεί στο Designer ή created ️ να δημιουργηθεί απευθείας από την κονσόλα. Σημείωση: ορισμένες από τις υπηρεσίες αυτής της στοίβας ενδέχεται να έχουν χρεώσεις.

Επέκτεινα το πρότυπο με ιδιότητες για τη λειτουργία Λάμδα και απαραίτητα δικαιώματα. Αργότερα απαιτείται η εισαγωγή του τελικού σημείου IoT REST API ως παραμέτρου. Για να αυτοματοποιήσω αυτό, έγραψα ένα μικρό σενάριο κελύφους που χρησιμοποιεί το CLI για να ζητήσει το ARN (> aws iot description-endpoint) και στη συνέχεια καλεί τη δημιουργία-στοίβα με την παράμετρο σε σειρά. Or μπορείτε ακόμα να το κάνετε με το χέρι:

// RETRIVE IoT REST API ENDPOINT

aws iot description-endpoint

// ΔΗΜΙΟΥΡΓΙΑ STACK> aws cloudformation create-stack --stack-name MiniCloudMonitor --template-body file: //cfn-template.json --parameters ParameterKey = IotRestApiEndpoint, ParameterValue = {IoT_REST_API_ENDPOINABILIT_AM_CAP_INABILIT_AM_CAP_INABILIT_AM_CAP_INABILIT_AM_CAP_INABILIT_AM_CAP_INABILIT_AM_CAP_INABILIT_AM_CAP_INABILIT_AM_CAP_IN_TAM_CAP_INABILT_AM_CAP_IN_TAM_CAP_IN_TIL_CAM_CAP_INTIL_AP_INABILT_AM_AP_IN_TIL_AM_IN_IN_PER_IN_TIN_AM_IN_PER_IN_TIN_AM_IN_PER_IN_IN_IN_IN_PER_IN_IN_PAR_IN_PORT

// ΔΙΑΓΡΑΦΗ STACK> aws cloud-delete-stack --stack-name MiniCloudMonitor

Ιδανικά θα πρέπει να χρησιμοποιήσω τα ίδια όρια συναγερμού που ενεργοποιούν την αυτόματη κλιμάκωση, για να καλέσω επίσης τη λειτουργία Lambda και με αυτόν τον τρόπο να ενημερώσω την κατάσταση της οθόνης. Προς το παρόν αυτό είναι δυνατό μόνο όταν χρησιμοποιείται SNS ως ενδιάμεσο. Εκείνη τη στιγμή αυτό το επιπλέον στρώμα ήταν περιττό και αποφάσισα να χρησιμοποιήσω τους κανόνες κύκλου ζωής του CloudWatch EC2 για να καλέσω απευθείας τη Λάμδα. Ακόμα, θέλω να εξερευνήσω την επιλογή του SNS → Lambda στο μέλλον.

Βήμα 4: Λογισμικό

Ξεκίνησα γράφοντας το Arduino Sketch. Ο κύριος βρόχος () είναι η ανάγνωση χαρακτήρων από τη σειριακή σύνδεση και η δημιουργία μιας συμβολοσειράς έως ότου λάβει έναν χαρακτήρα νέας γραμμής. Στη συνέχεια, υποτίθεται ότι στάλθηκε ένας εξαγωνικός κωδικός χρώματος και η κατάλληλη εντολή I2C γράφεται στο LED BlinkM. Αυτό δεν αφορά τόσο την αποτελεσματικότητα όσο την ευκολία. Οι πλήρεις πηγές για αυτό το Σκίτσο και άλλα αρχεία μπορούν να ληφθούν στο GitHub. Ακολουθούν μερικά σχετικά αποσπάσματα κώδικα:

void loop () {

ενώ (Serial.available ()) {

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

εάν (inChar == '\ n') {

long number = strtol (inputString.c_str (), NULL, 16);

byte r = αριθμός >> 16;

byte g = αριθμός >> 8 & 0xFF;

byte b = αριθμός & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} αλλο {

inputString += inChar;

}

}

}

Η εφαρμογή NodeJS πρέπει να εφαρμόσει διεπαφές σε AWS και Arduino. Αργότερα μπορεί να επιτευχθεί σε λίγες μόνο γραμμές κώδικα όταν χρησιμοποιείτε το εξαιρετικό σειριακό πακέτο:

var serialport = απαιτούν ('serialport'); port = new serialport (PORT_COM_NAME, {

baudRate: SERIAL_BAUD_RATE

});

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

});

port.on ('error', function (err) {

});

Η σύνδεση με το AWS IoT απαιτεί επίσης πολύ μεγάλη προσπάθεια. Η μόνη παγίδα είναι να γνωρίζετε ότι η χρήση MQTT+WebSockets πάνω από τη θύρα 443 απαιτεί έλεγχο ταυτότητας μέσω κλειδιών πρόσβασης. Το SDK θα τα διαβάσει από τις μεταβλητές περιβάλλοντος. Σως χρειαστεί να εξάγετε ρητά τα AWS_ACCESS_KEY_ID και AWS_SECRET_ACCESS_KEY.

var awsiot = απαιτούν ('aws-iot-device-sdk'); var συσκευή = awsiot.device ({

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), περιοχή: AWS_REGION, πρωτόκολλο: 'wss', λιμάνι: 443, εντοπισμός σφαλμάτων: αλήθεια

});

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

device.subscribe (MQTT_TOPIC)?

});

device.on ('μήνυμα', λειτουργία (θέμα, ωφέλιμο φορτίο) {

εάν (θύρα && ωφέλιμο φορτίο && θέμα == MQTT_TOPIC) {

var μήνυμα = JSON.parse (ωφέλιμο φορτίο);

εάν (message.hasOwnProperty (MQTT_JSON_KEY))

{ ΕΠΙΣΤΡΟΦΗ;

}

}

});

Η συνάρτηση Lambda δέχεται έναν κωδικό χρώματος ως παράμετρο εισόδου - όχι όμορφο, αλλά πολύ ευέλικτο σε αυτό το στάδιο. Για να είναι δυνατή η δημοσίευση στο θέμα MQTT, δημιουργεί ένα αντικείμενο IotData, το οποίο απαιτεί το τελικό σημείο IoT REST API. Το πρότυπο CloudFormation φρόντισε για αυτό κατά τη δημιουργία της στοίβας.

var AWS = απαιτούν ('aws-sdk'); var mqtt = νέα AWS. IotData ({

τελικό σημείο: process.env. MQTT_ENDPOINT});

export.handler = λειτουργία (συμβάν, πλαίσιο, επανάκληση) {

var params = {

θέμα: process.env. MQTT_TOPIC, ωφέλιμο φορτίο: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

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

επανάκληση (λάθος)?

});

};

Βήμα 5: Συμπέρασμα

Μου άρεσε πραγματικά να φέρνω ένα εικονικό γεγονός "που γεννήθηκε" στο σύννεφο στον φυσικό κόσμο. Και ως μικρό ζωάκι μου ήταν πολύ διασκεδαστικό. Για να το πάω στο επόμενο επίπεδο θα σκεφτόμουν…

  • βελτίωση της ευρωστίας και του χειρισμού εξαιρέσεων
  • εξερευνήστε καλύτερους τρόπους ενσωμάτωσης μετρήσεων cloud AWS
  • πειραματιστείτε με περισσότερους φυσικούς δείκτες όπως μετρητές, γραφήματα ράβδων,…
  • έχουν την επιλογή να μετακινηθούν σε άλλες πλατφόρμες όπως Azure, Google, Heroku,…
  • παρακολουθεί συγκεκριμένα συμβάντα εφαρμογών για Jenkins, GitHub,…

Ελπίζω να σας άρεσε να διαβάζετε αυτόν τον οδηγό και ίσως να διαλέξατε κάτι νέο στην πορεία. Εάν μπορείτε να σκεφτείτε έναν διαφορετικό/καλύτερο τρόπο για να κάνετε πράγματα, μοιραστείτε τον στα παρακάτω σχόλια. Και φυσικά, αν εντοπίσετε λάθη, το κεφάλι ψηλά θα εκτιμηθεί ιδιαίτερα. Σε ευχαριστώ για τον χρόνο σου.

Συνιστάται: