
こんにちは、habrozhiteli! 毎日Habrを読んで、Arduinoとそれに基づいたDIYプロジェクトに関する記事に繰り返し出くわしました。 エレクトロニクスとは何の関係もないことは注目に値します。私の経験はすべて、10代のクラブ「スパーク」(ペトロザヴォーツク)に基づいたラジオクラブを訪れたことです。 ひとたび集まって、スマートフォン(BT接続)用のセンサー(温度、圧力、パルス)を備えたArduinoブレスレットを作ることにしましたが、注文時にエラーを犯した後、Arduinoと圧力センサーのみを受け取りました。 ボードをテストするために、LEDの最寄りの無線コンポーネントストアに行き、そこで磁気ドア閉センサーで目を引きました。 彼は部屋の生活を少し改善することができるだろうという考えを与えてくれました(アパートと混同しないように)。 時間を無駄にすることなく、私はアリとたくさんのセンサーとArduino Megaを注文しました。
紳士用のセンサーセット(温度、湿度、リレー、StarterKit、BT、時計、レンジメーター、IRセンサー)を注文した後、他の人がどのようにスマートホームを代表するかを探すことにしました。 ほとんどは、シャンデリアと床下暖房の制御に限定されていましたが、
本当にクールな記事がありました 。 部屋のアパートにありふれた機能のいくつかは単に不要でした。たとえば、ガス漏れや漏れ検出器などです。 スマートルームで必要な機能を自分でコンパイルすることにしました。
- 調光
- 温度制御
- 多くの方法を管理する
- ドア制御
- 温度監視
- 気象監視
必要なセンサーはすべて注文済みであり、待つことしかできないことが判明しました。 そして今、すべてのセンサーが来ました!
最初のステップ
既にLEDで点滅し、スマートホームを構築することに決めた場合、部屋の明かりを点滅させることは論理的なステップですが、初期の熱により温度を制御し始めました。 まず、StarterKitaからdht11を接続してみました。 インターネットに指示がたくさんある場合、何がより簡単になるでしょうか? 判明したように、dht11を接続するための多くのライブラリがあり、それらのすべてがIDEの最新バージョンと互換性があるわけではありませんが、数時間後にコンソールに表示される温度を賞賛し、数分後にはそれに応じてLEDが点滅します。 (センサーをオフにし、冷蔵庫に入れ、冷蔵庫から取り出し、接続します...)
最初の問題は、選択したdht11の精度が低いことでした。両方向に2〜3度横たわっていたため、交換する必要がありました(その後、いくつかのバージョンでセンサーを注文しようとしました)。
それから私はLeroyMerlinに行き、そこで
最も簡単なファンを購入しまし
た 。 ワイヤとプラグで数分間騒ぎ立てた後、ファンが組み立てられました。 隣人と一緒に、彼らは窓を取り外して、空いている場所にそれを設置しました(隣人ではなくファン)。 プラグをソケットに差し込み、...ファンが回転し始めました。 ゆっくり。 とても遅い。
言うまでもなく、プラグを誤って取り付け、ファンが風から回転しましたか?

