Python
RaspberryPi

raspberrypiで環境値(照度・温度・湿度・大気圧)を測定。~センサユニット作製→データ取得編~

More than 1 year has passed since last update.


■これまでの経緯

『gphoto2を使ってラズパイからカメラ制御する(1) (構想編) - Qiita』

『gphoto2を使ってラズパイからカメラ制御する(2) (設定考察編) - Qiita』

『raspberrypiでI2CのTSL2561(照度センサー)とAE-BME280(温度・湿度・大気圧計)を使う - Qiita』

『ラズパイでシャットダウンボタンを付ける(ついでに起動ボタン) - Qiita』

『I2CのHUBを作る。 - Qiita』


■目的(おさらい)

なんだかんだスローに進めている上記検討。

もともとはラズパイからカメラを操作して、朝日タイムラプス撮影に有効なデバイスを作るという目的がある。

そのために、 朝方の照度推定 の為に照度を測定しようとしている。

普通とちょっと違うのは、 天気の推定ではない ということ。

写真撮影に必要なのは光の量なので、照度がわかればよい。

自分が求めているのは、真っ暗闇の日の出前において、数時間後の太陽が登った後の照度が知りたい。

単純に天気だけでは、実際にどのくらいの照度になるのかはわからない。晴れ・曇りなどの天気だけでは、光量までは推定できない。

雲量の情報もあるが、そこから照度の関係はわからない。

そのため、実際に天気(雲量)と照度を測定・比較することで、どのような天気であれば、日の出後の明るさはどのくらいになるかというのを実測してみたいというのが始まり。

大気圧・照度(ついでに温湿度)の傾向分析



天気(雲量)の推定



照度の推定

ということでまず環境値を取得しようとしている。

後々公開されている天気予報APIを使って、雲量を取得し、付き合わせるつもりだが、まずは環境値そのものを測定できるようにする。


■センサユニット

BME280(温度・湿度・大気圧計)を使う - Qiita』で作ったセンサをまとめた。

初期型。GroveのI2Cハブに繋げる。

が、ケーブルが邪魔になってケースに入り切らなかった。

といわけでHUB機能の専用ボード作った。



なんとかケースに入ったので、とりあえずこれでしばらくやってみる。


■センシングプログラム


SensorMain.py

#!/path/to/python

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import bme280 #大気圧・温度・湿度センサー
from tsl2561 import TSL2561 #照度センサー
import LCD_AQM0802 #LCD

import smbus # sudo apt-get install python-smbus
import time
import csv
import datetime
import os.path

CHANNEL = 0
GAIN = 1
LED = 21

bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)
GPIO.output(LED, True)
GPIO.output(LED, False)
GPIO.cleanup()

if __name__ == "__main__":

errcount = 0
year=datetime.datetime.now().year
month=datetime.datetime.now().month
day=datetime.datetime.now().day
hour=datetime.datetime.now().hour

todaydate=str(year)+"/"+str(month)+"/"+str(day)
filename=str(year)+str(month)+str(day)+"photodata.csv"

if not os.path.exists(filename):
#ファイルが存在しない場合生成。
f = open(filename, 'w')
f.writelines(todaydate+'\n')
writer = csv.writer(f, lineterminator='\n')
writer.writerow(["time","light","pressure","temperature","humidity"])
f.close()

lcd = LCD_AQM0802.i2clcd()
lcd.clear()
temperature, pressure, humidity = bme280.readBME280All()
tsl = TSL2561(debug=True)
light = tsl.lux()

now =datetime.datetime.now()

pressure = round(pressure,1)
temperature = round(temperature,1)
humidity = round(humidity,1)

f = open(filename, 'a')
writer = csv.writer(f, lineterminator='\n')
writer.writerow(datavalue)
f.close()

try:
lcd.setaddress(0, 0)
lcd.puts(str(hour)+":"+str(minute)+":"+str(second))
lcd.setaddress(1, 0)
lcd.puts(str(light).rjust(5)+"Lux")

except IOError:
errcount +=1
lcd.setaddress(0, 0)
lcd.puts(str(hour)+":"+str(minute)+":"+str(second))
lcd.setaddress(1, 0)
lcd.puts("IO Error")


※Qiita用に不要な部分は削除したり手を加えているので、動作の保証はしない。

importしている各センサ・LCDのモジュールは前回記事参照。

前回は、while True文で、sleepにて測定間隔を開けながら一つのプログラム内でずっと回していた。(try except文はその時の名残)

しかし、それだとエラーによって割とすぐに止まっており、夜に起動→朝見たら動いてないという残念な状況が続いていた。

そこでwhile文を諦めて、一回プログラムが起動したら一回だけ測定するようにし、このプログラムをcronにて毎分起動させるように設定した。

更に、起動中はGPIOにてLEDを点灯させることで、傍目からも動作していることを確認できるようにした。


■cronによる定期起動

crontab -eにて以下追加。

*/1 * * * * sudo python /home/pi/pyhome/SensorMain.py

これだと完全に1分間隔なので今後は朝方の時間指定に限定するつもり。


■取得データ

こんな感じ。

2017/10/22

time,light,pressure,temperature,humidity
2017-10-22 00:00:03.452308,41,1009.0,27.7,57.5
2017-10-22 00:01:03.124921,41,1008.9,27.6,57.6
2017-10-22 00:02:02.761255,41,1008.9,27.6,57.7
2017-10-22 00:03:03.415130,41,1008.9,27.6,57.7
2017-10-22 00:04:03.071786,41,1008.9,27.6,57.8
2017-10-22 00:05:02.726921,41,1008.8,27.5,57.8

とりあえずこんな感じでデータは取りつつちょいちょいアップデートしていこう。

次はこれにその時間の天気・雲量を反映させて、相関をとりたい。