RaspberryPi Zeroで部屋の快適化

<img width="1223" alt="スクリーンショット 2020-01-13 12.04.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150736/28da942a-f1d0-af3a-340c-1403ed37f403.png">
#１.概要
寒くなると、帰宅時に暖房効いてて欲しいと思いますよね。
私の部屋は、日立のリモートコントロール対応のエアコンを使ってるんですが、
スマホアプリ経由のコントロールしかできなくて、スマホアプリも微妙にアホ仕様。

室温を調べる機能はあるけど、結果はメールで遅れてくる。
コントロールも、送信すると、オンにしましたってメールでくる。

流行りのホームオートメーション系は全く未サポート
API未公開

ってことで、せめて今の環境をすぐ知りたいので、
AlexaにリンクしてるTVリモコン用のraspberryPi Zero の空きピンに
環境センサをつけました。

すでに、pigpioで赤外線リモコンを作って、Alexaからnode-red経由でTVコントロールしてます。
エアコンの赤外コントロールはやってません。長くて難解なので諦めました。

#2.完成品の写真
![8F9CCB63-547C-4DB7-B82A-E85E3A403E8D_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150736/e6ec8f0b-2168-3392-330d-ae3376ffaf6f.jpeg)

#3.解説
回路図は、以下の通り。
![home_remote_回路図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150736/f253c4f9-3cee-bac6-2d43-a7a434e10bc8.jpeg)

Fritzingの都合でセンサ名が違いますが、ほぼ同じだと思ってください。
HiLetgoのDHT11基板付き使ってます。プルアップ抵抗とか実装済みで使いやすいです。

IR1は、リモコンデータ作成用の受信素子で、滅多に使ってないです。
S1は、シャットダウン、起動用スイッチです。
プルアップして、BCM3と２７に接続。２７は長押しでシャットダウンするようにしてます。
３は、その後の起動用。この辺はネット情報調べて作りました。
以下のリンク先がわかりやすかったです。
RaspberryPiにshutdownボタンを付けよう
http://jellyware.jp/kurage/raspi/shutdown_button.html

赤外線リモコンは、いろいろ苦労しましたが、ネット上には、今となっては役に立たない情報が多く、ほんと困ります。
猫屋敷工房さんの情報が一番よかったです、他の情報に浮気してはいけない。
ラズパイでエアコン対応の赤外線学習リモコンを pigpioライブラリを使って作る方法、Goodbye LIRC
http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_gpio_pigpio_ir_remote_control/

LED4,5は赤外送信用
LED1,2,3は、送信時に点灯するようにしてます。パターンで動作状態がわかるように。

抵抗値は、手元にあったものなので、そんなに気にしないで。

#４本題　環境センサの使い方

DHT11のライブラリは、Adafruitのライブラリを使いました。
今回は、IOTっぽいことをしたかったので、Ambient接続も挑戦しました。

AdafruitDHTとambientをgitからとって来てくださいね。

センサ情報を取得するのは、サンプルコードをほぼそのまま使いました。

```python:AdafruitDHT_amb.py

#!/usr/bin/python

import sys

import Adafruit_DHT
import ambient　　#ambientをインポート

# Parse command line parameters.
sensor_args = { '11': Adafruit_DHT.DHT11,
                '22': Adafruit_DHT.DHT22,
                '2302': Adafruit_DHT.AM2302 }
if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print('Usage: sudo ./Adafruit_DHT.py [11|22|2302] <GPIO pin number>')
    print('Example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO pin #4')
    sys.exit(1)

# Try to grab a sensor reading.  Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

# Un-comment the line below to convert the temperature to Fahrenheit.
# temperature = temperature * 9/5.0 + 32

am = ambient.Ambient(チャンネル名,'書き込みキー') #ambient登録して各自入れてください


# Note that sometimes you won't get a reading and
# the results will be null (because Linux can't
# guarantee the timing of calls to read the sensor).
# If this happens try again!
if humidity is not None and temperature is not None:
    print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
    Di=0.81*temperature+0.01*humidity*(0.99*temperature-14.3)+46.3　#不快指数計算式
    print('Discomfort index={0:0.1f}'.format(Di))
    r = am.send({'d1':temperature,'d2':humidity,'d3':Di})　#ambientに送信
else:
    print('Failed to get reading. Try again!')
    sys.exit(1)
```

sudo ./AdafruitDHT_amb.py 11 4
で１回データ取得して、ambientに送信します。
5分おきに、記録したかったので、cronで自動実行したかったのですが
piユーザーでは、sudoコマンドが自動実行できないので
sudo suしてから
crontab -e
で登録するのがミソ。

#5.終わりに
とりあえず、備忘録的に記事登録しましたんで
気が向いたらもう少し詳しく書きます。

不快指数計算式は、CASIOさんのhpを参考にしました。
https://keisan.casio.jp/exec/system/1202883065