もちろん、手動での電源オフも可能です。 しかし、リレーを介してファンを制御する最良の方法は何ですか? ファンに直接接続しますか? コンセントを介してファンをリレーに接続することにしました。これにより、システムに柔軟性が与えられます(ファンを別のものに交換できます)。
換気試験
そして、ここでコードはLEDからリレーに書き換えられます。 ファームウェアが読み込まれ、必要な開始を見越して温度を監視します-ここでその瞬間です! リレーがクリックされ、COMポートが消えます。 どうやら、切り替え時に、USBの負荷が増加し、データが干渉します。 最初は220Vワイヤからの干渉によるものだと思っていましたが、ボードから十分な距離にあります。 その後、これにより多くの問題が発生しました。新しいスケッチをアップロードしようとすると、Arduinoが再起動し、リレーを切り替えて、COMポートを削除するため、更新プロセスが発生します。 私はこの問題を克服できませんでした。
リモコン
もちろん、ファンの絶え間ない動作はすぐに退屈し、スイッチを介してファンをオフにすることはクールではありませんでした! そこで、そこからスターターキットとリモコンを取り出しました。 実際、この瞬間から問題が始まりました。受信機がどのように見えるかわかりませんでした。 しかし、数分間のグーグル検索でそれを見つけることができ、さらに1時間後、リモートコントロールからファンを制御するのが楽しくなりました。
最初はいくつかのフラグを持つ複雑なアルゴリズムでしたが、最終的には小さなものになりました
タイマーアルゴリズムIf(シグナルが来た){
manual_time = 1800;
fan_mode =! fan_mode;
}
If(manual_time!= 0){
manual_time--;
}それ以外の場合{
If(温度<26){
fan_mode = false;
}それ以外の場合{
fan_mode = true;
}
}
しかし、ここでは問題がなかったわけではありません。ワイヤを更新し、5VをDATAに印加すると、すぐにレシーバが失われました。 これにより私は次のステップに進みました...
BTモジュールによる管理
すぐに、HC-06 BTモジュールを接続し、そこに出力をリダイレクトし、コマンド読み取りを追加しました。 もっと難しいと思ったが、robocraftの記事のおかげだ。
隣人とファン
スマートフォンからシステムを制御する方法を隣人に教えることで、「ちょっと、寒い」という問題を解決できると思いましたが...スイッチでファンの電源を切ることができれば、窓を閉めるのは夢中になります。 なんで? ファンは数センチの距離でガラスに吹き込み、ひどくすり減った。 幸いなことに、私は磁気センサーが散らばっていたので、システムを作成するように促されました。 閉じたセンサーは、ファンをオンにできないことをArduinoに通知します。 悲しいかな、時々干渉があったので、私は簡単なチェックをしなければなりませんでした:近い信号が連続して数回来た場合-ウィンドウは本当に閉じています。

調光
これで、ライトを制御することができました。 ファンの後、複雑なものは何もありません:ボックス、一対の端子ブロック-そして、光はすでにArduinoによってすでに制御されています(もちろん、古いスイッチでオフにする機能もあります)。 唯一心配なのは、
リレーが電球を制御する最良の方法ではないということです。
音の問題
さて、叩かないで調光とは何ですか? マイクを注文しました。 だから私は思った...未経験を覚えていますか? 実際、手動でしきい値を設定したサウンドディテクターを注文しました。 それは私の目的に適しているようですか? しかし、いくつかの「しかし」が現れました。
- 短距離:ポップは数十センチからのみ処理されます
- 短い信号配信時間:長いコード実行時間では、センサーからの信号にArduinoを修正する時間がありませんでした
コンソールリターン
少しグーグルで店に行くと、燃え尽きたVS1838Bの代わりに、より信頼性の高いTSOP1836を購入しました。 今回はインストールが成功し、すべてがすぐに機能しました。

通りに出る
私は窓を理解しましたが、その背後には何がありますか? はんだごてで武装し、雨センサーと別のdht11を5メートルのVGAケーブルにはんだ付けしました。 いくつかのU字型の留め具、黒い電気テープ、コケ、およびシステムは警告を発します。

また、ロシア語のテキストを表示できることも学びました。
少し便利
スマートフォンは常に手元にあるように見えますが、それが見つかるまで接続してください...スイッチを介してライトやファンをオフにする方が速い場合がありますが、これによりArduino経由の制御が不可能になります(パルスリレーは高価すぎる)ので、2つの普通のボタンを追加しました。
ちょっとしたセキュリティ
寮の技術者に火災警報器がない場所はどこですか? 経験の浅い私は煙ではなく、火災探知機を購入しました。 30 cmまでの距離で燃えているマッチを決定することは、もちろんクールですが、十分ではありません。 したがって、これまでのところ私はそれなしでやった。
ホステルの火災警報器といえば......
- 時にはサイレンやガラガラと鳴るスピーカー
- ローカル煙探知機
- ネットワーク煙探知器(コントロールパネルに接続)
一般的なビュー


