前回までのお話
前回までは下の1~4のセンサー・LEDの接続について書いてきました。
- 人感センサーによる監視
- 温度・湿度センサーによる室内環境のモニター
- 照度センサーになる室内の明度モニター
- 赤外線リモコンによる室内機器(TV・照明・エアコン)の操作
- 圧電ブザーによる警報発報
- アレクサとの連携
- 異常時ラインへの通知機能
- ブラウザによる操作
その②からは5~を書いていきたいと思います。
警報用圧電ブザーの接続
警報を鳴らしたい場合手軽にできるのは圧電ブザー。昔「学研の科学」で圧電ブザーがついていて発振回路なんて知らなった頃
プラスとマイナスを圧電ブザーにつなげば音が鳴るんだ
と思っていたら・・・鳴らなくて???という記憶が残っています。なんで回路を通すと音かなるのか不思議でした。昔は、そんなこと書いている本なんて何処にもなく、結局わからずじまいでした。今の子供はインターネットで調べれば、すぐ答えにたどり着けるってのはうらやましい。
圧電ブザーは基本は発振回路が無いと音がならないのは常識です。圧電ブザーにも2種類あり自励式と他励式があります。下の資料がとても参考になりました。
Arduinoで使うとなれば他励式がいいんですが、購入したものは発振回路付きの自励式でしたw。
なんか音が変だなぁと思って電池を直つなぎしたら音が鳴るではありませんか(小学生のときの逆体験w)。殻割して分解したら発振回路がついていました。
よく調べない自分が悪いんです。購入すべきはこちらのものでした。
発振回路が無い分安いです。妙に厚みのあるブザーは発振回路が入っている可能性が高いですね。一概には言えませんが・・・。というわけで、殻割したブザーの発振回路からトランジスタやインダクタをはがして直でリードをつないでみたら、無事にきれいな音が鳴ったのでよしとします。
ちょっと音量が弱いので色々調べてみたらインダクタを取り付けて昇圧させるとあったんですけど・・・下リンクの下の方
インダクタはあるにしても種類がよくわからなかったので単純に供給電圧をあげるという手っ取り早い方法をとりました。手持ちにあった昇圧型のDC-DCコンバータを使い5V->28Vにして下のように接続したら、まあまあの音量が得られました。DC-DCコンバータの電圧調整つまみで音量も調節できました。
書き忘れですが、トランジスタは定番の2SC1815です。ESP8266とは5ピンで接続します。デメリットはDC-DCコンバータがちょっと大きいこと。。。宿題として今度100均防犯ブザーを分解でもして、昇圧コイルやインダクタを入手してみて小型化してみます。
アレクサとの連携
これはハードではなく、ソフトの話です。
テレビがアレクサに対応しているので、テレビの電源をつけたり消したりとかはメーカー謹製のアレクサアプリで操作できていました。電源オンオフ・音量調整はまぁまぁ使えるも、チャンネル変更になるとローカル局(北海道ならSTVとかHBCとか)の呼び名には対応していないとかちょっと使いにくいです。
また、居間の照明のスイッチも調光可能な赤外線リモコンタイプなのでアレクサと連携すれば便利かなとも思ってました。
調光可能なスイッチとタダのスイッチのやつ。
ESP8266からアレクサを使うにはfauxmoESPを使います。
このライブラリも色々使われていてレビューがたくさんあります。
大体内容は同じで、使い方は他のサイト様に任せます。
fauxmoESPを使う上で2020年で重要なことは、
3つ以上のデバイスが認識しないことがある
これで自分も時間を無駄に費やしました。先ほど掲載した「臨床工学技士の電子工作」様のレビューにも赤文字で書いてあるにもかかわらず・・・
IDEのボード設定「IwIP Variant」を「v1.4Higher Bandwidth」にする
これ!超重要です!!先人様ありがとう。
異常時ラインへの通知機能
ラインへの通知は、ついこの前に記事にしたHTTPSでLine Notifyに投げる方法を紹介しました。
この記事にも書いたんですが、ESP8266からのHTTPS接続は少し荷が重いという結論に至りました。実際、最初はWiFiClientSecureを使った接続をしていましたが、アレクサ(fauxmoESP)、赤外線リモコン(IRremoteESP8266)、各種センサライブラリを導入して実行してみるとサーバーと接続できない現象がおきていました。WiFiClientSecureのコードを単品で動かすと問題なく動くので、おそらく、メモリが足りてないんだろうと思います。
というわけで、LineNotifyは別サーバーに設置したphpに任せてESP8266からはHTTPで行けるようにしたいと思います。phpの設置サーバーはセキュリティ上同一ネットワークからのほうがいいでしょう。私は、バッファローのNASのWebサーバー機能に置きました。php.iniを少しいじらないとだめでしたが、何をいじったのか忘れてしましましたw。ググればわかるレベルのことだったと思います。。。
上のサイトを参考にさせて頂いて、ちょこちょこ書き換えます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?php define('LINE_API_URL' ,"https://notify-api.line.me/api/notify"); define('LINE_API_TOKEN','<アクセストークン>'); function post_message($message){ $data = array( "message" => $message ); $data = http_build_query($data, "", "&"); $options = array( 'http'=>array( 'method'=>'POST', 'header'=>"Authorization: Bearer " . LINE_API_TOKEN . "\r\n" . "Content-Type: application/x-www-form-urlencoded\r\n" . "Content-Length: ".strlen($data) . "\r\n" , 'content' => $data ) ); $context = stream_context_create($options); $resultJson = file_get_contents(LINE_API_URL,FALSE,$context ); $resutlArray = json_decode($resultJson,TRUE); if( $resutlArray['status'] != 200) { return false; } return true; } //処理開始 header('HTTP/1.1 200 OK'); header('Content-Type: text/plain'); //GET引数チェック if (!isset($_GET['m_id']) || $_GET['m_id'] === '') { exit('0:message-id is failed'); } if (!isset($_GET['d_id']) || $_GET['d_id'] === '') { exit('0:device-id is failed'); } $msg_id = $_GET['m_id']; $device_id = $_GET['d_id']; $msg = ''; if($msg_id == 1) $msg = 'で人感センサーが反応しました'; if($msg_id == 2) $msg = 'の室温が40度を超えています'; if($msg_id == 3) $msg = 'の室温が0度を下回っています'; if($msg_id == 4) $msg = 'の湿度が90%を超えています'; if($msg_id == 5) $msg = 'の湿度が10%を下回っています'; if($msg_id == 6) $msg = 'が急に部屋が明るくなりました'; if($msg_id == 7) $msg = 'が急に部屋が暗くなりました'; if($msg_id == 8) $msg = 'の警備を開始しました'; if($msg_id == 9) $msg = 'の警備を解除しました'; if($msg_id == 10) $msg = 'のアラーム警備を開始しました'; if($msg_id == 11) $msg = 'のアラーム警備を解除しました'; if($msg_id == 12) $msg = 'のライン通知をオンにしました'; if($msg_id == 100) $msg = 'のセキュリティのテスト送信です'; if($msg == '') exit('message-id is not defined'); $device = ''; if($device_id == 1) $device = '居間'; if($device_id == 2) $device = '和室'; if($device_id == 3) $device = '寝室'; if($device == '') exit('0:device-id is not defined'); post_message($device . $msg); // 送信されるメッセージ本文 print('1:success'); ?> |
GETリクエストで m_idとd_idを送ってます。外部のサーバーを使う時は最低限POSTにするなりセキュリティに注意しましょう。スケッチから直接送るメッセージをphpに渡してもいいですけどメモリを食うのでidとして定義しておいてます。d_idは装置毎固定がいいと思います。
これでphpにHTTPリクエストを送るだけでラインにメッセージを送れます。
また、一旦ここで切りたいと思います。続きはその③で・・・