工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Alexaによってアクティブ化されたArduinoホームコントローラー

コンポーネントと消耗品

>
Arduino Yun
× 1
>
ControlEverything.comI2C用4チャンネルリレーコントローラー
× 1
DHT11温度および湿度センサー(4ピン)
× 1
抵抗10kオーム
× 2
SparkFunRedBotブザー
× 1
汎用トランジスタNPN
× 1
LM2596DCからDCへのバックコンバーター
× 1
Amazon Alexa Echo Dot
× 1
Arduinoプロトシールド
× 1
Usb WebCam
× 1
ホワイトジャンクションボックス200mmx155mmx80mm
× 1

必要なツールとマシン

>
はんだごて(汎用)

アプリとオンラインサービス

>
Arduino IDE
Amazon AlexaAlexaスキルキット
Amazon Web Services AWS Lambda
PubNubパブリッシュ/サブスクライブAPI

このプロジェクトについて

概要

AmazonがAlexaやAmazonEcho Dotなどのデバイスを市場に投入すると、自然言語を使用した音声コマンドで制御される優れたスマートホームを作成するためのオプションが無限に広がります。

このプロジェクトでは、多くのセンサーやデバイスをインターネットに接続できるArduinoホームコントローラーを作成し、AmazonAlexaスキルを使用してそれらを制御できます。

私のスキル「 Arduinoホームコントローラー」をインストールして有効にすることができます 「簡単なステップ、またはこのチュートリアルでスキルをガイドすることができます。

今のところ、制御します:

  • 部屋、ガレージ、キッチン、リビングルームに4つのライトがあります。
  • 温度および湿度センサー。
  • ブザーアラーム。
  • セキュリティ写真を撮り、メールで送信するWebCam。

この短いビデオデモでは、Arduinoホームコントローラーの動作を見ることができます。デモとビデオの提案では、各家の部屋の電球をシミュレートするプロトボードで4つのLEDを使用します。

リモートモジュールを使用してライトをアクティブにしたい場合は、私の Arduinoホームコントローラーリモートモジュールを表示できます。 このURLでプロジェクトします。

ブロック図

ブロック図の画像 このプロジェクトの4つの主要なコンポーネントを見ることができます:

1.- Amazon Echo Dot 音声コマンドを受信して​​AWS(Amazon Web Service)に送信します。

2.- AmazonスキルとLambda関数を備えたAWS すべてのコマンドを解釈します。

スキル名は「 Arduinoホームコントローラー」です。 「後でアクティブ化できます。

3.- MQTTブローカー PubNub(c)クラウドを使用します。

このブローカーは、2つのチャネルで制御メッセージを受信します。1つは設定値用で、もう1つはセンサーから値を読み取るためのものです。

PubNubでアカウントを作成する必要はなく、デモの提案に私のアカウントを使用できます。

4 .- ホームコントローラー ArduinoYunを使用しています。

Arduino Yunを使用するのは、内部にイーサネットシールドがあり、いくつかのアクションを処理するためにpythonを実行する小さなLinuxマシンがあるためです。

ライトのリレーを制御し、温度と湿度のセンサーを読み取り、アラームのブザーをオンにし、ウェブカメラを操作してセキュリティ写真を撮ります。

リモートモジュールについては、私の補足的な Arduinoホームコントローラーリモートモジュールを参照してください。 このURLでプロジェクトします。

<図>

必要なすべてのソフトウェアをインストールします

この時点で、デモ提案用に2つのオプションを選択できます。1つは私のAlexaスキルを使用してインストールし、それを使用するか、オプション2を使用して個人的なスキルを作成できます。

この url でAlexaアプリを閲覧する メニューの[スキル]セクションで、 Arduino を検索します。 リストには、名前の付いたスキルが「 Arduino Home Controller 」であることがわかります。 "、スキルカードをクリックし、[有効にする]ボタンをクリックしてインストールします。

<図>

または、この リンクを使用してAmazonスキルストアにアクセスする必要があります [有効にする]ボタンを押します

<図>

Arduinoに送信されるすべてのコマンドのIDのようなメールアドレスを使用するため、Amazonアカウントをリンクする必要があります。このアドレスを使用してメールを送信することはなく、IDのようにのみ使用することに注意してください。

