Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Домашний контроллер Arduino, активированный Alexa

Компоненты и расходные материалы

Ардуино Юн
× 1
ControlEverything.com 4-КАНАЛЬНЫЙ КОНТРОЛЛЕР РЕЛЕ ДЛЯ I2C
× 1
Датчик температуры и влажности DHT11 (4 контакта)
× 1
Резистор 10 кОм
× 2
SparkFun RedBot Buzzer
× 1
NPN-транзистор общего назначения
× 1
Понижающий преобразователь постоянного тока LM2596
× 1
Amazon Alexa Echo Dot
× 1
Arduino Proto Shield
× 1
Usb WebCam
× 1
Белая распределительная коробка 200 мм x 155 мм x 80 мм
× 1

Необходимые инструменты и машины

Паяльник (универсальный)

Приложения и онлайн-сервисы

IDE Arduino
Amazon Alexa Alexa Skills Kit
Amazon Web Services AWS Lambda
PubNub Publish / Subscribe API

Об этом проекте

Обзор

Когда Amazon выводит на рынок Alexa и такие устройства, как Amazon Echo Dot, открывается бесконечное количество вариантов, позволяющих создать отличный Умный дом, управляемый голосовыми командами на естественном языке.

В этом проекте создается домашний контроллер Arduino, который может подключать к Интернету множество датчиков и устройств, и вы можете управлять ими с помощью навыка Amazon Alexa.

Вы можете установить и включить мой навык Домашний контроллер Arduino "легкий шаг, или вы можете улучшить свои навыки с помощью этого урока.

А пока мы будем контролировать:

  • Четыре лампы в комнате, гараже, кухне и гостиной.
  • Датчик температуры и влажности.
  • Звуковой сигнал.
  • Веб-камера, чтобы сделать фото безопасности и отправить по электронной почте.

Вы можете увидеть Arduino Home Controller в действии в этой короткой видео-демонстрации. Для демонстрации и видео я использую четыре светодиода на прото-плате, имитирующие лампочки в комнатах каждого дома.

Если вы хотите использовать удаленные модули для включения освещения, вы можете просмотреть мои Удаленные модули Arduino Home Controller проект по этому URL-адресу.

Блок-схема

На изображении блок-схемы мы видим четыре основных компонента этого проекта:

1.- Amazon Echo Dot получать голосовые команды и отправлять их в AWS (Amazon Web Service).

2.- AWS с навыками Amazon и лямбда-функцией интерпретировать все команды.

Название навыка - Arduino Home Controller . "вы можете активировать его позже.

3.- Брокер MQTT с помощью облака PubNub (c).

Этот брокер будет получать управляющие сообщения по двум каналам:один для установленных значений, а другой - для считывания значений с датчиков.

Вам не нужно создавать учетную запись в PubNub, вы можете использовать мою учетную запись для демонстрационных предложений.

4.- Домашний контроллер с использованием Arduino Yun.

Мы будем использовать Arduino Yun, потому что у него есть Ethernet-экран внутри и есть небольшая Linux-машина, на которой мы будем запускать python для обработки некоторых действий.

Он управляет реле освещения, считывает показания датчика температуры и влажности, включает зуммер для сигнала тревоги и управляет веб-камерой, чтобы сделать снимок безопасности.

Для удаленных модулей см. Мои дополнительные Модули дистанционного управления домашним контроллером Arduino проект по этому URL-адресу.

Установите все необходимое программное обеспечение

На этом этапе вы можете выбрать два варианта:один для демонстрационного предложения, использовать мой навык Alexa, установить его и использовать его или второй вариант, который вы можете сделать своим личным навыком.

Просмотрите приложение Alexa по этому URL , в этом меню выберите раздел Skills, Search Arduino и в списке вы видите навык с названием " Домашний контроллер Arduino ", щелкните карточку навыка и нажмите кнопку" Включить "для установки.

Или вам нужно перейти в Amazon Skill Store по этой ссылке . и нажмите кнопку «Включить»

Вам необходимо связать свою учетную запись Amazon, потому что мы будем использовать ваш адрес электронной почты в качестве идентификатора для всех команд, отправляемых в Arduino. Обратите внимание, что мы не будем использовать этот адрес для отправки электронных писем, мы будем использовать его только как идентификатор.

Skill установлен и связан с учетной записью Amazon и подключен к моей лямбда-функции в облаке AWS.

1.- Создать а навык

Вам необходимо зарегистрироваться и создать бесплатную учетную запись разработчика на сайте https://developer.amazon.com/home.html

.

1.1.- После входа в систему переходит Alexa пункт меню и выберите в Alexa Skills Kit кнопка "Начать"

1.2.- Затем нажмите кнопку «Добавить новый навык», чтобы создать новый навык.

