Qiitaユーザの方は初めまして。シルミノです。
Raspberry Pi 3B+とAM2320という温湿度センサモジュールを使って遊んでみました。
紹介とか感想とかは下記リンクの私のブログにあります。
http://silumino.hatenablog.jp/entry/2020/01/07/234405
動画もあります。
https://www.nicovideo.jp/watch/sm36188517
じゃあ何なんだこの記事はって話ですが、プログラム全文を載せるには適している気がしたので。
コミュニティ的に。
ではプログラムです。
humid_temper_measure.py
import RPi.GPIO as GPIO
import time
import smbus
import threading
import signal
import datetime
import csv
def read_sensor():
print ("Start")
i2c = smbus.SMBus(1)
slave_signal = 0x5c #B8 = 5c << 1 1bit left bit shift
read_data = 0x03
#Sleep off
try:
i2c.write_i2c_block_data(slave_signal, 0x00, [])
except:
pass
#Wait >0.8ms
time.sleep(0.005)
#Call sensor_address,command,[starting_register_address, number_of_registers]
i2c.write_i2c_block_data(slave_signal, read_data, [0x00, 0x04])
print ("Slave signal is sent")
#Wait >1.5ms
time.sleep(0.005)
#Read
measured_data = i2c.read_i2c_block_data(slave_signal, read_data)
print("Data are received")
#for data in measured_data:
# print (data)
#calculation
humidity = float(measured_data[2] << 8 | measured_data[3])/10
if measured_data[4] >= 0x80:
temperature = float((measured_data[4] - 0x80) << 8 | measured_data[5]) / (-10)
else:
temperature = float(measured_data[4] << 8 | measured_data[5]) / 10
time_now = datetime.datetime.now()
print(time_now)
print("{0:.1f} %".format(humidity))
print("{0:.1f} degC".format(temperature))
#add data to log file
with open(csv_name, "a", newline='') as csv_file:
csv_writer = csv.writer(csv_file, lineterminator='\n')
csv_writer.writerow([time_now,humidity,temperature])
def make_thread(a, b): #only make a thread
thread_1 = threading.Thread(target = read_sensor)
thread_1.start()
#main
#wait until xx:xx:00
while True:
time_now2 = datetime.datetime.now()
now_sec = time_now2.second
if now_sec == 59:
break
time.sleep(0.1)
#set interrupt timer
signal.signal(signal.SIGALRM, make_thread)
signal.setitimer(signal.ITIMER_REAL, 1, 60)
#make csv file
csv_date = time_now2.strftime("%Y%m%d%H%M%S")
csv_name = "%s.csv" % (csv_date)
with open(csv_name, "w", newline='') as csv_file:
csv_writer = csv.writer(csv_file, lineterminator='\n')
csv_writer.writerow(["Time","Humidity(%)","Temperature(degC)"])
#main loop
while True:
time.sleep(1)
RPi.GPIOは使っていませんが、今後の機能追加を考えてのことです。
あと、わからないところとしては、make_threadに2個引数をつけないといけない理由がわかりません。
いったい何が渡されているんだ。(※まだpython初心者です)
だいたいコメントは書いてあるので内容はわかるかと思います。
Sleep offのところや、5msだけ待っているところ、最後の無限ループなんかは電子回路特有のプログラムですね。
並列化も信号処理を考えてつけておきましたが、メインループが「何もしない」なので無意味。