ESP32でYoutubeリモコンを作ってみた
今回はESP32を使ってYoutubeのリモコンを作ってみました。
実際の動作はこちら。
HW作成
まずはリモコンのハードウェアを作っていきます。
スイッチはサイズ感と押し感がよさそうなボタンスイッチを秋葉原の千石電商で買っておきました。
今回はESP32のボードをそのまま使おうと思うのでユニバーサル基盤を使って取り付けていきます。
ESP32に合わせてバンドソーで切って四隅の穴をM3のボルトで固定できるように穴をボール盤で拡張します。


ケースは3Dプリンタで作ります。

ユニバーサル基盤の取り付けはユニバーサル基盤のピッチ2.54mmに合わせてCADを作っています。
あとはユニバーサル基盤へのはんだ付けを行います。
ESP32には内蔵プルアップ抵抗があったりするんで、スイッチは直接接続します。
(プルアップがないGPIOもあるので注意です。私は一度配線しなおしました。)

あとは蓋をつければ完成です。
バッテリーは使えるものがなかったので外部給電式のリモコンになります。

SW作成
SWはこちらです。
基本的にはBLE KeyBoradのライブラリを使ってキー操作しています。
Youtubeのパソコン(ブラウザ)版にはショートカットキーが設定されています。
そのショートカットはこちらです。
YouTube のキーボード ショートカット - YouTube ヘルプ
これらのショートカットを組み合わせてリモコンとしています。
4つのボタンそれぞれにショートカットキーを割り当てています。
更に、各ボタンには短押し、長押しで別のショートカットキーが割り当てられています。
以上でリモコン完成です。
完成した姿は最初の動画になります。
以上、ESP32でのYouTubeリモコン作成でした。
ESP32 Arduino Library V2.X.X -> V3.X.Xでの仕様変更による不具合
久々に昔のESP32プロジェクトをアップデートしようと思ったら、コンパイルが通らない。
エラーを解消しても次から次へとエラーが出るので、いろいろと確認してみるとESP32 for Arduino のライブラリのバージョンがV2からV3に変わったことで、よく使う関数の引数仕様が変わったり、そもそも関数自体がなくなったりしている。
結論としては戻すがよいです。
以下詳細
エラー内容
まずはTimer系でエラーが出ていました。(私の場合は10msタスクを作っていたところ。)
Compilation error: too many arguments to function 'hw_timer_t* timerBegin(uint32_t)'
これはそもそも、引数の仕様が変わっていました。
Timer系は大きく変わっていたので、完全に作り直したほうが早そうでした。
直している人もいましたので参考までに。
Won't Compile (using ESP32 Feather with RFM69HCW wing) · Issue #79 · adafruit/RadioHead · GitHub
他にはBLE系のライブラリでBLEKeyboardという外部ライブラリを使用していたのですが、
このライブラリ内のBLEのInitializeの引数がstd::stringからStringに変更になっていてエラーを発生していました。
なので、全部直すのは大変なのでバージョンをダウングレードしようと思います。
ESP32 for Arduinoライブラリのダウングレード方法
インストールと逆の手順で行います。
Tools -> Board -> Boards Managerを選択します。

esp32で検索するとインストール済みのものも出てくると思います。

V2.0.17を選択してInstallすれば完了です。
スマホでガレージを制御しよう
こんにちは。
今回はガレージのIoTでシャッターの開閉をスマホから操作できるようにしようということがやりたいことになります。
構成としてはFlaskウェブサーバーとESP32のSocket通信で制御しています。
あまり同じ構成を見なかったので参考になればと思います。
背景
今回のIoTの背景としては友人と共同で契約しているガレージがリモコンはあるのですが、反応が悪いし忘れることもあるので、いつも必ず持っているスマホで開閉できるようにしたいからです。
全体システム
全体システムは以下のようになっています。

ユーザー操作順に説明すると
- スマホからFlaskサーバーのサイトへアクセス
- シャッター開閉ボタンを押してHTTPリクエストをサーバーへ送信
- Flaskサーバーが別スレッドのSocket通信サーバーへQueueで受け取った制御指令を送信
- SocketサーバーがESP32に制御信号をSocketで送信
- ESP32がGPIOでシャッターを制御
といった流れになります。
良いところは、ESP32側で面倒な固定IPやポート変換等の心配をしなくていいことになります。
サーバーを持っていることが前提になりますが、私はKagoya VPSを契約しているので、その固定IPサーバーを有効活用します。
実装
早速実装ですが、まずサーバー側のPythonの実装です。
Flaskサーバーの機能とThreadingでSocket通信のサーバーを起動しています。
Socket通信サーバー側の実装はこちら。
単純にQueueで受け取った指令を繋いでいるESP32に送っています。
最後にESP32側の実装です。
基本的には受け取ったSocketメッセージに応じて制御します。
その他の細かいhtml等は以下のレポジトリをご参照。
(だいぶアップデートしてしまっているかもしれませんが。)
GitHub - Aki-R/shutter_control_server
GitHub - Aki-R/garage_shutter: シャッター開閉するやつ
テスト
スマホからの操作画面はこんな感じです。

一旦、直接ガレージのシャッターではなくLEDライト点灯でテストします。
デプロイ(ガレージ実装)
あとはガレージのシャッター制御回路に実装するだけです。
GPIOからのリレー制御にはこちらのボードを使いました。
サインスマート(SainSmart) 5V リレーモジュール for Arduino DSP AVR PIC (4チャンネル)