1.3.- В Создать новый навык Alexa раздел необходимо:

  • Выберите: Пользовательская модель взаимодействия
  • Язык английский (США)
  • Название TestSkill название навыка, используемого для поиска в магазине.
  • Название вызова Test Skill - это имя для запуска голосовых команд, таких как Alexa Ask, Test Skill, чтобы включить будильник
  • Для всех глобальных полей установлено значение Нет.
  • Нажмите "Сохранить".

Новый навык был создан, и вы видите новое поле Идентификатор приложения

  amzn1.ask.skill.6e22e052-c32f-433c-8d39-dc94a77a4adb  

Он используется для связи между навыком и лямбда-функцией, мы будем использовать его позже в разделе 2.5 руководства.

1.4.- Модель взаимодействия здесь определяет, как вы взаимодействуете с навыком на основе определения намерений, слотов и высказываний.

В Модель взаимодействия пункт меню скопируйте и вставьте эту схему Json в схему намерения .

  {"intents":[{"slots":[{"name":"light", "type":"States"}, {"name":"which", "type":" HabRooms "}]," intent ":" LightIntent "}, {" slots ":[{" name ":" alarm "," type ":" States "}]," intent ":" AlarmIntent "}, {" намерение ":" TakePhotoIntent "}, {" намерение ":" GetTemperatureIntent "}, {" намерение ":" GetHumidityIntent "}, {" намерение ":" AboutIntent "}, {" намерение ":" AMAZON.HelpIntent "}, {"намерение":"AMAZON.CancelIntent"}, {"намерение":"AMAZON.StopIntent"}]}  

Определите некоторые необходимые слоты, такие как "Состояния" и "HabRooms", в настраиваемых типах слотов.

Определите все высказывания как модель разговора в Образцы высказываний , скопируйте и вставьте этот список.

  LightIntent Turn {which} light {light} LightIntent Set {which} light {light} AlarmIntent Включить тревогу {alarm} TakePhotoIntent Сделать PhotoTakePhotoIntent Сделать Security PhotoGetTemperatureIntent Прочитать температуруGetHumidityIntent Прочитать влажность 

Перед переходом к следующему разделу Конфигурация нам нужно создать нашу лямбда-функцию, потому что нам нужно связать как навык, так и лямбда-функцию.

2.- Создает лямбда-функцию

Вам необходимо зарегистрироваться и создать учетную запись в Консоли AWS, используя URL-адрес https://aws.amazon.com/console/

2.1.- Выберите Услуги . в вверх меню и Лямбда в меню левой панели.

2.2.- Выберите в левой панели Функция и нажмите кнопку «Создать функцию».

2.3.- Установите эти данные:

  • Нажмите Автор с нуля
  • Имя: TestSkillLambda
  • Время выполнения: Node.js.6.10
  • Роль: Создать особую роль

