LoginSignup
0
1

More than 3 years have passed since last update.

RaspberryPiとAM2320で温湿度取得・CSVログ保存

Posted at

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だけ待っているところ、最後の無限ループなんかは電子回路特有のプログラムですね。
並列化も信号処理を考えてつけておきましたが、メインループが「何もしない」なので無意味。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1