実装完了です。
課題
最後に少し課題がありまして、長時間接続しているとESP32がClinet.Connected()がTrueのまま、実際は接続が切れているという不具合があります。
なのでESP32側を再起動すると復活するのですが、詳細は解析中。
対策としては制御信号がなくても定期通信するようにするとかですかね。
以上、ガレージIoT化でした。
Streamlitで部屋の温度・湿度モニターの可視化ボード作成
こんにちは。
今回はStreamlitを使って以前作った部屋の温湿度モニターの可視化ボードを作ってみました。
以前はChart.jsを使ってグラフ化していたのですが、Streamlitを使うと簡単にもっとInteractiveな表示ができそうなので試してみた次第です。
前回Chat.jsを使った際の記事はこちら。
Streamlitとは?
Streamlitとはpythonのwebフレームワークで、データ解析に特化したフレームワークになります。
Pandasなどと相性がよく、データサイエンスやAIのフィールドでよく利用されているようです。
実際、私も仕事で解析のスクリプト組んだとしても結果の共有に悩む場面が多いですが、こういったWEBで表示できると共有先の環境に合わせる必要がなく便利というわけです。
実際、使用してみた感じでもWEB上で細かくデータも見ることができるのでとても便利です。
一時解析ぐらいできてしまうぐらいインタラクティブに動かせるのも魅力です。
実際のサンプルサイト
今回使った実際のサンプルサイトはこちらになります。
JSON形式のデータを読み込んで表示しています。
https://aki-r-streamlit-sample-app-gkayym.streamlit.app/
まずはLineグラフに関して。
SreamlitのAPIにも線グラフのAPIはありますが、Plotlyと組み合わせられるのでグラフはPlotlyで表示しています。
Plotlyの方がカスタマイズ性が高いです。
実際見てもらうとドラッグ、ズームも簡単でPNGで出力もできます。

以前使っていたChart.jsよりもグリグリと動かせるので使い勝手がとても良いです。
次にPandasのデータフレーム表示に関して。
データフレームを簡単に表示できるだけでなく、変数名のところをクリックすることで簡単にソートできてしまいます。

これだけで簡単な一時解析できるぐらいの便利さです。
こんな形で、データ表示としては強力なGUIを作ることができます。
実装コード
今回上記のサンプルを作成したのは以下のコードです。
GUIアプリですが、この程度であれば非同期やコールバックを考えずにそこそこ実装できます。
公開はサーバーであればstreamlitをpipでインストールして実行するだけ。
今回添付したサンプルはstreamlitの機能でgithub連携で公開していてデプロイも楽ちんです。
今回のコードはこちらです。
以上、Streamlitでの可視化ダッシュボード作成でした。
【IoT】【悲報】ラトックのスマート家電リモコンがIFTTTとの連携を終了
ラトックシステムのスマート家電リモコンがIFTTTとの連携を終了するとのです。
私が使っているRATOCの家電リモコンは以下の二つです。
こちらを使っていた理由はIFTTT連携を通してIoT化できるからという理由です。
実際にこれらを使って温度・湿度モニターなんかを作っていました。
温度モニターは最近の猛暑日続きの部屋の温度の推移確認だったり、エアコンの設定等に活かされていたので非常に残念です。
センサー値や操作コマンドへアクセスできるようなAPI公開してくれているスマート家電があれば使いたいですね。
とりあえずはIFTTT連携サービスが終了するので今後どうやって部屋のモニター機能等維持するか考える必要ができました。
また、アイデア思いついたら書いていこうと思います。
賃貸のリモコン無しシーリングライトでもIoTしたい!
こんにちは。
今回は最近引っ越した際にリモコンタイプではないシーリングライトをなんとかしてIoT化したのでそのことを書こうと思います。
背景
引っ越しをしたい際に、リビングのシーリングライトが紐を引くか、壁のスイッチを押すという二つでしか操作できないタイプでした。
赤外線リモコン式であれば私が持っているラトックの家電リモコンでIoT化できたのですが、、、
賃貸なので、シーリングライトを交換するのもハードルが高いし、、、
解決策
そんな中、シーリングライトのカバーをとりあえず外してみると、天井のシーリングライト専用のコンセントからカバーの間に意外とスペースがあることに気が付きました。
そこで購入したのがこちらです。

完成した写真を撮り忘れてしまいましたが、
- 天井のシーリングコンセント
- シーリングコンセントから一般のコンセントへの変換アダプター
- スマートプラグ
- 一般のコンセントからシーリングコンセントへの変換アダプター
- シーリングライト
の順番で繋ぎ、すべてをシーリングライトカバー内に収めることでシーリングライトを工事や取り返せずにIoT化できました。
おかげでアレクサで操作できるようになりました。
ただ、スマートプラグはスイッチボット製の方が良かったかもしれません。
APIが公開されているので、自分で操作プログラムを簡単に書けるんですよね。
(今のでもIFTTTとかうまく使えばプログラムから操作できそうですが。)
以上、賃貸シーリングライトのIoT化でした。
RaspberryPiで計測した環境センサ情報をSQLデータベースに書き込む
こんにちは。
今回は先日RaspberryPiで計測した環境データをSQLデータベースサーバーにアップロードします。
前回はCCS811とBME280から疑似CO2濃度と気圧を取得するところまで行いました。
RaspberryPiでCO2センサーCCS811を動かす - あきらぼ
RaspberryPiでBME280で気圧測定 - あきらぼ
今回はここで取得した値をSQLデータベースにアップロードします。
実際のコードはこちらです。
(IPアドレス等は伏せています。)
実際にcrontabで定期実行させたときのデータベースを確認します。

eCO2の値が飛んでいるのは要確認ですが、15分毎にデータがアップロードされていることが確認できます。
次回はデータベースの値を使ってWEBページ上でこれらの値を可視化してみようと思います。
今回の環境モニタシステムのコードの全体はこちらになります。
GitHub - Aki-R/RoomConditionMonitor