<図> <図> <図>

スキルがインストールされ、Amazonアカウントにリンクされ、AWSクラウドのラムダ関数に接続されます。

1.- 作成 a スキル

サイトhttps://developer.amazon.com/home.html

で登録し、無料の開発者アカウントを作成する必要があります

1.1.-ログインが Alexa に移動したら メニューオプションを選択し、 Alexa Skills Kit で選択します 「はじめに」ボタン

<図>

1.2.-次に、[新しいスキルの追加]ボタンをクリックして、新しいスキルを作成します。

<図>

1.3 .- 新しいAlexaスキルを作成する 必要なセクション:

  • 選択:カスタムインタラクションモデル
  • 言語英語米国
  • 名前 TestSkill 店舗での検索に使用するスキル名です。
  • 呼び出し名テストスキル は、 Alexa Ask、アラームをオンにするテストスキルなどの音声コマンドを開始するための名前です。
  • すべてのグローバルフィールドがすべて[オプションなし]に設定されている
  • [保存]をクリックします
<図>

新しいスキルが作成され、新しいフィールドが表示されます アプリケーションID

  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 "}、{" slot ":[{" name ":" alarm "、" type ":" States "}]、" intent ":" AlarmIntent "}、{" intent ":" TakePhotoIntent "}、{" intent ":" GetTemperatureIntent "}、{" intent ":" GetHumidityIntent "}、{" intent ":" AboutIntent "}、{" intent ":" AMAZON.HelpIntent "}、 {"intent": "AMAZON.CancelIntent"}、{"intent": "AMAZON.StopIntent"}]}  

カスタムスロットタイプでStatesやHabRoomsなどの必要なスロットを定義します。

<図>

<図>

<図>

サンプル発話で会話モデルのようにすべての発話を定義します 、このリストをコピーして貼り付けます。

<図>
  LightIntent Turn {which} light {light} LightIntent Set {which} light {light} AlarmIntent Turn alarm {alarm} TakePhotoIntent Take a PhotoTakePhotoIntent Take Security PhotoGetTemperatureIntent Read TemperatureGetHumidityIntent Read HumidityAboutIntent Tell me aboutAboutIntent About  

次のセクション構成に進む前に スキルとラムダ関数の両方をリンクする必要があるため、ラムダ関数を作成する必要があります。

2.-ラムダ関数を作成します

AWSコンソールでアカウントを登録して作成する必要があります。URLhttps://aws.amazon.com/console/

<図>

2.1 .- サービスを選択します in トップ メニュー およびラムダ 左側のバーメニューにあります。

<図>

2.2.-左側のバーで機能を選択します 「関数の作成」ボタンをクリックします。

<図>

<図>

2.3.-このデータを設定します:

  • クリック 作成者 ゼロから
  • 名前: TestSkillLambda
  • 実行時間: Node.js.6.10
  • 役割: カスタムロールを作成する

これにより、次の値を選択する必要がある新しいウィンドウが開きます。

  • IAMの役割: Lambda_Basic_Execution
  • ポリシー名: 「新しい役割ポリシーの作成」で、ポリシーを編集して次のように貼り付けます。
  {"Version": "2012-10-17"、 "Statement":[{"Effect": "Allow"、 "Action":["logs:CreateLogGroup"、 "logs:CreateLogStream"、 "logs:PutLogEvents"]、 "Resource": "arn:aws:logs:*:*:*"}、{"Effect": "Allow"、 "Action":["iot:UpdateThingShadow"]、 "Resource" : "*"}]}  
<図>

保存するには、[追加]ボタンを押して、関数の作成に戻ります。 ページを開き、 lambda_basic_execution を選択します 既存の役割 フィールド。

<図>

2.4.- TestSkillLambda 関数が作成され、そのデザイナーページが表示されます。

<図>

2.5.-左側のメニューバーから選択 Alexaスキルキット トリガーの追加に追加します 区切られた領域。

<図>

Alexa Skills Kit をクリックします ボックスを下にスクロールして、トリガーの構成までスクロールします。 オプションで、有効を選択します およびスキルID フィールドコピーアンドペースト アプリケーションID 後で値を保存します。チュートリアルのセクション番号1.3を参照してください。

