pond6814 が 2024年10月25日16時17分10秒 に編集
初版
タイトルの変更
古いエアコンをスマートに、ペットに最適な環境を提供するリモートリモコン型デバイス「Temペット」
タグの変更
RaspberryPi
赤外線LED
赤外線センサ
温度センサー
IoT
メイン画像の変更
記事種類の変更
製作品
ライセンスの変更
(MIT) The MIT License
本文の変更
## はじめに 昨今、自動温度調節機能やインターネット越しに操作できる機能を持ったエアコンが販売されていますが、それを導入するためにはエアコンごと買い替える必要があり費用が余計に掛かってしまいます。 そこで、リモコンでしか動かない古いタイプのエアコンでもスマートな操作が出来るようになるスマートリモコン「Tem ペット」を提案します。また、Tem ペットは温度管理が必要なペットを飼っている人向けにも作られており、飼っているペットに適した室温になるようにエアコンを操作します。 ## システム概要 ユーザはWebアプリケーションにアクセスしてTemペットの設定を行います。設定が完了したら、サーバーからTemペットへ設定を送信します。また、Temペットからサーバーに対して現在の室温を定期的に送信します。 Temペットは選択されたペットに適した温度になるようにセンサーを用いて室温を監視し、エアコンを操作します。 ![](https://camo.elchika.com/c0ae94581645278cd7c3346d7f2871876b9f02c4/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34363632633461612d623338342d346232642d386365352d3734396263643530353739652f37663965356539342d376431382d343631332d613466622d376235653731333737306665/) ## 独創的な部分 - 古いタイプのエアコンのスマート化 Temペットは、リモコンでしか操作できない古いエアコンでも、スマートデバイスとして活用できるようにします。これにより、ユーザーは高価なスマートエアコンに買い替えずに、既存設備をより効率的に利用できます。 - ペットに特化した温度管理機能: 温度センサーを搭載しており、飼っているペットに最適な室温を自動で設定する機能を持っています。このペットに合わせた温度管理は、ペットの健康と快適さを保つために特化して設計されています。 ## 制作プロセス ### 材料 - Raspberry Pi zero w - 5mm 赤外線LED OSI5LA5113A - 赤外線リモコン受信モジュール OSRB38C9AA - MOSFET 2N7000 - MOSFET IRFU9024NPBF - 抵抗 4.7kΩ 1/2W - 抵抗 33Ω 1W - 温度センサー(BME280) Raspberry Piで赤外線リモコンを作成する部分は以下のリンクを参考にしました。 [格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9) [ラズパイで外部からエアコンの電源を入れてみる その1](https://bsblog.casareal.co.jp/archives/5010) ### 回路図 回路図はこんな感じです。 参考:[赤外線LEDドライブ回路の決定版 - 電脳伝説](https://vintagechips.wordpress.com/2013/10/05/%E8%B5%A4%E5%A4%96%E7%B7%9Aled%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E5%9B%9E%E8%B7%AF%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%89%88/) ![キャプションを入力できます](https://camo.elchika.com/654dec0e799784f0ba7c9f14cd650d18d44c7f6f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34363632633461612d623338342d346232642d386365352d3734396263643530353739652f36653930376364302d376435632d343736632d623061322d626461366265346561633730/) 赤外線リモコン受信モジュールは黒ぽっちのある方向から見て左からOUTPUT, GND, VCC で、昇順で回路図のピン番号に対応しています。[赤外線リモコン受信モジュールOSRB38C9AA データシート](https://akizukidenshi.com/goodsaffix/OSRB38C9AA.pdf) ![ピンの順番と役割](https://camo.elchika.com/9e0d8589ca8c2739a789884ff22f3e77f7b693f7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34363632633461612d623338342d346232642d386365352d3734396263643530353739652f62343136616135382d323566662d343430302d623034362d613233396636363833356165/) ### 赤外線の送受信 このデバイスのコア技術となる赤外線の送受信について書いていきます。実際のtempetに搭載するコードはこの節での内容を利用したものになります。ここでは、pigpioによる制御方法を紹介します。 **pigpioのインストール** ```bash $ sudo apt update $ sudo apt upgrade $ sudo apt install pigpio python3-pigpio $ sudo systemctl enable pigpiod.service # ラズパイ再起動時に pigpiod を自動的に起動させます $ sudo systemctl start pigpiod # いますぐ pigpiod を起動 ``` **GPIOの設定** `GPIO17`(11 pin)をoutput(`w`)に設定し、出力をlow(`0`)にしておきます。 `GPIO18`(12 pin)をinput(`r`)かつpull up(`u`)に設定します。 このコマンドはcronでラズパイの再起動時に自動的に走るように設定するのを推奨します。 ```bash $ echo 'm 17 w w 17 0 m 18 r pud 18 u' > /dev/pigpio ``` **赤外線コードの記録** IR Record and Playbackという赤外線コードを記録するためのプログラムをダウンロードします。 ```bash $ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py ``` そして、次のコマンドを実行してから実際のリモコンのボタンを押します。 ```bash $ python3 irrp.py -r -g18 -f codes light:on --no-confirm --post 130 Recording Press key for 'light:on' Okay ``` `-r`はrecord、`-g18`は`GPIO18`で、`-f`で指定したファイル`codes`に`light:on`という名前で記録されます。 **赤外線コードの送信** 上記で記録した赤外線コード`light:on`を送信するには、以下のコマンドを実行します。 ```bash $ python3 irrp.py -p -g17 -f codes light:on ``` 赤外線は指向性がかなり厳しいので、赤外線LEDがちゃんと受信側の機械の受信部の方向に向くようにするのがポイントです。 **tempetに必要な赤外線コードの記録** - 冷房 以下のコマンドを実行後、冷房として設定したい温度を記録します。 ```bash $ python3 irrp.py -r -g18 -f cooling light:on --no-confirm --post 130 ``` - 暖房 ```bash $ python3 irrp.py -r -g18 -f heating light:on --no-confirm --post 130 ``` - エアコンの電源 ```bash $ python3 irrp.py -r -g18 -f power light:on --no-confirm --post 130 ``` - エアコンの停止 ```bash $ python3 irrp.py -r -g18 -f stop_button light:on --no-confirm --post 130 ``` ### 温度センサーから室温を取得 tempetは室温に応じてエアコンのON, OFFを操作するので、室温を取得する必要があります。 **I2Cの有効化** Raspberry PiのI2Cはデフォルトでは無効になっているので、設定を変更して有効にします。 以下のコマンドを使用してラズパイの設定を変更します。 ```bash $ raspi-config ``` ![](https://camo.elchika.com/9014b6b586bf8bea819ce76da1768f08042117f3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34363632633461612d623338342d346232642d386365352d3734396263643530353739652f64323139303337352d393365302d343430302d623030642d373238393962353337323738/) Interfacing Options -> I2C -> Yes を選択してI2Cを有効化します。 設定できたら、左右矢印でFinishを選択して、エンターキーを押して、raspi-configを終わります。 **I2Cライブラリのインストール** smbus2をインストールします ```bash $ sudo apt update $ sudo apt install python3-smbus2 ``` **コード** コードが長くなったのでGitHub Gistに上げました。 [bme280.py](https://gist.github.com/pond-e/63cc6f6fd28ba831759f5b688c9fb071) ### 室温に応じてエアコンをON, OFFする 上記で記録した赤外線コードと温度センサーのコードを組み合わせて、室温に応じたエアコン操作を行います。処理の概要としては、lower、upper変数で目標とする室温の上限と下限を設定し、温度センサーで室温を確認した後subprocessを用いて赤外線コード送信のpythonファイルを実行しています。 注意:同一ディレクトリにbme280.pyがあることを確認して実行してください。 ```python:active.py import subprocess import bme280 def main(): print("active function") bme280.readData() temp = bme280.temperature lower = 18 upper = 20 if(temp < lower): cmd = "ls" result = subprocess.run(cmd, capture_output=True, shell=True, text=True) if('power' in result.stdout): cmd = "python3 irrp.py -p -g17 -f "+"power "+"light:on" result = subprocess.run(cmd, capture_output=True, shell=True, text=True) if(result != ''): print("powerが失敗しました。") cmd = "python3 irrp.py -p -g17 -f "+"heating "+"light:on" result = subprocess.run(cmd, capture_output=True, shell=True, text=True) if(result != ''): print("heatingが失敗しました。") elif(temp > upper): cmd = "ls" result = subprocess.run(cmd, capture_output=True, shell=True, text=True) if('power' in result.stdout): cmd = "python3 irrp.py -p -g17 -f "+"power "+"light:on" result = subprocess.run(cmd, capture_output=True, shell=True, text=True) if(result != ''): print("powerが失敗しました。") cmd = "python3 irrp.py -p -g17 -f "+"cooling "+"light:on" result = subprocess.run(cmd, capture_output=True, shell=True, text=True) if(result != ''): print("coolingが失敗しました。") if __name__ == "__main__": main() ``` ### Raspberry PiからWebアプリに室温を送信する Raspberry Piで取得した温度をWebアプリに送信します。Webアプリの言語はPHPを使用しました。 **開発環境** - PHP 8.x - sqlite3 ここではRaspberry Piから{"data":22.3}のような情報をpostリクエストでWebアプリに送信します。実際のコードはこんな感じです。 「温度センサーから室温を取得」で作成した`bme280.py`と同一のディレクトリに配置して実行してください。 ```python:send_temperature.py import requests import bme280 def main(): bme280.readData() temp = bme280.temp r = requests.post("https://your-server-domain/your-directory/Raspi_bme.php", data={'data': temp}) if __name__ == "__main__": main() ``` Webアプリ側の受信コードは次のようになります。 ```php:Raspi_bme.php <?php $data = "none"; if(isset($_POST['data'])){ $data = $_POST['data']; } if($data !== "none"){ $db = new SQLite3('./tempet.db'); $stmt = $db->prepare('UPDATE user_info SET temperature=:data'); $stmt->bindValue(':data', $data, SQLITE3_TEXT); $result = $stmt->execute(); $db->close(); $data = "none"; } ?> ``` このコードではsqlite3で作成したデータベースにデータを保存しています。tempet.dbは次のように定義しました。(sqlite3の使い方は本記事では省略します。) ```sql:tempet.sql PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; Create Table user_info( user TEXT, password TEXT, selected_pet TEXT, receive TEXT, state TEXT, temperature TEXT ); Insert into user_info values( 'admin', 'admin', 'dogcatbird', 'none', 'stop', '19.0' ); COMMIT; ``` **tempetに必要な機能はこれで概ね出揃いました!** ### それぞれの機能の統合 ここまでの機能を統合することでtempetを完成させることが出来ます。長くなるのでこの記事では省略しますが、一応僕が作成したtempet全体のソースコードを置いているGitHubリポジトリを掲載しておきます。 [Raspberry Pi側リポジトリ](https://github.com/pond-e/tempet_rpi) [Webアプリ側リポジトリ](https://github.com/pond-e/tempet-normal) **動作している様子** @[youtube](https://www.youtube.com/watch?v=WmHXAFHl6_U) ## 最後に ここまで読んでくださりありがとうございました。 一つの記事の内容としては規模が大きくなってしまいましたね(*_ _)人。実は元々tempetは3,4週間かけて作成する前提で考案したのでそれなりの規模感になっています。 この記事ではRaspberry Pi側の処理を中心に書きましたが、Webアプリ側で解説していない点としてユーザー認証や、非プログラマー向けのWebアプリからtempetを操作しリモコン赤外線コードの記録を行う機能についてなどがあります。IoTは奥が深いですね。 この記事を読んで何か気に入ってもらえる点や参考になれる点があれば幸いです。