Откроется новое окно, в котором вы должны выбрать следующие значения:

  • Роль IAM: Lambda_Basic_Execution
  • PolicyName: «Создать новую политику ролей», затем отредактируйте политику и вставьте следующее:
  {"Версия":"2012-10-17", "Заявление":[{"Эффект":"Разрешить", "Действие":["журналы:CreateLogGroup», «журналы:CreateLogStream», «журналы:PutLogEvents»], «Ресурс»:«arn:aws:logs:*:*:*»}, {«Эффект»:«Разрешить», «Действие»:[«iot:UpdateThingShadow»], «Ресурс» :"*"}]}  

Чтобы сохранить, нажмите кнопку «Добавить» и вернитесь в Создать функцию . страницу и выберите lambda_basic_execution в Существующей роли поле.

2.4.- TestSkillLambda функция была создана, и вы видите ее страницу дизайнера.

2.5. - В левой строке меню выберите Набор навыков Alexa . и добавьте его в добавить триггеры ограниченная область.

Нажмите Набор навыков Alexa . и прокрутите вниз до Настроить триггеры выберите Включить и в Skill ID скопируйте и вставьте поле Идентификатор приложения значение сохранить позже, см. раздел 1.3 руководства.

В настоящее время мы связываем лямбда-функцию с навыком, используя идентификатор приложения или навыка.

Нажмите кнопку «Сохранить» и Alexa Skills Kit . сохраняются, а функция лямбда знает навык и связана.

2.6. Прокрутите вниз до Код функции . раздел и поля набора:

  • Тип ввода кода: Загрузите файл .zip .
  • Время выполнения: Node.js 6.10
  • Нажмите кнопку " Загрузить . "для загрузки кода функции с помощью файла data.zip .

Откроется редактор кода, и вы увидите загруженные папки и файлы.

Выберите файл index.js он содержит всю реализацию лямбда-функций.

Вы должны изменить строку 23, скопировать и вставить тот же ID приложения . используется позже в разделе 1.3 учебного пособия.

Нажмите кнопку «Сохранить», и лямбда-функция будет активирована для получения команд навыков.

  var APP_ID =amzn1.ask.skill.6e22e052-c32f-433c-8d39-dc94a77a4adb  

В верхней части страницы над кнопкой «Сохранить» вы увидите ARN (имя ресурса Amazon), это идентификатор лямбда-функции, который мы будем использовать в Конфигурации . раздел на странице навыков.

3.- Вернуться к определению навыков

3.1. - Выберите Конфигурация . раздел в EndPoint выберите AWS Lambda ARN, скопируйте и вставьте указанную выше строку ARN в По умолчанию поле. Это последнее действие, связывающее навык и лямбда-функцию, лямбда-функцию, известную навыку, и они связаны.

3.2. Прокрутите вниз до Связывание учетной записи . раздел и скопируйте два первых URL-адреса перенаправления они понадобятся вам для настройки профиля безопасности.

Прежде чем продолжить настройку навыков, нам нужно определить профиль безопасности, используемый для связывания навыка и учетной записи Amazon в приложении Alexa.

4.- Создать профиль безопасности

На той же консоли разработчика, которая использовалась для создания навыка, выберите Приложения и службы и Войти через Amazon и нажмите кнопку "Создать " а Новый Безопасность Профиль "

4.1.- Управление профилем безопасности позволяет создать профиль со всей безопасностью OAuth 2.0, чтобы связать навык с вашей учетной записью Amazon.

4.2.- Заполните все поля этими данными:

  • Имя профиля безопасности :TestSkillProfile
  • Описание профиля безопасности :Профиль, используемый TestSkill
  • Согласие на URL уведомления о конфиденциальности :https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 это пример, который вы должны использовать.
  • Нажмите кнопку "Сохранить".

4.3.- При сохранении всех данных или изменении профиля безопасности в двух новых полях отображаются важные данные: Идентификатор клиента . и секрет клиента . Они понадобятся вам для настройки конечных навыков.

4.4. Определите URL-адреса белого списка, выберите вкладку Веб-настройки .

  • Разрешенное происхождение :https://layla.amazon.com и https://pitangui.amazon.com
  • Разрешенные URL-адреса возврата :добавьте два первых адреса из раздела 3.2

5.- Завершение создания навыков

5.1.- Вернитесь к определению навыка, выберите Конфигурация . раздел и прокрутите вниз до Связывание учетной записи .

  • Разрешаете ли вы пользователям создавать учетные записи? :Выберите Да
  • URL авторизации : https://www.amazon.com/ap/oa/?redirect_url=UUUUUU Если есть «UUUUUU», вам нужно будет заменить его одним из URL переадресации снизу вниз по странице. Ссылка будет выглядеть примерно так: https://www.amazon.com/ap/oa/?redirect_url=https://layla.amazon.com/api/skill/link/UUUUUU .
  • Идентификатор клиента :скопируйте и вставьте идентификатор клиента из раздела 4.3.
  • Объем : профиль см. объяснение по этому адресу.

5.2.- Продолжите связывание учетной записи:

  • Тип разрешения на авторизацию :Предоставление кода авторизации
  • URI токена доступа :https://api.amazon.com/auth/o2/token
  • Секрет клиента :скопируйте и вставьте секрет клиента из раздела 4.3.
  • URL политики конфиденциальности :https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 это пример, который вы должны использовать.
  • Нажмите кнопки "Сохранить" и "Далее".

5.3.- Глобальные поля - это раздел, используемый для документирования навыков.

  • Выберите категорию, в которой можно найти навыки в магазине после сертификации , «Умный дом»
  • Инструкции по тестированию
  • Навык будет доступен во всех странах .
  • Краткое описание
  • Полное описание навыка
  • Примеры фраз
  • Некоторые ключевые слова, определяющие навык
  • Значок Png или Jpg 108x108 пикселей.
  • Значок Png или Jpg 512x512 пикселей.

5.4.- Последний раздел Конфиденциальность и соответствие

6.- Установите TestSkill в приложении Alexa

6.1- При сохранении навыка вы можете перейти в приложение Alexa по адресу https://alexa.amazon.com/ и выбрать в меню левой панели параметр Навыки . нажмите кнопку вверху справа «Ваши навыки» и выберите фильтр Навыки разработчиков вы можете увидеть TestSkill карта. Обратите внимание на сообщение о необходимости привязки учетной записи.

6.2.- Если щелкнуть карточку TestSkill На странице описания отображается вся информация о навыке, нажмите кнопку «Включить».

6.3.- Из-за необходимого определения привязки учетной записи вы должны перенаправить на страницу учетных данных для входа в Amazon, чтобы связать навык с вашей учетной записью Amazon.

Если информация для входа подтверждена, вы увидите эту страницу, указывающую, что навык связан с вашей учетной записью Amazon.

6.4.- Навык завершен, установлен, привязан к вашей учетной записи Amazon и подключен к функции Lambda.

Вы можете протестировать, скажем, Alexa, спросите Test Skill и вы видите приветствие в Arduino Home Controller, потому что все диалоги одинаковы.

Конфигурация Arduino Yun

Если вы впервые используете Arduino Yun, вам необходимо подготовить его перед загрузкой скетча.

Я предлагаю посмотреть руководство или учебник Грега Боугза Начало работы с Arduino Yun - Arduino с Wi-Fi. Спасибо пользователю Hackster @BenEagen за то, что нашел это руководство.

Чтобы сделать снимок и отправить его по электронной почте, нам необходимо установить дополнительное программное обеспечение. Мы также собираемся протестировать USB-камеру, чтобы убедиться, что драйверы работают правильно. Подключите веб-камеру USB к USB-порту Arduino Yun.

Для этого подключитесь к Arduino Yun с помощью терминала:

  ssh [email protected]  

Пароль по умолчанию - arduino.

Если соединение в порядке, вы увидите приглашение OpenWRT Linux:

Установить создание изображений программное обеспечение

Начните с обновления диспетчера пакетов:

  обновление opkg  

Установите драйверы UVC:

  opkg install kmod-video-uvc  

Установите пакет python-openssl:

  opkg install python-openssl  

Нам также понадобится утилита fswebcam, которую мы будем использовать для фотографирования с терминала:

  opkg установить fswebcam  

Убедитесь, что SD-карта установлена ​​в Arduino Yun, вы можете проверить ее, выполнив эту команду:

  монтировать  

Если вы видите в списке устройств что-то вроде / dev / sda1 on / mnt / sda1 type vfat SD-карта в порядке.

Проверить камеру и сделать снимок действительно несложно. Просто введите:

  cd / mnt / sda1fswebcam test.png  

Вы должны увидеть некоторую информацию, отображаемую вместе с некоторыми ошибками, но не беспокойтесь о них. Важно увидеть эти строки:

  --- Открытие /dev/video0... Пробуем исходный модуль v4l2 ... / dev / video0 открыт.  

Чтобы проверить, правильно ли сделан снимок, извлеките SD-карту из Arduino Yun и прочтите ее с помощью компьютера. Вы должны увидеть картинку, появившуюся в корне SD-карты " test.png ".

Просто откройте его, чтобы убедиться, что он был сделан правильно и не поврежден.

Установить ПО для отправки электронной почты

С SD на вашем компьютере скопируйте файл python AHC_SendEmail.py и измените свой адрес электронной почты и пароль из строк 11, 12 и 13 учетной записи Gmail, если у вас есть другой поставщик электронной почты, измените информацию о сервере в строке 36.

Извлеките SD из компьютера и вставьте в слот SD в Arduino Yun. На терминале, подключенном к Arduino Yun, выполните команды:

  cd / mnt / sda1python /mnt/sda1/AHC_SendEmail.py / mnt / sda1 / test.png  

Если все в порядке, вы должны получить электронное письмо с вашей фотографией.

Подключите все устройства к Arduino Yun

На основе электронной схемы подключите все устройства, в частности датчик DHT11, потому что он нам нужен для считывания температуры и влажности, а также зуммер для проверки звука будильника.

Установить эскиз файл ArduinoHomeMQTT.ino

Я создаю libraries.zip файл со всеми библиотеками, необходимыми для этого файла, вы можете загрузить его с моего сайта GitHub и разархивировать в каталог библиотек Arduino IDE.

Библиотеки, включенные в libraries.zip внутри ArduinoHomeMQTT папка.

  ArduinoJson -> используется для управления содержимым JsonDHT_sensor_library -> используется для обработки DHT sensorpubsubclient-master -> используется для подключения, публикации и подписки на PubNub (c)  

Откройте Arduino IDE 1.6.x, в инструментах выберите «Board:Arduino Yun».

Загрузите файл ArduinoHomeMQTT.ino а в среде IDE измените строку 16, указав свой адрес электронной почты Amazon, когда активирована связанная учетная запись в приложении Amazon App.

Этот параметр определяет ваш контроллер, когда AWS отправляет сообщение MQTT брокеру.

Измените строку 50 на свой uuid, чтобы идентифицировать вашего контроллера в PubNub (c), вы можете перейти на этот сайт и скопируйте созданный в Интернете uuid.

Теперь сохраните и загрузите эскиз, и при открытии окна монитора IDE Arduino вы увидите, что Arduino Yun подключен к брокеру PubNub (c) и датчик инициализирован.

Проверьте все высказывания Alexa Echo Dot

Умение Alexa " Домашний контроллер Arduino "умение обрабатывать этот список высказываний , вы можете увидеть их в приложении Alexa App в разделе описания. Вы можете протестировать все и увидеть на последовательном мониторе Arduino ID все полученные сообщения и их отправку брокеру PubNub (c).

Управление освещением:

  ==> «Алекса, попроси arduino home включить свет в комнате» ==> «Алекса, попроси arduino home выключить свет в комнате» ==> «Alexa, попроси arduino home включить свет на кухне "==>" Alexa, попроси arduino home выключить свет на кухне "==>" Alexa, попроси arduino home включить свет в гараже "==>" Alexa, попроси arduino home выключить свет в гараже "==>" Алекса, попроси arduino home включить свет в гостиной "==>" Alexa, попроси arduino home выключить свет в гостиной " 

Управление сигнализацией:

  ==> «Алекса, попроси домой arduino включить будильник» ==> «Алекса, попроси домой arduino выключить будильник»  

Температура и влажность при сканировании:

  ==> «Alexa, попроси arduino домой прочитать температуру» ==> «Alexa, попроси arduino home прочитать влажность»  

Сделайте фото безопасности:

  ==> «Алекса, попроси ардуино домой сделать фото»  

О программе и справка

  ==> «Алекса, спроси у дома arduino о» ==> «Алекса, спроси у дома ардуино»  

Подробная информация о программном обеспечении

Вы можете скачать все файлы для этого проекта с моего сайта Github.

Папки содержат объяснение

ArduinoHomeMQTT -> ino файл и библиотеки для домашнего контроллера Arduino Yun

лямбда -> Функция Lambda в Node.js для развертывания в AWS Lambda, включает все необходимые node_modules, см. Вариант 2 в разделе «Установка всего программного обеспечения».

питон -> файл Python для отправки электронной почты с прикрепленной фотографией.

схема -> Электронный файл схемы Fritzing (c).

Рабочий процесс Arduino Home Controller показать вы как взаимодействуют файлы .

(1) Amazon Echo Dot отправляет командный голос, и он принимается навыком домашнего контроллера Arduino .

(2) Файл лямбда-функции вызова навыка index.js .

(3) Файл функции Lambda разработан на Node.Js, использует некоторые модули узлов . и размещался в Amazon Web Service (AWS).

(4) Лямбда-функция интерпретирует все намерения и преобразует их в сообщение MQTT Json и отправляет его брокеру PubNub (c). Это сообщение имеет формат:

  {"topic":Topic_xxxx, "command":включено или выключено, "id":адрес электронной почты}  

Тема Topic_xxxx может быть:

  Topic_room -> включить / выключить свет в комнатеTopic_livingroom -> включить / выключить свет в гостинойTopic_kitchen -> включить / выключить свет на кухнеTopic_garage -> включить / выключить свет в гаражеTopic_alarm -> включить / выкл. будильник 

Команда может быть включена или выключено .

(5) Сообщение отправляется по каналу AHC_IOC_01. Канал AHC_IOC_02 используется для получения значений температуры или влажности.

(6) Эскиз Arduino Yun ArduinoHomeMQTT.ino подключиться к брокеру и подписаться или публиковать каналы и получать или отправлять сообщения.

(7) Использование моста the arduino sketch communicate with linux OpenWRT for wan or lan connect and to execute some commands.

( 8 ) If arduino need send an email uses the python file AHC_SendEmail.py , if needs take a photo call fswebcam programs located inside linux OpenWRT.

Hardware details

The heart of hardware is the Arduino Yun.

It uses several digital pins to control each device :

Pin 2 :connected to DHT11 sensorPin 8 :activate the buzzer alarm with help of NPN transistor Pin 9 :control room lightPin 10:control kitchen lightPin 11:control garage lightPin 12:control living room light 

The webcam is connected to usb port.

To power all devices the controller use 12 volts Dc power and convert to 5 volts using an Dc to Dc power converter.

I make an arduino shield using the Arduino Proto Shield with all connectors and interface electronic to sensor, buzzer alarm and power supply. It have space for new sensors to extending the controller.

Put the Arduino Yun, Proto shield, Relays and power regulator inside a plastic box with alarm, webcam and sensor outside, and make all connections like mention in electronic schematic.

For demo and video propose I use four leds in prothoboard simulating light bulbs in each house rooms.

Thanks for read this guide, I appreciate your time, If you have any suggestions please contact me.

I make this project in memory of my Dad, he dieds last year, R.I.P Dad.

Код

  • ArduinoHomeMQTT.ino
  • AHC_SendEmail.py
  • index.js
ArduinoHomeMQTT.inoArduino
Arduino Yun software for Home Controller
//// ArduinoHomeMQTT// v2.1//// Copyright (C)2018 Jose Cruz. All right reserved// web:https://sites.google.com/view/raeiot/home//#include #include #include #include #include // Your Amazon email linked skill#define MyID "YOUR AMAZON EMAIL LINKED IN ALEXA APP"// DHT11 sensor data pin#define DHTPIN 2// DHT 11 sensor type#define DHTTYPE DHT11// Initialize DHT sensorDHT dht(DHTPIN, DHTTYPE);// Alarm control pin#define alarm 8// Light control pins#define room_light 9#define kitchen_light 10#define garage_light 11#define livingroom_light 12// PubNub MQTT Server address and portint mqtt_server_port =1883;const char* mqtt_server ="mqtt.pndsn.com";// Suscribe topicconst char* topic ="AHC_IOT_01";// Publish topicconst char* topic2 ="AHC_IOT_02";// PubNub publisher ID// pub-c-e93def7f-95aa-475a-aa60-cc3cd32ee8a7/// PubNub suscriber ID// sub-c-ec04dbbc-0893-11e8-8e75-cea83f8405bb/// UUID generated onlyne https://www.uuidgenerator.net/// // PubNub Client ID// clientId =pubID + subID + uuid;c onst char* clientId ="pub-c-e93def7f-95aa-475a-aa60-cc3cd32ee8a7/sub-c-ec04dbbc-0893-11e8-8e75-cea83f8405bb/YOUR UUID GENERATED";// Define de Yun ethernet clientYunClient ethClient;// Define PubNub pub and sub clientPubSubClient client(ethClient);// Picture processProcess picture;// FilenameString filename;// Path for image fileString path ="/mnt/sda1/";// Create an image file and sent by emailvoid TakePhoto() { // Generate filename with timestamp filename =""; picture.runShellCommand("date +%s"); while (picture.running()); while (picture.available()> 0) { char c =picture.read(); filename +=c; } filename.trim(); filename +=".jpg"; // Take picture picture.runShellCommand("/usr/bin/fswebcam -i 0 --jpeg 95 --no-banner --fps 1 -S 1 -r 352x288 --save " + path + filename); while (picture.running()); //Send it by email picture.runShellCommand("python /mnt/sda1/AHC_SendEmail.py " + path + " " + filename); while (picture.running());}//***********************// Send temperature//***********************void SendTemperature(){ char cstr[16]; // Read temperature as Celsius (the default) float t =dht.readTemperature(); // Serial.print("Temperature:"); // Serial.print(t); // Serial.println(" *C"); client.publish(topic2, itoa(t, cstr, 10)); //Serial.print("Temperature sent..."); //Serial.println(cstr);}//***********************// Send humidity//***********************void SendHumidity(){ char cstr[16]; float h =dht.readHumidity(); //Serial.print("Humidity:"); //Serial.print((int)h); //Serial.print(" %\t"); client.publish(topic2, itoa(h, cstr, 10)); //Serial.print("Humidity sent..."); //Serial.println(cstr);}//Callback function for msg receive handlevoid callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i =0; i  jsonBuffer; JsonObject&root =jsonBuffer.parseObject((char[])payload); String alexa_topic =root["topic"]; String alexa_command =root["command"]; String alexa_id =root["id"]; //Serial.println(alexa_topic); //Serial.println(alexa_command); if (alexa_id.equals(MyID)) { //Handle all received msgs topic from MQTT if (alexa_topic.endsWith("Topic_room")) { digitalWrite(room_light, (alexa_command.endsWith("on") ? LOW :HIGH)); } else if (alexa_topic.endsWith("Topic_kitchen")) { digitalWrite(kitchen_light, (alexa_command.endsWith("on") ? LOW :HIGH)); } else if (alexa_topic.endsWith("Topic_garage")) { digitalWrite(garage_light, (alexa_command.endsWith("on") ? LOW :HIGH )); } else if (alexa_topic.endsWith("Topic_living room")) { digitalWrite(livingroom_light, (alexa_command.endsWith("on") ? LOW :HIGH)); } else if (alexa_topic.endsWith("Topic_temperature")) { SendTemperature(); } else if (alexa_topic.endsWith("Topic_humidity")) { SendHumidity(); } else if (alexa_topic.endsWith("Topic_alarm")) { digitalWrite(alarm, (alexa_command.endsWith("on") ? HIGH :LOW)); } else if (alexa_topic.endsWith("Topic_photo")) { TakePhoto(); } }}//Reconnect to MQTT broker if lost connectionvoid reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(clientId)) { Serial.println("MQTT broker connected"); client.subscribe(topic); } else { Serial.print("Failed, rc ="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } }}void setup(){ Bridge.begin(); задержка (2000); Serial.begin (115200); Serial.println("Init Arduino Home Controller v2.1..."); pinMode(alarm, OUTPUT); pinMode(room_light, OUTPUT); pinMode(kitchen_light, OUTPUT); pinMode(garage_light, OUTPUT); pinMode(livingroom_light, OUTPUT); digitalWrite(room_light, HIGH); digitalWrite(kitchen_light, HIGH); digitalWrite(garage_light, HIGH ); digitalWrite(livingroom_light, HIGH); // Define PubNub MQTT broker client.setServer(mqtt_server, mqtt_server_port); client.setCallback(callback); client.connect(clientId); Serial.println("Connected to PubNub MQTT broker OK ..."); client.subscribe(topic); Serial.println("Suscribe to topic at MQTT broker Ok ..."); dht.begin (); //Wait for sensor initialize delay(4000); Serial.println("DHT sensor Ok ...");}void loop(){ if (!client.connected()) { reconnect(); } client.loop();}
AHC_SendEmail.pyPython
File to be installed in Arduino Yun OpenWRT linux to help send email with attached photo
import smtplibimport sysimport timefrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEText import MIMETextfrom email.MIMEBase import MIMEBasefrom email import encoders fromaddr ="[email protected]"toaddr ="[email protected]"emailpassword ="YOUR PASSWORD"subject ="Arduino Home Controller by Alexa Skill"body ="Photo taken in " + time.strftime('%a, %d %b %Y %H:%M:%S %Z(%z)')filedir =sys.argv[1]filename =sys.argv[2]msg =MIMEMultipart() msg['From'] =fromaddrmsg['To'] =toaddrmsg['Subject'] =subject msg.attach(MIMEText(body, 'plain')) attachment =open(filedir + filename, "rb") part =MIMEBase('application', 'octet-stream')part.set_payload((attachment).read())encoders.encode_base64(part)part.add_header('Content-Disposition', "attachment; filename=%s" % filename) msg.attach(part) server =smtplib.SMTP('smtp.gmail.com', 587)server.starttls()server.login(fromaddr, emailpassword)text =msg.as_string()server.sendmail(fromaddr, toaddr, text)server.quit()
index.jsJavaScript
AWS Lambda Function if you select option 2, build your own skill
// Alexa SDK for Arduino Home Controller// Copyright (c) 2014-2015 Amazon.com, Inc. or its affiliates. Все права защищены. Use is subject to license terms.// Jose Cruz https://sites.google.com/view/jriot // Define connection to PubNub var PubNub =require("pubnub");var pubnub =new PubNub({ ssl:true, publish_key:"pub-c-e93def7f-95aa-475a-aa60-cc3cd32ee8a7", subscribe_key:"sub-c-ec04dbbc-0893-11e8-8e75-cea83f8405bb", uuid:"YOUR UUID"});// Define the PubNub channelvar channel ='AHC_IOT_01';// Used to receive some values (temperature, humidity)var channel2 ='AHC_IOT_02';// Define slot states for light and alarm turn on/offvar slotStates =['on', 'off'];// App ID for the skillvar APP_ID ='YOUR APP ID FOR THE SKILL';// The AlexaSkill prototype and helper functionsvar AlexaSkill =require('./AlexaSkill');var ArduinoHomeSkill =function() { AlexaSkill.call(this, APP_ID);};//Listener for suscribe and receive temperature and humidityvar mqttListener;var access_token;var url;var https =require("https");function SendMessage(topicname, commandvalue, speechOutput, iresponse) { https.get(url, res => { res.setEnc oding("utf8"); let body =""; res.on("data", data => { body +=data; }); res.on("end", () => { pubnub.publish({ //Publishes the turn message to my PubHub Device. channel:channel, message:{ "topic":topicname, "command":commandvalue, "id":JSON.parse(body).email } }).then((response) => { console.log("message Published w/ timetoken", response.timetoken); if (speechOutput) iresponse.tell(speechOutput); }).catch((error) => { console.log("publishing failed w/ status:", error); iresponse.ask("Sorry, I didn't catch what you said"); }); }); });}/// Extend AlexaSkillArduinoHomeSkill.prototype =Object.create(AlexaSkill.prototype);ArduinoHomeSkill.prototype.constructor =ArduinoHomeSkill;ArduinoHomeSkill.prototype.eventHandlers.onSessionStarted =function(sessionStartedRequest, session) { // SetUserID(); console.log("ArduinoHomeSkill onSessionStarted requestId:" + sessionStartedRequest.requestId + ", sessionId:" + session.sessionId); // console.log("Init..."); //Delete all listeners and suscribes defined pubnub.removeListener(mqttListener); pubnub.unsubscribeAll(); // console.log("Init...Ok");};//-------->This is invoked by invocation word "Arduino Home"ArduinoHomeSkill.prototype.eventHandlers.onLaunch =function(launchRequest, session, response) { console.log("ArduinoHomeSkill onLaunch requestId:" + launchRequest.requestId + ", sessionId:" + session.sessionId); //if no amazon token, return a LinkAccount card if (session.user.accessToken ==undefined) { response.tellWithCardLink('To start using this skill, please use the companion app to authenticate on Amazon.'); возвращение; } var speechOutput ="Welcome to Arduino Home Controller. What would you like to do?"; var repromptText ="I am ready"; response.ask(speechOutput, repromptText);};ArduinoHomeSkill.prototype.eventHandlers.onSessionEnded =function(sessionEndedRequest, session) { console.log("ArduinoHomeSkill onSessionEnded requestId:" + sessionEndedRequest.requestId + ", sessionId:" + session.sessionId); console.log("End...");};//*** Define all intent handlersArduinoHomeSkill.prototype.intentHandlers ={ //*** AboutIntent handler "AboutIntent":function(intent, session, response) { var myText; console.log("in about"); myText ="Arduino Home Controller skil let you control internet connected devices. It controls Lights at room, kitchen, garage or living room), read a temperature sensor to scan home temperature, read Humidity sensor to scan home humidity, uses webcam to take a home security photo and sent it by email and activate an alarm to alert some events. It uses PubNub site to manipulate all messages send by Alexa with Lambda function. Please check information at skill page for more details. What would you like to do?"; response.ask(myText); возвращение; }, //*** LightIntent handler "LightIntent":function(intent, session, response) { var slotHabRooms =['room', 'kitchen', 'garage', 'living room']; var lightSlot =intent.slots.light; var lightSlotValue =lightSlot ? lightSlot.value :""; var whichSlot =intent.slots.which; var whichSlotValue =whichSlot ? whichSlot.value :""; if (lightSlotValue &&whichSlotValue &&slotStates.indexOf(lightSlotValue.toLowerCase())> -1 &&slotHabRooms.indexOf(whichSlotValue.toLowerCase())> -1) { SendMessage('Topic_' + whichSlotValue, lightSlotValue, "The light is now " + lightSlotValue, response); } else { response.ask("Sorry, I didn't catch what you said"); } }, //*** AlarmIntent handler "AlarmIntent":function(intent, session, response) { var alarmSlot =intent.slots.alarm; var alarmSlotValue =alarmSlot ? alarmSlot.value :""; if (alarmSlotValue &&slotStates.indexOf(alarmSlotValue.toLowerCase())> -1) { SendMessage('Topic_alarm', alarmSlotValue, "The alarm is now " + alarmSlotValue, response); } else { response.ask("Sorry, I didn't catch what you said"); } }, //*** TakePhotoIntent handler "TakePhotoIntent":function(intent, session, response) { SendMessage('Topic_photo', 'take', "Taken home photo ", response); }, //*** GetTemperatureIntent handler "GetTemperatureIntent":function(intent, session, response) { mqttListener ={ status:function(statusEvent) {}, message:function(message) { // handle message console.log("Receive=", message); var myText ="Inside Temperature is " + message.message + " degrees C"; response.tell(myText); }, presence:function(presenceEvent) { // handle presence } }; pubnub.addListener(mqttListener); pubnub.subscribe({ channels:[channel2] }); SendMessage('Topic_temperature', 'Ok', null, response) }, //*** GetTemperatureIntent handler "GetHumidityIntent":function(intent, session, response) { mqttListener ={ status:function(statusEvent) {}, message:function(message) { // handle message console.log("Receive=", message); var myText ="Inside Humidity is " + message.message + " %"; response.tell(myText); }, presence:function(presenceEvent) { // handle presence } }; pubnub.addListener(mqttListener); pubnub.subscribe({ channels:[channel2] }); SendMessage('Topic_humidity', 'Ok', null, response) }, //*** HelpIntent handler "AMAZON.HelpIntent":function(intent, session, response) { response.ask("With Arduino Home Controller skill and Alexa you can control internet connected devices using an Arduino Yun or Arduino with Ethernet Shield. Please check information at skill page for more details. What would you like to do?"); }, //*** StopIntent handler "AMAZON.StopIntent":function(intent, session, response) { response.tell("Thanks for using Arduino Home Controller. Bye see you later"); }, //*** StopIntent handler "AMAZON.CancelIntent":function(intent, session, response) { response.tell("Thanks for using Arduino Home Controller. Bye see you later"); }, default:function(intent, session, response) { response.ask("Try again"); },};// Create the handler that responds to the Alexa Request.exports.handler =function(event, context) { try { access_token =event['context']['System']['user']['accessToken']; url ='https://api.amazon.com/user/profile?access_token=' + access_token; //console.log("Access Token:", access_token); } catch (error) { console.log(error); } // Create an instance of Arduino Home Skill var ArduinoHomeControl =new ArduinoHomeSkill(); ArduinoHomeControl.execute(event, context); //console.log('AWSrequestID =', context.awsRequestId);};
Github
https://github.com/jcruzp/ArduinoHomeController

Схема

Main board with reles, temperature and humidity sensor, buzzer alarm and webcam.

Производственный процесс

  1. Веб-контроллер DMX
  2. Цифровые игральные кости Arduino
  3. Игровой контроллер Arduino
  4. Игра Pixel Chaser
  5. Система полива домашних растений
  6. Отталкивающая электромагнитная левитация Arduino
  7. Контроллер вакуумного люминесцентного дисплея
  8. Автономный домашний робот-помощник
  9. NeoMatrix Arduino Pong
  10. Контроллер тестера Arduino DMX-512