はじめに
昨今、自動温度調節機能やインターネット越しに操作できる機能を持ったエアコンが販売されていますが、それを導入するためにはエアコンごと買い替える必要があり費用が余計に掛かってしまいます。
そこで、リモコンでしか動かない古いタイプのエアコンでもスマートな操作が出来るようになるスマートリモコン「Tem ペット」を提案します。また、Tem ペットは温度管理が必要なペットを飼っている人向けにも作られており、飼っているペットに適した室温になるようにエアコンを操作します。
システム概要
ユーザはWebアプリケーションにアクセスしてTemペットの設定を行います。設定が完了したら、サーバーからTemペットへ設定を送信します。また、Temペットからサーバーに対して現在の室温を定期的に送信します。
Temペットは選択されたペットに適した温度になるようにセンサーを用いて室温を監視し、エアコンを操作します。
独創的な部分
-
古いタイプのエアコンのスマート化
Temペットは、リモコンでしか操作できない古いエアコンでも、スマートデバイスとして活用できるようにします。これにより、ユーザーは高価なスマートエアコンに買い替えずに、既存設備をより効率的に利用できます。 -
ペットに特化した温度管理機能:
温度センサーを搭載しており、飼っているペットに最適な室温を自動で設定する機能を持っています。このペットに合わせた温度管理は、ペットの健康と快適さを保つために特化して設計されています。
制作プロセス
材料
- Raspberry Pi zero w
- 5mm 赤外線LED OSI5LA5113A
- 赤外線リモコン受信モジュール OSRB38C9AA
- MOSFET 2N7000
- MOSFET IRFU9024NPBF
- 抵抗 4.7kΩ 1/2W
- 抵抗 33Ω 1W
- 温度センサー(BME280)
Raspberry Piで赤外線リモコンを作成する部分は以下のリンクを参考にしました。
格安スマートリモコンの作り方
ラズパイで外部からエアコンの電源を入れてみる その1
回路図
回路図はこんな感じです。
参考:赤外線LEDドライブ回路の決定版 - 電脳伝説
赤外線リモコン受信モジュールは黒ぽっちのある方向から見て左からOUTPUT, GND, VCC で、昇順で回路図のピン番号に対応しています。赤外線リモコン受信モジュールOSRB38C9AA データシート
赤外線の送受信
このデバイスのコア技術となる赤外線の送受信について書いていきます。実際のtempetに搭載するコードはこの節での内容を利用したものになります。ここでは、pigpioによる制御方法を紹介します。
pigpioのインストール
$ 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でラズパイの再起動時に自動的に走るように設定するのを推奨します。
$ echo 'm 17 w w 17 0 m 18 r pud 18 u' > /dev/pigpio
赤外線コードの記録
IR Record and Playbackという赤外線コードを記録するためのプログラムをダウンロードします。
$ curl http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip | zcat > irrp.py
そして、次のコマンドを実行してから実際のリモコンのボタンを押します。
$ 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
を送信するには、以下のコマンドを実行します。
$ python3 irrp.py -p -g17 -f codes light:on
赤外線は指向性がかなり厳しいので、赤外線LEDがちゃんと受信側の機械の受信部の方向に向くようにするのがポイントです。
tempetに必要な赤外線コードの記録
- 冷房
以下のコマンドを実行後、冷房として設定したい温度を記録します。
$ python3 irrp.py -r -g18 -f cooling light:on --no-confirm --post 130
- 暖房
$ python3 irrp.py -r -g18 -f heating light:on --no-confirm --post 130
- エアコンの電源
$ python3 irrp.py -r -g18 -f power light:on --no-confirm --post 130
- エアコンの停止
$ python3 irrp.py -r -g18 -f stop_button light:on --no-confirm --post 130
温度センサーから室温を取得
tempetは室温に応じてエアコンのON, OFFを操作するので、室温を取得する必要があります。
I2Cの有効化
Raspberry PiのI2Cはデフォルトでは無効になっているので、設定を変更して有効にします。
以下のコマンドを使用してラズパイの設定を変更します。
$ raspi-config
Interfacing Options -> I2C -> Yes を選択してI2Cを有効化します。
設定できたら、左右矢印でFinishを選択して、エンターキーを押して、raspi-configを終わります。
I2Cライブラリのインストール
smbus2をインストールします
$ sudo apt update
$ sudo apt install python3-smbus2
コード
コードが長くなったのでGitHub Gistに上げました。
bme280.py
室温に応じてエアコンをON, OFFする
上記で記録した赤外線コードと温度センサーのコードを組み合わせて、室温に応じたエアコン操作を行います。処理の概要としては、lower、upper変数で目標とする室温の上限と下限を設定し、温度センサーで室温を確認した後subprocessを用いて赤外線コード送信のpythonファイルを実行しています。
注意:同一ディレクトリにbme280.pyがあることを確認して実行してください。
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
と同一のディレクトリに配置して実行してください。
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アプリ側の受信コードは次のようになります。
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の使い方は本記事では省略します。)
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側リポジトリ
Webアプリ側リポジトリ
動作している様子
最後に
ここまで読んでくださりありがとうございました。
一つの記事の内容としては規模が大きくなってしまいましたね(*_ _)人。実は元々tempetは3,4週間かけて作成する前提で考案したのでそれなりの規模感になっています。
この記事ではRaspberry Pi側の処理を中心に書きましたが、Webアプリ側で解説していない点としてユーザー認証や、非プログラマー向けのWebアプリからtempetを操作しリモコン赤外線コードの記録を行う機能についてなどがあります。IoTは奥が深いですね。
この記事を読んで何か気に入ってもらえる点や参考になれる点があれば幸いです。
-
pond6814
さんが
2024/10/25
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する