コンピュータケースへの配置には、短絡を引き起こす能力という大きな欠点があります。 そのため、ボードはまもなく個人の棚に移動し、段ボールの代わりにHDDのケースから仮のケースがあります。
スケッチコード
現状#include <IRremote.h>
#include <IRremoteInt.h>
#include <DS1302.h>
#include <DHT.h>
#define DHT_PIN 2 //温度計のピン...
#define DHT2_PIN 52 //街路温度計のピン...
#define RAIN_PIN 53 //雨センサーのピン
#define RECV_PIN 3 // IRレシーバーを接続するピン
#define FAN_PIN 4 //リレー接続ピン
#define LAMP_PIN 5 //リレー接続ピン
#define SOUND_PIN A0 //マイク接続ピン
#define WINDOW_PIN A1 //ウィンドウピン
#define LAMP_BUT_PIN 50 //マイク接続ピン
#define FAN_BUT_PIN 51 //ウィンドウピン
#define DHTTYPE DHT11
#define TIMER_FAN 0
#define TIMER_WINDOW 1
IRrecv irrecv(RECV_PIN);
decode_results結果;
intタイマー[2];
bool FAN_FLAG = false;
bool LAMP_FLAG = true;
int WINDOW_VAL = 0;
bool WINDOW_OPEN = false;
bool WINDOW_FLAG = false;
bool RAIN_FLAG = false;
char incomingByte;
DHT dht(DHT_PIN、DHTTYPE);
DHT dht2(DHT2_PIN、DHTTYPE);
DS1302 rtc(49、46、48);
void setup(){
Serial1.begin(9600);
rtc.halt(false);
rtc.writeProtect(false);
//rtc.setDOW(SUNDAY); //曜日を金曜日に設定します
//rtc.setTime(0、37、40); //時間を0:37:00に設定します(24時間形式)
//rtc.setDate(25、5、2014); //日付を5月25日に設定します
タイマー[TIMER_FAN] = 0;
タイマー[TIMER_WINDOW] = 0;
pinMode(RAIN_PIN、INPUT);
pinMode(LAMP_BUT_PIN、INPUT);
pinMode(FAN_BUT_PIN、INPUT);
pinMode(FAN_PIN、OUTPUT);
pinMode(LAMP_PIN、OUTPUT);
digitalWrite(FAN_PIN、LOW);
irrecv.enableIRIn(); //レシーバーをオンにします
dht.begin();
dht2.begin();
}
intボリューム;
void loop(){
WINDOW_VAL = analogRead(WINDOW_PIN); //磁気センサー
if(WINDOW_VAL> 950){
if(WINDOW_FLAG){
タイマー[TIMER_WINDOW] ++;
if(タイマー[TIMER_WINDOW]> 10){
WINDOW_OPEN = false;
}
} else {
WINDOW_FLAG = true;
}
} else {
WINDOW_OPEN = true;
WINDOW_FLAG = false;
タイマー[TIMER_WINDOW] = 0;
}
if(digitalRead(RAIN_PIN)== HIGH){
RAIN_FLAG = true;
} else {
RAIN_FLAG = false;
}
ボリューム= analogRead(SOUND_PIN);
if(volume <40){
LAMP_FLAG =!LAMP_FLAG;
}
if(digitalRead(LAMP_BUT_PIN)== HIGH){
input_signal(1);
}
if(digitalRead(FAN_BUT_PIN)== HIGH){
input_signal(0);
}
if(irrecv.decode(&結果))
{
if(results.value == 16750695)//ボタンコード
{
input_signal(0);
}
if(results.value == 16756815)//ボタンコード
{
input_signal(1);
}
irrecv.resume(); //次の値を取得します
}
//Serial.println(rtc.getTime().hour);
//Serial.println(rtc.getTime().min);
Serial1.print(rtc.getDOWStr());
Serial1.print( "");
Serial1.print(rtc.getDateStr());
Serial1.print( "-");
Serial1.println(rtc.getTimeStr());
if(Serial1.available()> 0){
incomingByte = Serial1.read();
if(incomingByte == '0'){
Serial1.println(「手動モード無効」);
input_signal(0);
} else if(incomingByte == '1'){
Serial1.println(「手動モードをアクティブ化」);
input_signal(0);
} else if(incomingByte == '2'){
input_signal(1);
}
}
float h = dht.readHumidity();
float t = dht.readTemperature();
if(isnan(t)|| isnan(h)){
Serial1.println(「内部温度計からの読み取りエラー」);
} else {
if(タイマー[TIMER_FAN] <= 0){
if(t <26){
FAN_FLAG = false;
} else if(t> 26){
FAN_FLAG = true;
}
} else {
タイマー[TIMER_FAN]-;
}
Serial1.print(“湿度:„);
Serial1.print(h);
Serial1.println( "%\ t");
Serial1.print(“温度:„);
Serial1.print(t);
Serial1.println(“ * C”);
}
if(タイマー[TIMER_FAN]> 0){
Serial1.print(「手動モードはそのままです:„);
Serial1.print(タイマー[TIMER_FAN]);
Serial1.println(「秒」);
} else {
Serial1.println(「手動モードオフ」);
}
if(FAN_FLAG && WINDOW_OPEN){
digitalWrite(FAN_PIN、HIGH);
Serial1.println(「ファンオン」);
} else {
digitalWrite(FAN_PIN、LOW);
Serial1.println(「ファンオフ」);
}
if(WINDOW_OPEN){
Serial1.println(「ウィンドウが開いています」);
} else {
Serial1.println( "Window Closed");
}
if(LAMP_FLAG){
digitalWrite(LAMP_PIN、HIGH);
} else {
digitalWrite(LAMP_PIN、LOW);
}
h = dht2.readHumidity();
t = dht2.readTemperature();
Serial1.println( "窓の外:");
if(isnan(t)|| isnan(h)){
Serial1.println(「街路温度計からの読み取りエラー」);
} else {
Serial1.print(“湿度:„);
Serial1.print(h);
Serial1.println( "%\ t");
Serial1.print(“温度:„);
Serial1.print(t);
Serial1.println(“ * C”);
}
if(RAIN_FLAG){
Serial1.println(「雨は降らない」);
} else {
Serial1.println( "Rain");
}
Serial1.println( "*****");
遅延(100);
}
void input_signal(int signal){
スイッチ(信号){
ケース0:
if(rtc.getTime()。hour> 1 && rtc.getTime()。hour <8){
タイマー[TIMER_FAN] = 1800;
} else {
タイマー[TIMER_FAN] = 18000;
}
FAN_FLAG =!FAN_FLAG;
Serial1.println(「ファン切り替え」);
休憩;
ケース1:
LAMP_FLAG =!LAMP_FLAG;
Serial1.println(「ライトスイッチ」);
休憩;
}
}
コードが失敗した場合
私は通常閉じたリレーを使用しています。 つまり、デフォルトではすべてがオンになっています。Arduinoをネットワークから切断し、簡単なスイッチを使用できます。
開発計画
私がリストしたのは、真にスマートな部屋の基礎にすぎません。 結局のところ、彼女のAIはすべて、温度に応じてファンのオンとオフを切り替えています。 部屋をより快適で「自律的な」ものにするために、次のことを計画しています。
目覚まし時計
システムにクロックを追加すると、次のアラームが順番に並んでいます。 シグナルとして、パイピッカー、点滅するライト、ファンがオンになっていると想定しています。 そしてもちろん、屋外で雨が降った場合は早期に目覚めます(移動速度は-10です)。
そのようなモジュールを使用して、SDカードにアラームを保存するシステムを追加し
ます (停電の場合)。
コンピューターおよびスマートフォン+ウィジェット上のアプリケーション
スマートフォンやコンピューターから制御できないスマートホームとは何ですか?
私はこのようなものだと思う:

