Оглавление:

ОБЛАЧНЫЙ МОНИТОР с AWS и ARDUINO - Electric Boy: 6 шагов
ОБЛАЧНЫЙ МОНИТОР с AWS и ARDUINO - Electric Boy: 6 шагов

Видео: ОБЛАЧНЫЙ МОНИТОР с AWS и ARDUINO - Electric Boy: 6 шагов

Видео: ОБЛАЧНЫЙ МОНИТОР с AWS и ARDUINO - Electric Boy: 6 шагов
Видео: Создавайте информационные панели в реальном времени с помощью DynamoDB, Rockset и Grafana — презентация AWS + Rockset в реальном времени 2024, Ноябрь
Anonim
ОБЛАЧНЫЙ МОНИТОР с AWS и ARDUINO - Electric Boy
ОБЛАЧНЫЙ МОНИТОР с AWS и ARDUINO - Electric Boy

Это простой проект - зажгите свет, когда что-то пойдет не так … В наши дни, когда на наших компьютерах становится все более оцепеневшим от уведомлений с таким количеством информационных панелей, как мы можем убедиться, что не пропустили действительно важные из них. Ответ - индикатор физического состояния. Или, более конкретно, для задачи, облачный монитор, который может стоять на вашем столе - всегда на виду. Как следует из названия, монитор поможет следить за работоспособностью ваших облачных сервисов (… или что-то еще, небо - это предел, извините за каламбур). Даже тебе, как и мне, нужно это сделать? Даже если нет, у вас может быть идея для вашего будущего IoT-проекта.

Что ж, если вы готовы, приступим!

Шаг 1. Компоненты, расходные материалы, необходимые инструменты, приложения и онлайн-сервис

КОМПОНЕНТЫ И ПРИНАДЛЕЖНОСТИ

_ Arduino Micro e Genuino Micro (1 единица)… или любой небольшой совместимый с Arduino - в моем случае это freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - RGB-светодиод, управляемый I2C (1 шт.)

_ Мини-облачный светильник (1 шт.)… Или любой другой полупрозрачный сосуд по вашему выбору

_ Кабель USB-A - B (1 шт.)… Или любой старый USB-кабель с вилкой типа A

НЕОБХОДИМЫЕ ИНСТРУМЕНТЫ

_ Паяльник (общий)

ПРИЛОЖЕНИЯ И ОНЛАЙН-СЕРВИС

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

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

Шаг 2: Оборудование

Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение
Аппаратное обеспечение

В ночник уже встроен светодиод - в моем случае холодный белый. Я подумал, что неплохо бы разными цветами обозначать разные состояния. Поэтому я оставил только оболочку в форме облака. Для работы я выбрал самую маленькую из имеющихся у меня совместимых с Arduino: Freetronics LeoStick уже много лет является моей любимой платформой для создания прототипов, и у меня есть много запчастей. Он поставляется с хорошими вещами: пьезо-динамиком, двумя светодиодами RGB (один связан с питанием, хотя RX и TX) и, что самое главное, вы можете просто подключить его к USB-порту - никаких внешних FTDI или кабелей не требуется. Он также крошечный, но совместим с макетной платой.

Почему я не выбрал ESP8266? Чтобы быть по-настоящему беспроводным, вы могли бы также отрезать шнур питания, что немного усложняет задачу добавления батареи и неудобства подзарядки. Поскольку облачный монитор будет находиться рядом с моим компьютером, гораздо проще использовать USB-питание. Кроме того, настройка соединения Wi-Fi не всегда проста. Основанные на ATmega32u4, Arduino Micro и LeoStick делятся странностью наличия данных I2C на D2 и часов на D3. Это становится актуальным при подключении светодиода BlinkM RGB. В отличие от обычных плат Atmega328, где вы можете просто подключить экран BlinkM к заголовкам A2.. A5, здесь это не сработает (я не стал беспокоиться о мягкой библиотеке I2C).

Отпаяв штыревые разъемы VCC и GND на BlinkM, я мог бы затем расширить их с помощью провода и сохранить все в небольшом съемном корпусе. BlinkM имеет собственный микроконтроллер на борту и позволяет использовать расширенные приложения: например, играть по сценарию цветовых узоров без подключенного Arduino. Я почти чувствую, что WS2812 (Adafruits NeoPixels великолепны) послужил бы мне лучше - увы, у меня его не было. Чтобы закончить работу с аппаратной частью, я вырезал противоположный конец вилки USB типа A, продел ее через предварительно просверленное отверстие рядом с основанием облачного фонаря и припаял провода к LeoStick (красный: 5 В, белый: Данные-, зеленый: Данные +, черный: Земля).

Шаг 3: Архитектура решения

Архитектура решения
Архитектура решения
Архитектура решения
Архитектура решения

Единственное серьезное требование, которое я предъявил к себе, - это запустить монитор за брандмауэром. Хотя это и было важной функцией, это делало веб-хуки для изменений событий непрактичными. Механизм опроса является дорогостоящим с точки зрения трафика TCP и может задерживать события в зависимости от частоты опроса.

Решение находится в WebSockets, которые обеспечивают полнодуплексную связь. Сервис Amazons IoT предоставляет брокера сообщений, который поддерживает MQTT через WebSockets. Как оказалось, сервис можно вызвать без необходимости настраивать вещи, тени, политики или правила.