現時点では、アプリケーションまたはスキルIDを使用してラムダ関数をスキルにリンクしています。

<図>

[保存]ボタンと Alexaスキルキットを押します 保存され、ラムダの既知のスキルが機能し、リンクされます。

<図>

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リソース名)が表示されます。これは、構成で使用するラムダ関数のIDです。 スキルページのセクション。

<図>

3.-スキルの定義に戻る

3.1 .- 構成を選択します セクション、 EndPoint AWS LambdaARNを選択します 上記のARN文字列をコピーしてデフォルトに貼り付けます 分野。これは、スキルとラムダ関数をリンクする最後のアクションです。スキル既知の関数ラムダであり、リンクされています。

<図>

3.2 .- アカウントリンクまで下にスクロールします セクションを作成し、最初の2つのリダイレクトURL をコピーします セキュリティプロファイルを構成するためにそれらが必要です。

<図>

スキルの設定を続行する前に、AlexaアプリでスキルとAmazonアカウントをリンクするために使用されるセキュリティプロファイルを定義する必要があります。

4.-セキュリティプロファイルを作成する

スキルの作成に使用したのと同じ開発者コンソールで、アプリとサービスを選択します および Amazonでログイン ボタン「作成」を押します a 新規 セキュリティ プロフィール "

<図>

4.1 .- セキュリティプロファイル管理 このページでは、スキルをAmazonアカウントにリンクするために、すべてのOAuth2.0セキュリティを備えたプロファイルを作成できます。

<図>

4.2.-すべてのフィールドにこのデータを入力します:

  • セキュリティプロファイル名 :TestSkillProfile
  • セキュリティプロファイルの説明 :TestSkillが使用するプロファイル
  • 同意プライバシー通知URL :https://www.amazon.com/gp/help/customer/display.html?nodeId =201809740これはあなたが使用しなければならない例です。
  • [保存]ボタンをクリックします。
<図>

4.3.-すべてのデータを保存するか、セキュリティプロファイルを編集すると、2つの新しいフィールドに重要なデータが表示されます。 クライアントID および クライアントシークレット 。エンドスキルの構成に必要です。

<図>

4.4.-ホワイトリストのURLを定義し、タブ Web設定を選択します。

  • 許可されたオリジン :https://layla.amazon.comおよびhttps://pitangui.amazon.com
  • 許可されるリターンURL :セクション3.2の最初の2つのURLを追加します
<図>

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
  • クライアントID クライアントID をコピーして貼り付けます セクション4.3から。
  • 範囲プロファイル 、このURLで説明を参照してください。
<図>

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 oJpgアイコン 108x108ピクセル
  • Png oJpgアイコン 512x512ピクセル
<図>

5.4.-最後のセクションプライバシーとコンプライアンス

<図>

6.-AlexaアプリにTestSkillをインストールする

6.1-スキルを保存すると、https://alexa.amazon.com/のAlexaアプリにアクセスして、左側のバーメニューで[スキル]オプションを選択できます。 、右上の「あなたのスキル」ボタンをクリックし、フィルター Dev Skills TestSkill を見ることができます カード。アカウントリンクの必要なメッセージに注意してください。

<図>

6.2.-カードをクリックすると、 TestSkill 説明ページにスキルに関するすべての情報が表示されたら、[有効にする]ボタンをクリックします。

<図>

6.3.-アカウントのリンクに必要な定義があるため、スキルをAmazonアカウントにリンクするためにAmazonログイン資格情報ページにリダイレクトする必要があります。

<図>

ログイン情報が検証されると、スキルがAmazonアカウントにリンクされていることを示すこのページが表示されます。

<図>

6.4.-スキルが終了し、インストールされ、Amazonアカウントにリンクされ、Lambda関数に接続されます。

Alexa、テストスキルを尋ねると言ってテストできます すべてのダイアログが同じであるため、Arduino HomeControllerへようこそ。

<図>

Config Arduino Yun

Arduino Yunを初めて使用する場合は、スケッチをアップロードする前に準備する必要があります。

GregBauguesのガイドまたはチュートリアル「ArduinoYun入門–Wi-Fiを備えたArduino」を参照することをお勧めします。このガイドを見つけてくれたHacksterユーザー@BenEagenに感謝します。

写真を撮ってメールを送信するには、追加のソフトウェアをインストールする必要があります。また、USBカメラをテストして、ドライバーが正しく機能しているかどうかを確認します。 ArduinoYunのusbポートにUSBウェブカメラを接続してください。

これを行うには、ターミナルでArduino Yunに接続します:

  ssh [email protected]  

デフォルトのパスワードはarduinoです。

接続に問題がない場合は、OpenWRTLinuxプロンプトが表示されます。

<図>

インストール 画像生成 ソフトウェア

パッケージマネージャーの更新から始めます:

  oppkg update  

UVCドライバーをインストールします:

  oppkg install kmod-video-uvc  

python-opensslパッケージをインストールします:

  oppkg install python-openssl  

ターミナルから写真を撮るために使用するfswebcamユーティリティも必要です:

  oppkg install fswebcam  

SDカードがArduinoYunにマウントされていることを確認し、次のコマンドを実行してテストできます:

 マウント 
<図>

デバイスリストに / dev / sda1 on / mnt / sda1 type vfat <​​/ strong>のようなものが表示されている場合 SDカードは大丈夫です。

カメラをテストして写真を撮るのはとても簡単です。次のように入力するだけです:

  cd / mnt / sda1fswebcam test.png  

いくつかの情報といくつかのエラーが表示されるはずですが、心配する必要はありません。重要なのは、次の行を確認することです。

  --- / dev / video0を開いています...ソースモジュールv4l2を試しています... / dev / video0を開いています。 

写真が正しく撮影されたことを確認するには、Arduino YunからSDカードを取り外し、コンピューターを使用して読み取ります。 SDカード「 test.png 」のルートに画像が表示されます。 "。

開くだけで、正しく撮影され、破損していないことを確認できます。

インストール メールソフトウェアを送信する

コンピューターのSDを使用して、PythonファイルAHC_SendEmail.pyをコピーし、Gmailアカウントの11、12、13行目からメールアドレスとパスワードを変更します。別のメールプロバイダーがある場合は、36行目でサーバー情報を変更します。

<図> <図>

コンピューターからSDを抽出し、ArduinoYunのSDスロットに挿入します。 Arduino Yunに接続されている端末で、次のコマンドを実行します:

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

すべて問題がない場合は、写真が記載されたメールを受信する必要があります。

すべてのデバイスをArduinoYunに接続します

電子回路図に基づいて、すべてのデバイス、特にDHT11センサーを接続します。これは、アラーム音をテストするために温度と湿度およびブザーを読み取る必要があるためです。

インストール スケッチ ファイル ArduinoHomeMQTT.ino

libraries.zip を作成します このファイルに必要なすべてのライブラリを含むファイル。GitHubサイトからダウンロードして、ArduinoIDEライブラリディレクトリで解凍できます。

libraries.zip に含まれるライブラリ ArduinoHomeMQTT 内 フォルダ。

  ArduinoJson-> Jsonコンテンツの操作に使用DHT_sensor_library-> DHTセンサーの処理に使用pubsubclient-master-> PubNub(c)への接続、公開、サブスクライブに使用 

Arduino IDE 1.6.xを開き、ツールで[ボード:ArduinoYun]を選択します。

ファイルをロードします ArduinoHomeMQTT.ino IDEで、Amazonアプリスキルのリンクされたアカウントが有効になっているときに使用されるAmazonメールで16行目を変更します。

<図>

このオプションは、AWSがMQTTメッセージをブローカーに送信するときにコントローラーを識別します。

50行目をuuidに変更して、PubNub(c)でコントローラーを識別します。このサイトにアクセスできます オンラインで生成されたペーストuuidをコピーします。

<図>

スケッチを保存してアップロードします。ArduinoIDEモニターウィンドウを開くと、Arduino YunがPubNub(c)ブローカーに接続され、センサーが初期化されていることがわかります。

<図>

Alexa EchoDotからのすべての発話をテストします

Alexaスキル「 Arduinoホームコントローラー "スキルはこの発話のリストを処理します 、説明セクションのAlexaアプリスキルでそれらを見ることができます。すべてをテストし、Arduino IDシリアルモニターで受信してPubNub(c)ブローカーに送信するすべてのメッセージを確認できます。

照明制御:

  ==> "アレクサ、arduinoの家に部屋の明かりをつけるように頼む" ==> "アレクサ、arduinoの家に部屋の明かりを消すように頼む" ==> "アレクサ、arduinoの家に台所の明かりをつけるように頼む"==>"アレクサ、アルドゥイノの家にキッチンの照明を消してもらいます "==>"アレクサ、アルドゥイノの家にガレージの明かりを消してもらいます "==>"アレクサ、アルドゥイノの家にガレージの明かりを消してもらいます "==>" Alexa、arduinohomeにリビングルームのライトをオンにするように依頼する "==>" Alexa、arduinohomeにリビングルームのライトをオフにするよう依頼する " 

アラーム制御:

  ==>「アレクサ、arduinoホームにアラームをオンにするように依頼する」==>「アレクサ、arduinoホームにアラームをオフにするよう依頼する」 

スキャンの温度と湿度:

  ==>「アレクサ、arduinoの家に温度を読んでもらいます」==>「アレクサ、arduinoの家に湿度を読んでもらいます」 

セキュリティ写真を撮る:

  ==>「アレクサ、arduinoの家に写真を撮ってもらいます」 

についてとヘルプ

  ==>「アレクサ、arduinoホームに聞いて」==>「アレクサ、arduinoホームヘルプに聞いて」 
<図>

ソフトウェアの詳細

このプロジェクトのすべてのファイルは、私のGithubサイトからダウンロードできます。

フォルダには説明が含まれています

ArduinoHomeMQTT -> Arduino Yun HomeControllerのinoファイルとライブラリ

ラムダ -> AWS LambdaにデプロイされるNode.jsのLambda関数には、必要なすべてのnode_modulesが含まれています。「すべてのソフトウェアのインストール」セクションのオプション2を参照してください。

python ->写真を添付し​​てメールを送信するためのPythonファイル。

回路図 -> Fritzing(c)電子回路図ファイル。

Arduinoホームコントローラーワークフロー 表示 あなた ファイルの相互作用

(1)Amazon Echo Dotはコマンド音声を送信し、 Arduino HomeControllerスキルによって受信されます。

(2)スキル呼び出しLambda関数ファイル index.js

(3)Lambda関数ファイルはNode.Jsの開発者であり、いくつかのノードモジュールを使用します アマゾンウェブサービス(AWS)でホストされていました。

(4)ラムダ関数はすべてのインテントを解釈し、それらをMQTT Jsonメッセージに変換して、 PubNub(c)ブローカーに送信します。 このメッセージの形式は次のとおりです:

  {"topic":Topic_xxxx、 "command":オンまたはオフ、 "id":メールアドレス}  

トピック Topic_xxxx 可能性があります:

  Topic_room->部屋lightTopic_livingroomをオン/オフ->リビングルームlightTopic_kitchenをオン/オフ->キッチンlightTopic_garageをオン/オフ->ガレージlightTopic_alarmをオン/オフ->オン/オフオフalarmTopic_temperature->温度を読み取るTopic_humidity->湿度を読み取るTopic_photo->写真を撮ってメールで送信 

コマンドはオンである可能性があります またはオフ

(5)メッセージはチャネル AHC_IOC_01を使用して送信されます。 チャネル AHC_IOC_02 温度または湿度の値を受け取るために使用されます。

( 6 ) The Arduino Yun sketch ArduinoHomeMQTT.ino connect to broker and subscribe or publish to channels and receive or send messages.

( 7 ) Using a bridge 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 + uu id;const 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(); delay(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, r es => { res.setEncoding("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. Web操作のDMXコントローラー
  2. Arduino Digital Dice
  3. Arduinoゲームコントローラー
  4. ピクセルチェイサーゲーム
  5. 観葉植物の散水システム
  6. Arduinoの反発電磁浮上
  7. 真空蛍光表示管コントローラー
  8. 自律型ホームアシスタントロボット
  9. NeoMatrix Arduino Pong
  10. ArduinoDMX-512テスターコントローラー
  11. LEDルーレットゲーム