なぜ無線LANではないのですか? 高すぎる。
Arduino自身の食料を撤回する
コメントは不必要だと思います。USBを焼き切る危険性と、他のデバイスへの絶え間ない干渉です。 さらに、ボードから特別なアダプターに電力を転送したいです。
電源コンセントを介したルーターの管理
古き良き
Asus RT56Uは、特に夏には
日光浴が大好きです。 そのため、夜間に数時間自動シャットダウンして、冷却できるようにします。
プレゼンス監視を追加
今では、古き良き焦電型赤外線センサーといくつかの超音波距離センサーがあります。 これは単純なプレゼンス制御には十分かもしれません。
部屋には二人が住んでいます。 それぞれ4つの状態があります。
- コンピューターで
- 価値がある
- ベッドに横たわって
- 行方不明です
赤外線センサーは、部屋の存在とゾーン(ベッド/テーブル)の超音波の存在を判断し、出入りする人の数を監視します。
これにより、最も単純なシナリオを実装できます。
- 私は夕方に来て、隣人は寝ていません:ライトをつけます
- すべてが出ます:ライトをオフにします
- 誰もが横になって動かない:ライトを消す
感光抵抗を追加
ジャンルの古典:部屋の誰かが「コンピューターの」ゾーンにいて、部屋が暗い場合に自動的に光を含める。
電気機械的ロックを追加し、より近くに
私はあなたのことは知りませんが、私はいつもキーを探すのが面倒なので、近接カードリーダーまたは
指紋センサーと組み合わせて、電気機械式ロックを本当に取り付けたいです。 ホステルへの入場は電子パスを使用して行われます-Arduinoの周波数はわかっていて、リーダーを簡単に注文できますが、カードは非常に簡単に複製できます(私自身はこのためのデバイスを持っています)ので、時間が来たら、指紋に集中するでしょう指。
隣人はしばしば台所/トイレ/風呂に行き、ドアを閉めません。 私は玄関の前に座っていますが、通り過ぎる人
が私のパンツを見 、部屋での処分
を熟考するのは好きではありません。 このような状況では、ガイド付きクローザーが最適なソリューションになります。
ウィンドウをアップグレードする
すでに書いたように、温度が特定の制限を超えると、ファンがオンになります。 しかし、部屋に誰もいなくて、温度がすでに20を下回っている場合はどうでしょうか。 ウィンドウの開閉システムを追加したいと思います。 おそらく、単純なモーターと釣り糸でしょう。
電球を冷やしてオンにすると、爆発する可能性が高いことが知られています。 したがって、それは神経と球根も節約します。
DHT11を交換してください
すでに書いたように、センサーなどは理解していません。 だから私は最初に手に入れた温度センサーdht11を買いました。 ここで、部屋をdht22、通りをdht21に置き換えます。 Dht22の誤差範囲は小さく、dht21には凍結温度のサポートと、路上で重要な保護ケースがあります。 Street dht11はすでに迷子になり始めていました。
電気調光器を追加する
部屋の照明のレベルをスムーズに調整したいと思います。 スマートルームがない場合は、単純な調光器を購入して吊り下げますが、現在は現在のシステム内に存在できる調光器が必要です。 残念ながら、220V、調整可能な5Vの調光器は見つかりませんでした。 これまでに思いついたのは、単純な調光器とそれに接続されたモーターだけです。
音声制御
現在の管理方法に音声を追加したいと思います。 幸いなことに、
このようなシステム
が存在します。 もちろん、音声反応も対象になりますが、これらは単純な話者です。
購入したセンサーへのリンク
あとがき
いくつかの計画の最後に新しい記事を書くことは可能だと思いますが、今のところは電気機械式ロックを夢見て、セッションの準備をします。
素晴らしい週末を過ごしましょう:利益を生むように過ごしましょう!