Для Arduino Yún доступен SDK для устройств, и предпринимаются некоторые усилия по переносу SDK на другие платформы, такие как ESP8266. Но поскольку монитор всегда будет подключен через последовательный интерфейс, я заранее решил создать приложение NodeJS (запускаемое на настольном компьютере) для реализации клиентского API и использовать Arduino только для приема и отображения цветовых кодов. Таким образом можно легко вносить изменения в JavaScript, не беспокоясь о загрузке прошивки. Для тестирования необходим небольшой пример инфраструктуры. Допустим, у нас есть балансировщик нагрузки, включенный в зонах доступности, который выполняет проверки работоспособности на экземпляре веб-сервера и политики автоматического масштабирования в зависимости от загрузки ЦП. Соответствующий шаблон CloudFormation можно ▶ ️ просмотреть в Дизайнере или ▶ ️ создать непосредственно из консоли. Примечание: за некоторые услуги в этом стеке может взиматься плата.

Я расширил шаблон, добавив в него свойства лямбда-функции и необходимые разрешения. Позже потребуется добавить конечную точку IoT REST API в качестве параметра. Чтобы автоматизировать это, я написал небольшой сценарий оболочки, который использует CLI для запроса ARN (> aws iot describe-endpoint), а затем вызывает create-stack с параметром in-line. Или вы все еще можете сделать это вручную:

// ПОЛУЧИТЬ КОНЕЧНУЮ ТОЧКУ IoT REST API

aws iot description-endpoint

// СОЗДАТЬ СТЕК> 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

// УДАЛИТЬ СТЕК> aws cloudformation delete-stack --stack-name MiniCloudMonitor

В идеале я должен использовать те же пороги срабатывания сигнализации, которые запускают автоматическое масштабирование, также для вызова функции лямбда и, таким образом, обновления состояния монитора. В настоящее время это возможно только при использовании SNS в качестве промежуточного звена. В то время этот дополнительный уровень казался избыточным, и я решил использовать правила жизненного цикла CloudWatch EC2 для прямого вызова Lambda. Тем не менее, я хочу изучить вариант SNS → Lambda в будущем.

Шаг 4: Программное обеспечение

Я начал с написания скетча Arduino. Основной цикл () читает Chars из последовательного соединения и строит String, пока не получит символ новой строки. Затем предполагается, что был отправлен шестнадцатеричный цветовой код, и соответствующая команда I2C записана на светодиод BlinkM. Дело не столько в эффективности, сколько в удобстве. Полные исходники этого скетча и других файлов можно получить на GitHub. Ниже приведены некоторые соответствующие фрагменты кода:

void loop () {

while (Serial.available ()) {

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

if (inChar == '\ n') {

длинное число = strtol (inputString.c_str (), NULL, 16);

байт r = число >> 16;

байт g = число >> 8 & 0xFF;

байт b = число & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} еще {

inputString + = inChar;

}

}

}

Приложение NodeJS должно реализовывать интерфейсы к AWS и Arduino. Позже можно выполнить всего несколькими строками кода при использовании отличного пакета serialport:

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

baudRate: SERIAL_BAUD_RATE

});

port.on ('открыть', function () {

});

port.on ('ошибка', function (err) {

});

Подключение к AWS IoT также не требует больших усилий. Единственная ошибка - знать, что использование MQTT + WebSockets через порт 443 требует аутентификации с помощью ключей доступа. SDK считывает их из переменных среды. Может потребоваться явный экспорт AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY.

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

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), регион: AWS_REGION, протокол: 'wss', порт: 443, отладка: правда

});

device.on ('подключиться', function () {

device.subscribe (MQTT_TOPIC);

});

device.on ('сообщение', функция (тема, полезная нагрузка) {

if (порт && полезная нагрузка && topic == MQTT_TOPIC) {

var message = JSON.parse (полезная нагрузка);

если (message.hasOwnProperty (MQTT_JSON_KEY))

{ возвращение;

}

}

});

Функция Lambda принимает цветовой код в качестве входного параметра - некрасиво, но на данном этапе очень гибко. Чтобы иметь возможность публиковать в теме MQTT, он создает экземпляр объекта IotData, для которого требуется конечная точка IoT REST API. Об этом позаботился шаблон CloudFormation при создании стека.

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

конечная точка: process.env. MQTT_ENDPOINT});

export.handler = function (событие, контекст, обратный вызов) {

var params = {

тема: process.env. MQTT_TOPIC, полезная нагрузка: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

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

обратный вызов (ошибка);

});

};

Шаг 5: Заключение

Мне действительно понравилось переносить виртуальное событие, «рожденное» в облаке, в физический мир. И в качестве моего маленького домашнего проекта это было очень весело. Чтобы перейти на следующий уровень, я бы подумал…

  • улучшение устойчивости и обработки исключений
  • изучить лучшие способы интеграции облачных метрик AWS
  • поэкспериментируйте с большим количеством физических индикаторов, таких как датчики, гистограммы и т. д.
  • есть возможность перейти на другие платформы, такие как Azure, Google, Heroku,…
  • отслеживать конкретные события приложения для Jenkins, GitHub,…

Надеюсь, вам понравилось читать это руководство и, возможно, вы даже узнали что-то новое по пути. Если вы можете придумать другой / лучший способ сделать что-то, поделитесь им в комментариях ниже. И, конечно же, если вы заметили ошибки, мы будем очень признательны за хедз-ап. Спасибо за ваше время.

Рекомендуемые: