物理的なホームオートメーションインターフェイス
コンポーネントと消耗品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 7 |
このプロジェクトについて
<図> <図> <図> <図>
このプロジェクトの簡単な説明については、以下の2つのビデオを参照してください。
インターフェースは情報を伝達し、ユーザーが物事を制御できるようにします。ほとんどのホームオートメーションプラットフォームは、「仮想インターフェイス」に依存しています。スマートフォンを取り出してアプリを開くと、家の様子を確認したり、照明のオンとオフを切り替えたりできます。あなたが離れているとき、それはうまくいきます。ただし、仮想表現を確認し、ディスプレイ上の情報を解析するには作業が必要です。集中力が必要で、直感的ではありません。
私は「物理的なインターフェース」を作りたかったのです。これは、実際の家で知りたいことを物理的に模倣した小さなモデルハウスです。ですから、ガレージのドアを開けたら、モデルのガレージのドアも開けて欲しいです。このモデルハウスは私のコーヒーテーブルに座ることができ、寝る前にガレージのドアが開いたままになっているかどうかを一目で確認できます。または、これを職場の机に置いて、VPN経由で自宅に接続することもできます。仕事をしていると、玄関のドアが開いたままになっていないか一目でわかります。この物理的なインターフェースは、私が作るのと同じくらい創造的または実用的である可能性があります。
<図>それで、次のステップで、私は
- モデルハウスを構築して、ドアの位置、エネルギー使用量、ライトが点灯したままになっているかどうかなどを表示します。
- Open Energy Monitor Arduinoライブラリを使用してエネルギーモニターを構築し、エネルギー使用情報をモデルハウスとOpenHABに提供します
- モデルハウスにドア/窓の位置を送信する方法をいくつか提供します。ウィンクハブとウィンク「トリッパー」接触センサーデータをDIYホームオートメーションシステムでどのように利用できるかを示します。
- WinkとArduinoを使用して、実際のガレージドアを開閉したり、ライトのオンとオフを切り替えたりするなどの出力を実行します。
モデルハウスには、Arduinoコントローラーに配線されたいくつかのサーボとLEDがあります。このコントローラーは、ドアの位置とエネルギー使用量を示すMQTTメッセージをサブスクライブし、それに応じてサーボを作動させます。ライトがオンかオフかを示すLEDについても同じ考えです。このセンサー情報をMQTTブローカーに取得するためのオプションがいくつかあるため、後の手順で詳しく説明します。その真ん中には、MQTTブローカー(Mosquitto)とOpenHABを実行しているRaspberryPiがあります。モデルハウスを実行するためにOpenHABは必要ありませんが、スマートフォンアプリのインターフェイスを提供し、リモート監視と操作を可能にする必要があります。物理的なインターフェースが欲しいからといって、仮想的なインターフェースを捨てる準備ができているわけではありません。
モデルハウスにも2つのボタンがあります。ボタンの1つで、zigbee電球のオン/オフを切り替えます。もう1つのボタンは、(REALハウスの)ガレージドアを開閉します。
パート1:住宅建設
1)モデルハウスを建設する
2)制御オプション、配線、およびコード
パート2:入力(センサー)
3)センサー:エネルギーモニター
4)センサー:DIYセンサーノードオプション
5)センサー:ウィンクハブとトリッパー接触センサー
パート3:出力
6)ライト
7)ガレージドアオープナー
ステップ1:モデルハウスの建設
<図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図>
このステップを規範的にするつもりはありません。アートやクラフトに関してはかなり成熟しているので、モデルハウスをどのように建てたかを紹介します。自分の住居に似せて、気になることを反映するように構築することをお勧めします。ここには創造性の余地がたくさんあります。この写真の一部のコンポーネント(変流器など)は、後の手順で使用されます。
コンポーネント :
- (1)ボックス。どのくらいの大きさで、どのような比率になるかはあなた次第です。
- (3)Tower ProSG90サーボhttp://www.dx.com/p/towerpro-sg90-9g-mini-servo-w ...
- (2)小さなヒンジhttp://www.homedepot.com/p/Stanley-National-Hardw ...
- (一部)接着剤。 3Mフックのダブルスティック接着剤を使用しました。
- ArduinoYunまたはArduinoUno w /イーサネットシールド。
- ボタンhttp://www.radioshack.com/mini-spst-1-5-amp-moment ...
- 家の周りに敷設するもの
屋根
ボックスのサイドフラップの1つを切り取り、もう1つの(まだ取り付けられている)サイドフラップに取り付けて屋根を形成しました。私は小さな箱を使って直角の構造を提供し、後でレゴのピースでそれをよりよくサポートしました。家の周りにあるものなら何でも使って、この直角を作ることができるでしょう。
<図> <図>ドア/窓
見せたいドアの穴を開けます。ダブルスティックテープでドアにヒンジを1つか2つ取り付けて、家に取り付けます。派手なことは何もないので、家の周りで手に入れたものを自由に即興で作ってください。フック付きの3M両面フォーム接着剤を使用しました。また、これらのフォーム接着ストリップを使用してサーボモーターを取り付けました。ガレージドアの場合、サーボモーターアームがガレージドアを開き、重力によってガレージドアが閉じます。フロントドアは、サーボアームがドアを開けられるように、ヒンジ付きドアに紐を付ける必要がありました。表示されている黄色のレゴピースは、サーボをヒンジからオフセットするためにあります。
<図> //www.youtube.com/embed/z-xyVXUSqNMエネルギーメーター
特別なことは何もありません。矢印のようなものを切り取ってサーボアームに取り付けるだけです。漠然と低木のように見える形を切り取り、キロワットの目盛りでマークアップし、低木を挟んでサーボモーターをボックスに摩擦で取り付けます。
<図>エネルギー消費サーボの上に、赤いLEDをテープで貼りました。
ライトとガレージドアを制御するための2つのボタンもあります。これらは瞬間的なボタンです。ボタンは、段ボール箱の壁に固定するために、外側にナットが付いています。反対側には、はんだ付けするワイヤの金属接点があります。
<図> <図>ステップ2:住宅建設-ワイヤーとコード
<図> <図> <図>配線
これが配線図です。私は箱の中の配線をかなり大きく混乱させました。どのワイヤがどのピンにあるかを知りたい場合:
- ステータスピンLED:7
- 照明インジケーターLED:4
- サーボ1(正面玄関):3
- サーボ2(ガレージドア):5
- サーボ3(エネルギー使用の低木):6
- ボタン1(ライトのオン/オフ):8
- ボタン2(ガレージドアの開閉):9
コントローラーオプション
使い慣れたものと手元にあるものを使用できます。より安価な($ 20)オプションは、ArduinoUnoクローンとイーサネットシールドを使用することです。私はそれから始めました、しかしそれは私をイーサネットケーブルにつなぎました。そこで、Arduino Yun($ 65)に切り替えました。はるかに高価ですが、wifiを使用する自由も与えてくれました。ユンは本当に使いやすかったです。あなたは基本的に:
- イーサネット経由でYunをルーターに接続します
- YunのWebページに移動します
- ルーターにパスワードと静的IPを設定する
- ユンのスケッチをダウンロード
以下に添付されているのは、ArduinoUnoとArduinoYunの両方のスケッチです。それらは非常に似ており、Yunで使用されているイーサネットブリッジを除いて、YunコードをUnoにコピーすることができます。ユンに切り替えた後、2つのコントロールボタンを追加しました。その結果、宇野スケッチにはこれらのボタンがありません。
最初のステップのビデオは、ArduinoYunを示しています。これは、宇野とイーサネットシールドを使用したビデオです。このビデオが作成されたとき、私はまだ2つのボタンをインストールしていませんでしたが、他のすべては同じように機能します。
//www.youtube.com/embed/7i6McpbU3Gs
ステップ3:センサー:エネルギーモニター
<図> <図> <図> <図> <図> <図> <図> <図>エネルギー使用量を表示できる物理インターフェイスができたので、家のエネルギー消費量を読み取り、その消費量をMQTTブローカーに公開するセンサーノードを構築する必要があります。これを行うにはいくつかの方法があります。 ArduinoYunを使用しています。これは最も複雑でない方法ですが、最も安価ではありません。必要に応じて、Arduino Uno、イーサネットシールド、およびワイヤレスルーターを使用してwifiブリッジとして機能させることができます。または、Open EnergyMonitorパッケージでPiを使用できます。ユン法についてのみ説明します。
<図> <図>私はebayから7ドルの変流器を使用しています。 YhdcSCT-013-000の100Aバージョンはここにあります。上の配線図に従って配線し、このステップの最後にArduinoYunスケッチをアップロードします。必ずMQTTブローカーのIPアドレスでコードを変更してください。 Open EnergyMonitorライブラリのこのページは参考になります。理想的なコンポーネントの値は次のとおりです。
- 負荷抵抗=33オーム
- 分圧器抵抗=10kオーム
- コンデンサ=10uF
私のエネルギーモニターの写真は、それらの正確なコンポーネントが手元になかったため、回路図と実際には一致していません。 33オームの負荷抵抗がなかったので、2つの68オームの抵抗を並列に使用する必要がありました。また、整流回路用の10uFコンデンサがなかったので、代わりに2つの22uFコンデンサを使用しました。直列等価容量は十分に近いです。
あなたの家の入ってくる相の1つに変流器を取り付けてください。私は100Aの変圧器を1つしか持っていなかったので、フェーズの1つだけを監視しています。最終的には、入力電力のもう一方のレッグと分岐回路を監視するために、より多くの変圧器を入手したいと思います。実際のアンペアメーターを使用して、私のDIYセットアップは、さまざまなアンプの読み取り値にわたって、常にアンプメーターの1アンペア上を読み取ります(上の5番目の画像を参照)。その余分なアンプを差し引くだけの非常に簡単なことです。
<図> <図>
OpenHAB
データが入ってくるので、データをグラフ化できるように、OpenHABにも表示することもできます。関連するOpenHAB構成は次のとおりです。
<図> <図>アイテムの定義
Number itm_smarthome_energy_amps "Energy(amps)[%。1f]" {mqtt ="<[mymosquitto:2853:state:default]"}
Number itm_smarthome_energy_watts "Energy(Watts)[ %.1f] "{mqtt =" <[mymosquitto:2852:state:default] "}
サイトマップ
Text label ="Energy" icon ="firstfloor"
{Frame label ="Energy Usage" {Text item =itm_smarthome_energy_amps
Text item =itm_smarthome_energy_watts
チャートitem =itm_smarthome_energy_watts period =h refresh =5000} //フレームエネルギー使用量
} //テキストlabel ="Energy"
永続性
チャートを使用しているので、エネルギー使用のためのある種の永続化戦略を定義する必要があります。 RRD4Jが最も使いやすいので、これが「/openhab/configurations/persistence/rrd4j.persist」用に用意されているものです。
戦略{
// rrdチャートの場合、cron戦略everyMinuteが必要です: "0 * * * *?"}アイテム{DemoSwitch、NoOfLights、Window_GF_Toilet、Heating * :strategy =everyChange、everyMinute、restoreOnStartup //温度値のみをrrdTemperature *、Weather_Chart *に保存しましょう:strategy =everyMinute、restoreOnStartup itm_smarthome_energy_watts:strategy =everyUpdate}
エネルギーモニター画面
<図> <図> energy_monitor_yun.inoステップ4:センサー:DIYワイヤレスセンサーノード
<図>ワイヤレス開閉センサーにはいくつかのオプションがあります。
以前のプロジェクトの1つでは、5ドルのワイヤレストランシーバーを使用して、MQTTゲートウェイを介してセンサーデータを送信しました。私はまだこのプロジェクトを使用してガレージドアのステータスをOpenHABに取得しています。デモビデオでは、実際にモデルハウスのガレージドアが実際のガレージドアのステータスを反映しています。詳細なコードと回路は、使用する場合はこのステップにあります。ちょっと醜いですが、誰も気付かないガレージにあります。
ライトが点灯したままかどうかを示すために使用している光センサーもあります。これも、このステップで詳しく説明した以前のInstructableからのものです。これは、フォトレジスターを使用して明るさ情報をワイヤレスでOpenHABに送り返すUberセンサーの一部です。この場合、私は単に光のレベルを示すMQTTトピックをサブスクライブしています。
<図>また、以前のInstructableと同じワイヤレストランシーバーとゲートウェイを使用するバッテリー駆動のリードスイッチセンサーも作成しました。しかし、それはあまり見栄えが良くありません。美的理由から、室内のドアや窓には実際には使用できません。したがって、この問題を克服するために、私はウィンクの見栄えの良い消費者向けリードスイッチセンサーを使用しています。それが次のステップにつながります。
<図> <図> //www.youtube.com/embed/uiD-HLezygI//www.youtube.com/embed/VKniJzIVHsIステップ5:センサー:ウィンクハブ
<図> <図> <図>このブログ投稿で、PHPエクスプロイトにアクセスするためにハブをルート化する方法を見つけた初期のWinkHubユーザーからの出来事がありました。このエクスプロイトを使用すると、「aprontest」ユーティリティを実行して、WinkHubとペアになっているものを制御できます。この方法を使用して、OpenHABインターフェースから照明を制御することができました。
Wink Hubをルート化することの最も興味深い利点は、ローカルを提供することです。 Winkサーバーにアクセスせずに、ライトとセンサーのステータスを制御します。 WinkHubとWinkAPIは、常にインターネットに接続してWinkサーバーに接続し、照明制御を行ったり、センサーのステータスを取得したりする必要があります。これで、このPHPエクスプロイトを使用して、照明とセンサーの操作をローカルLANに保持できます。それは素晴らしいことです。
<図>このステップの最後にPHPスクリプトを含めました。このファイルを開くことができない場合は、このリンクを試してください。このスクリプトはRaspberryPiで実行され、2つのウィンクトリッパーリードスイッチのステータスについてウィンクハブをポーリングします。このステータスは、RESTAPIを介してOpenHABに送信されます。 OpenHABは、これらのドア位置のMQTTトピックを公開します。次に、モデルハウスのコントローラーは、これらのドアの位置のトピックにサブスクライブすることにより、ドアを開閉します。
このステップで添付された3つのOpenHAB構成ファイル(アイテム、サイトマップ、およびルール)は、すべてを機能させるために必要です。これらは、ポーリングスクリプトがRESTインターフェイスを介して対話する連絡先アイテムを定義します。 OpenHABを介してzigbee電球を制御するためのサンプルスクリプトもあります。
//www.youtube.com/embed/tWKPcBOn1KM
スクリプトと構成ファイル。
ステップ6:出力:ライト
<図> <図>構成ファイルを説明した順序のため、前の手順では、物理インターフェイスとOpenHABインターフェイスの両方を介して「接続された電球」を制御するために必要なすべてのものがほぼ提供されました。ライトは、ウィンクハブがサポートする任意のライトにすることができます。現在、私はこれをCree ConnectedBulbとGEWinkライトでテストしました。どちらも期待どおりに機能します。光センサーとボタンがスマート電球をどのように制御するかをよりよく示すこのビデオをここに投げます。
//www.youtube.com/embed/KSDUEfro3Voステップ7:出力:ガレージドアオープナー
<図> <図> <図> <図> <図> <図>手順5で提供される構成ファイルには、ガレージドアを制御するために必要なOpenHABアイテムのほとんどが含まれています。しかし、ガレージのドアを実際に開閉するための何かが必要です。そのために、以前のInstructableの一部を変更しています。これらのコンポーネントを使用してガレージドアオープナーを作成しました:
- Arduinoクローン($ 10)
- イーサネットシールド($ 7)
- リードリレー($ 2)
- スペアガレージドアリモコン($ 22)
Arduinoは、ドライ接点を開閉することでリードリレーを制御します。予備のガレージドアオープナーのボタンは、リードリレーのドライ接点に配線されています。 Arduinoのピン5とGNDをリードリレーの2つのコイルピン(2つの外側のピン)に接続し、内側のリレーピンをガレージドアリモートのボタンに接続します。
ArduinoはMQTTトピックをサブスクライブし、open / closeコマンドを待ちます。このトピックを見ると、リードリレーが瞬間的にオンになり、予備のガレージドアのリモコンの「ボタン」が閉じます。 Arduinoのスケッチは下に添付されています。さらに、「garage_monitor_rules.txt」をルールファイルに追加します。これは、手順5で添付したルールに加えて必要です。私が使用した超音波センサー方式を使用しない場合、これは変更に合わせて変更する必要がある部分です。
//www.youtube.com/embed/CqbRosfqM3cガレージのドアがかなりきれいな場合、またはガレージのドアが開いたときに家の別の場所で何らかの音声アナウンスが必要な場合は、上記の追加のルールで音声ファイルを再生できます。最初のビデオデモで約30分で聞くことができます。
//www.youtube.com/embed/pdKfJtnpNzs
ステップ8:その他の考え
<図>このプロジェクトで下された決定は、私が使い慣れているツール、手元にあるパーツ、および物事をどのように機能させたいかについての私の優先順位を反映しています。おそらく、さまざまなツールセットがあり、さまざまなハードウェアコンポーネントをすぐに利用できます。ホームオートメーションがどのように機能するかについても、おそらくさまざまなアイデアがあります。
MQTTとOpenHABを使用する場合は多くの柔軟性があり、私が行ったように正確に行う必要はありません。モデルハウスの制御に使用されるコントローラーは、Arduino、Raspberry Pi、またはSparkcoreのフレーバーにすることができます。 DIYセンサーは、ArduinoまたはスタンドアロンESP8266にすることができます。唯一の制約は、センサーデータを何らかの方法でMQTTブローカーに公開する必要があることです。 OpenHABのインストールにUSBZ-waveスティックがある場合は、OpenHABをZ-waveからMQTTへのブリッジとして使用し、ドアセンシングにZ-waveセンサーを利用できます。
ウィンクの開閉センサーでさえ、別の方法で行うことができます。 Wink Hubをルート化しない場合は、Wink APIを使用してセンサーのステータスを取得してOpenHABに投稿するか、MQTTを介して直接投稿することができます。これにはWinkServerを使用する必要がありますが、ルート化されたハブの制約がなくなります。
だから、物事を違ったやり方で行う方法はたくさんあります。私は最小公分母であるハードウェアを使用する傾向があるので、Arduinoと段ボール箱です。
コード
- smarthome_yun.ino
- smarthome_ethernet.ino
- energy_monitor_yun.ino
smarthome_yun.ino プレーンテキスト
// Eric Tsai // 2015-04-13 //物理的なスマートホームインターフェイスを制御するためのArduinoYunコード//使用に合わせてMQTTトピック名を変更する// MQTTブローカーのIPアドレスを変更する// newyun include#include#include #include //イーサネットシールドを使用する場合の古いイーサネットインクルード/ *#include #include #include * /#include //イーサネットシールドのセットアップ/ * IPAddressip(192、168、2、36); byte mac [] ={0x90、0xA2、0xDA、0x0D、0x43、0x13}; byte server [ ] ={192、168、1、101}; EthernetClient ethClient; PubSubClient client(server、1883、callback、ethClient); * / unsigned long keepalivetime =0; unsigned long MQTT_reconnect =0; // yunclientを使用してnetworkYunClientyunにブリッジする; //イーサネットclientPubSubClientclient( "192.168.1.101"、1883、callback、yun); bool conn_ok; // MQTT接続ステータスを示すためにLEDを使用します。intledPin=4; //ライトを示しますonintstatusPin =7; // MQTTconnステータスを示します// servocontrolintservo1Pin =3; //フロントドアintservo2Pin =5; //ガレージdoorintservo3Pin =6; //エネルギー使用量meterServoservo1; // doorServoサーボ2; //ガレージdoorServoservo3; // energyint button1 =8; //フロントドアの上のボタンintbutton2 =9; //ガレージドアの上のボタン//サーボ操作:servosintのターゲット位置servo1_target =5; //ドア、closedintservo2_target =5; //ガレージ、closedintservo3_target =180; //エネルギー、180は「0」ワット、モーターは後方に取り付けられていますintservo1_pos_cur =5; intservo2_pos_cur =5; intservo3_pos_cur =180; // 180は「0」ワット、モーターは後方に取り付けられていますintservo1Opened =5; intservo1Closed =130; intservo2Opened =5; intservo2Closed =150; unsigned longservo1_time =0; unsigned longservo2_time =0; unsigned longservo3_time =0; / /ボタンでデバウンスするので、スパムを送信しませんpublishunsigned long button1_db =0; unsigned long button2_db =0; int button =0; int callback_flag =0; char buff_message [12]; // --------- -------------------------------------------------- ---- // MQTTコールバック//ここでMQTTメッセージに反応します// -------------------------------- ------------------------------- void callback(char * topic、byte * payload、unsigned int length){//変換intへのトピック。 int mytopic =atoi(トピック); //Serial.print(mytopic); //ペイロードをintペイロードに変換します[長さ] ='\ 0'; //行returnを追加して、atofが正しく解析できるようにしますfloat mymsg =atof((const char *)payload); // led if(mytopic ==2822){if(mymsg ==1){digitalWrite(ledPin、HIGH); } if(mymsg ==0){digitalWrite(ledPin、LOW); }} //サーボ1、正面玄関if(mytopic ==2832){if(mymsg ==1)//オープン{//Serial.println("servo1opened ");サーボ1_ターゲット=servo1Opened; } if(mymsg ==0)//クローズ{//Serial.println("servo1closed ");サーボ1_ターゲット=servo1Closed; } //Serial.println(servo1_target); } / * // 2番目のガレージドア信号 "closed" =off =send 1 "open" =on =send 0 * / //サーボ2、ガレージドアif(mytopic ==2842){if(mymsg ==1)/ / opens {servo2_target =servo2Opened; } if(mymsg ==0)//クローズ{servo2_target =servo2Closed; } // callback_flag =1; // servo3_target =mymsg; } //サーボ3、エネルギーメーターif(mytopic ==2852){//メッセージ=ワット//最大および最小メーターにバインドされたワットif(mymsg> 6000){mymsg =6000; } if(mymsg <0){mymsg =0; } // 180度から0度までのバイアスメーター// 180度から0度=0ワットから6000ワット、たとえば//最大ワットを適切な値に設定します。 Servo3_target =180-((1-((6000-mymsg)/ 6000))* 180)-25; callback_flag =1; }} // end callbackvoid setup(){pinMode(ledPin、OUTPUT); // pinMode(statusPin、OUTPUT);のライトを示すLED pinMode(button1、INPUT_PULLUP); //プルアップ抵抗を使用し、ロジックを反転しますpinMode(button2、INPUT_PULLUP); //プルアップ抵抗を使用し、ロジックを反転しますdigitalWrite(ledPin、HIGH); //ユンブリッジBridge.begin(); // MQTTブローカーに接続client.connect( "yun smarthome"); client.publish( "watch"、 "Smart Home Connected!"); keepalivetime =millis(); //Wire.onReceive(receiveEvent); MQTT_reconnect =millis(); //client.subscribe("# "); //サブスクライブをテストしますclient.subscribe( "2822"); // LED client.subscribe( "2832"); //サーボ1トピックclient.subscribe( "2842"); //サーボ2トピックclient.subscribe( "2852"); //サーボ3トピックdigitalWrite(ledPin、LOW); //サーボservo1.attach(servo1Pin); Servo1.write(90); Servo2.attach(servo2Pin); Servo2.write(90); Servo3.attach(servo3Pin); Servo3.write(5);} // setupの終了voidloop(){client.loop(); // MQTT処理を実行するには、これが必要です//サーボポジショニングの場合、動きが速すぎないようにします。 //現在の位置からターゲット位置にクロールする必要があります//「delay」cmdの使用も避けてください。マイクロコントローラーがフリーズするだけです// servo 1 if((millis()-servo1_time)> 20){if(servo1_pos_cur> servo1_target){ Servo1_pos_cur =servo1_pos_cur-1; } if(servo1_pos_cur 20){if(servo2_pos_cur> servo2_target){servo2_pos_cur =servo2_pos_cur-1; } if(servo2_pos_cur 20){if(servo3_pos_cur> servo3_target){servo3_pos_cur =servo3_pos_cur-1; } if(servo3_pos_cur 3000)||(button1_db> millis())){button1_db =millis(); client.publish( "2862"、 "button1 yaya"); }} //ボタン2button =digitalRead(button2); if(button ==0)//反転ロジック{if(((millis()-button2_db)> 3000)||(button2_db> millis())){button2_db =millis(); client.publish( "2872"、 "button2 yaya"); }} // 60秒ごとにMQTTブローカーへのネットワーク接続を確認します。 //接続されなくなった場合は再接続if((millis()-MQTT_reconnect)> 60000){conn_ok =client.connected(); if(conn_ok ==1){digitalWrite(statusPin、HIGH); //Serial.println("MQTT接続OK "); } else {digitalWrite(statusPin、LOW); //Serial.println("MQTT NOT connected OK "); } //接続なし、再接続if(conn_ok ==0){client.disconnect(); delay(5000); while(client.connect( "smarthouse")!=1){digitalWrite(statusPin、LOW); //Serial.println("MQTTへの接続エラー "); delay(4000); } digitalWrite(statusPin、HIGH); } //Serial.println("MQTTに再接続 "); MQTT_reconnect =millis(); client.publish( "watch"、 "スマートホームハートビート!"); } // Mosquitto接続チェックの終了} //ループの終了
smarthome_ethernet.ino プレーンテキスト
// Eric Tsai // 2015-04-1 // Arduino Uno w /イーサネット、物理的なスマートホームインターフェイスを制御するためのコード//使用に合わせてMQTTトピック名を変更する// MQTTブローカーのIPアドレスを変更する#include#include #include #include // Ethernetbyte mac [] ={0x90、0xA2、0xDA、0x0D、0x43、0x13}; byte server [] ={192、168、1、101}; EthernetClient ethClient; PubSubClient client(server、1883、callback、ethClient); unsigned long keepalivetime =0; unsigned long MQTT_reconnect =0; bool conn_ok; // MQTT接続ステータスを示すためにLEDを使用します。 int ledPin =4; //ライトを示しますonintstatusPin =7; // MQTTconnステータスを示します// servocontrolintservo1Pin =3; //フロントドアintservo2Pin =5; //ガレージdoorintservo3Pin =6; //エネルギー使用量meterServoservo1; // doorServoサーボ2; //ガレージdoorServoservo3; //エネルギー//サーボ操作:サーボシントのターゲット位置servo1_target =5; //ドア、closedintservo2_target =5; //ガレージ、closedintservo3_target =180; //エネルギー、180は「0」ワット、モーターは後方に取り付けられていますintservo1_pos_cur =5; intservo2_pos_cur =5; intservo3_pos_cur =180; // 180は「0」ワット、モーターは後方に取り付けられていますintservo1Opened =5; intservo1Closed =120; intservo2Opened =5; intservo2Closed =150; unsigned longservo1_time =0; unsigned longservo2_time =0; unsigned longservo3_time =0; / / ------------------------------------------------- -------------- // MQTTコールバック//ここでMQTTメッセージに反応します// ---------------------- ----------------------------------------- void callback(char * topic、byte *ペイロード、unsigned int length){Serial.println( "received MQTT"); //トピックをintに変換します。 int mytopic =atoi(トピック); //Serial.print(mytopic); //ペイロードをintペイロードに変換します[長さ] ='\ 0'; //行returnを追加して、atofが正しく解析できるようにしますfloat mymsg =atof((const char *)payload); // MQTTメッセージを出力Serial.println( ""); Serial.print( "("); Serial.print(mytopic); Serial.print( "、"); Serial.print(mymsg); Serial.println( ")"); // led if(mytopic ==2822){if(mymsg ==1){digitalWrite(ledPin、HIGH); } if(mymsg ==0){digitalWrite(ledPin、LOW); }} //サーボ1、正面玄関if(mytopic ==2832){if(mymsg ==1)//オープン{Serial.println( "servo1opened");サーボ1_ターゲット=servo1Opened; } if(mymsg ==0)//クローズ{Serial.println( "servo1closed");サーボ1_ターゲット=servo1Closed; } Serial.println(servo1_target); } / * // 2番目のガレージドア信号 "closed" =off =send 1 "open" =on =send 0 * / //サーボ2、ガレージドアif(mytopic ==2842){if(mymsg ==1)/ / opens {servo2_target =servo2Opened; } if(mymsg ==0)//クローズ{servo2_target =servo2Closed; }} //サーボ3、エネルギーメーターif(mytopic ==2852){//メッセージ=ワット//エラーチェックif(mymsg> 6000){mymsg =6000; } if(mymsg <0){mymsg =0; } // 180度から0度までのバイアスメーター// 180度から0度=0ワットから6000ワット、たとえば//最大ワットを適切な値に設定します。 Servo3_target =180-((1-((6000-mymsg)/ 6000))* 180); // servo3_target =mymsg; }} // end callbackvoid setup(){//イーサネット//Ethernet.begin(mac、ip); //Wire.begin(MY_ADDRESS); Serial.begin(9600); Serial.println( "starting"); pinMode(ledPin、OUTPUT); // pinMode(statusPin、OUTPUT);のライトを示すLED digitalWrite(ledPin、HIGH); // IPアドレスを待つwhile(Ethernet.begin(mac)!=1){Serial.println( "DHCP経由でIPアドレスを取得中にエラーが発生しました。再試行しています..."); delay(5000); } Serial.println( "ethernet OK"); keepalivetime =millis(); while(client.connect( "smarthouse")!=1){Serial.println( "MQTTへの接続エラー"); // delay(3000); delay(4000); } MQTT_reconnect =millis(); Serial.println( "セットアップ完了"); client.publish( "smarthouse"、 "hello world"); //テスト公開//client.subscribe("# "); //サブスクライブをテストしますclient.subscribe( "2822"); // LED client.subscribe( "2832"); //サーボ1トピックclient.subscribe( "2842"); //サーボ2トピックclient.subscribe( "2852"); //サーボ2トピックdigitalWrite(ledPin、LOW); //サーボservo1.attach(servo1Pin); Servo1.write(90); Servo2.attach(servo2Pin); Servo2.write(90); Servo3.attach(servo3Pin); Servo3.write(5);} // setupの終了voidloop(){client.loop(); // MQTT処理を実行するには、これが必要です//サーボポジショニングの場合、動きが速すぎないようにします。 //現在の位置からターゲット位置にクロールする必要があります//「delay」cmdの使用も避けてください。マイクロコントローラーがフリーズするだけです// servo 1 if((millis()-servo1_time)> 20){if(servo1_pos_cur> servo1_target){ Servo1_pos_cur =servo1_pos_cur-1; } if(servo1_pos_cur 20){if(servo2_pos_cur> servo2_target){servo2_pos_cur =servo2_pos_cur-1; } if(servo2_pos_cur 20){if(servo3_pos_cur> servo3_target){servo3_pos_cur =servo3_pos_cur-1; } if(servo3_pos_cur 60000){conn_ok =client.connected(); if(conn_ok ==1){digitalWrite(statusPin、HIGH); Serial.println( "MQTT接続OK"); } else {digitalWrite(statusPin、LOW); Serial.println( "MQTTが接続されていませんOK"); } //接続なし、再接続if(conn_ok ==0){client.disconnect(); delay(5000); while(client.connect( "smarthouse")!=1){digitalWrite(statusPin、LOW); Serial.println( "MQTTへの接続エラー"); delay(4000); } digitalWrite(statusPin、HIGH); } //Serial.println("MQTTに再接続 "); MQTT_reconnect =millis(); client.publish( "smarthouse"、 "毎分ハートビート!"); } // Mosquitto接続チェックの終了} //ループの終了
energy_monitor_yun.ino プレーンテキスト
/ * EricTsai2015-04-22エネルギー使用をMQTTブローカーに公開するためのArduinoYunコードブローカーのIPアドレスの「PubSubClientクライアント」を変更します* /#include#include #include #include "EmonLib.h" // OpenEnergyMonitorプロジェクトライブラリintLED =3; EnergyMonitor emon1; //オープンエネルギーモニターunsignedlong MQTT_reconnect =0; unsigned long read_energy =0; double Irms; bool conn_ok; YunClient yun; //イーサネットクライアントと同等//実際にはコールバックする必要はありませんが、必要な場合に備えてください。voidcallback(char * topic、byte * payload、unsigned int length){digitalWrite(LED、HIGH); // LEDをオンにします(HIGHは電圧レベルです)delay(500); // 2番目のdigitalWrite(LED、LOW);を待ちます//電圧を低くしてLEDをオフにします} // yunclientを使用してnetworkPubSubClientclient( "192.168.1.101"、1883、callback、yun); // *************にブリッジします************************************************** ******* void setup(){//デジタルピン13を出力として初期化します。 pinMode(LED、OUTPUT); digitalWrite(LED、HIGH); // LEDをオンにします(HIGHは電圧レベルです)delay(1000); // 2番目のdigitalWrite(LED、LOW);を待ちます//電圧をLOWにしてLEDをオフにしますBridge.begin(); client.connect( "yun_energy"); client.publish( "watch"、 "Energy Monitor Connected!"); client.subscribe( "yun_energy"); digitalWrite(LED、HIGH); // LEDをオンにします(HIGHは電圧レベルです)delay(3000); // 2番目のdigitalWrite(LED、LOW);を待ちます//電圧をLOWにしてLEDをオフにしますemon1.current(5、60); //電流:入力ピン、キャリブレーション。} // ************************************** ******************************** void loop(){char buff_message [12]; // MQTT公開float値のメッセージバッファー; client.loop(); //これをすべてのループで実行してMQTT接続を維持しますIrms =emon1.calcIrms(1480); // Irmsのみを計算します。1480は、Irmsの読み取りを意味します。 // 10秒ごとに現在を公開します。 if(millis()-read_energy> 10000){//アンペア値=Irms; dtostrf(値、4、5、buff_message); client.publish( "2853"、buff_message); read_energy =millis(); //ワット値=Irms * 115; dtostrf(値、4、5、buff_message); client.publish( "2852"、buff_message); } // MQTT接続を維持するif((millis()-MQTT_reconnect)> 60000){conn_ok =client.connected(); if(conn_ok ==1){digitalWrite(LED、HIGH); } else {digitalWrite(LED、LOW); } //接続なし、再接続if(conn_ok ==0){client.disconnect(); delay(5000); while(client.connect( "yun_energy")!=1){delay(4000); } digitalWrite(LED、HIGH); client.publish( "watch"、 "Energy Monitor reconnected"); } MQTT_reconnect =millis(); } // Mosquitto接続チェックを終了します}
回路図
製造プロセス