Raspberrypi で気温測定
2017.04.19 (raspibian  jessie)
    2017.11.21(raspbian jessie)

1. ハードウェア
 Raspberrypi B+  ,温度センサー ADT7410

配線
Raspberrypi側      ADT7410側
1pin(3.3V)   ------VDD
3pin(I2C SDA)------SDA
5pin(I2C SCL)------SCL
6pin(GND)    ------GND


2. 設定
i2c-toolsをインストール(pythonを使う場合はpython-smbusも)
sudo apt-get install i2c-tools  python-smbus


設定ファイルに記述を追加
/etc/modules
i2c-bcm2708
i2c-dev

/boot/config.txt(最後の方)
device_tree=bcm2708-rpi-b.dtb
#device_tree_param=i2c1=on
#device_tree_param=spi=on
または
/boot/config.txt
dtparam=i2c_arm=on
dtparam=i2s=on
dtparam=spi=on

karappiというユーザーもi2cを使えるようにi2cグループをkarappiのサブグループに追加する。

$ sudo usermod -a -G i2c karappi



再起動してi2cdetectを実行
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                        

i2cと接続されているデバイス番号が0x48だとわかる。
続けてデータを見る



3.温度計測プログラム(ruby)
rubyは最初からインストールされている。gemを使って温度を利用するスクリプトを用意

$ sudo gem install i2c
$ sudo gem install i2c-devices

温度を計測してログに吐き出すプログラム
氷点下では下のrubyのスクリプトは動かないことが判明(2017.11.21) そこで、pythonのスクリプトをその次に示す。 
ondo.rb
#!/usr/bin/env ruby
#!/usr/bin/ruby -Ku

#*******************************************
# 温度センサーADT7410から温度を計測する
#            2017.04.16
#  http://blog.takady.net/blog/2015/12/18/raspberry-pi-with-adt7410/
#  を参考にさせていただきました。
#*******************************************
require 'i2c/device/adt7410'
require 'i2c/driver/i2c-dev'
require 'date'

###########################
#温度をi2c経由で読み込む
###########################
arr = Array.new
log_file = "/home/karappi/public_html/ondo/ondo.log"
device = I2CDevice::ADT7410.new(driver: I2CDevice::Driver::I2CDev.new('/dev/i2c-1'), address: 0x48)
time=DateTime.now
ondo = device.calculate_temperature.round 2

###########################
#ondo.logに追加書き込むする
###########################
    file=File.open(log_file,'a')
       file.print  time.year,"/",time.mon,"/",time.day," ", time.hour,":",time.min,",",ondo,"\n"
    file.close
実行方法  ruby  ondo.rb

上のプログラムondo.rbをcrontabで定期的に実行すると
ondo.log に追記されていく

上のプログラムの代替( 実行方法は python ondo.py)


 -*- coding: utf-8 -*-
import smbus
import datetime # 日付のモジュールインポート
from time import sleep

log_file='ondo.log'

def read_adt7410():
    word_data = bus.read_word_data(address_adt7410, register_adt7410)
    data = (word_data & 0xff00)>>8 | (word_data & 0xff)<<8
    data = data>>3 # 13ビットデータ
    if data & 0x1000 == 0: # 温度が正または0の場合
        temperature =data * 0.0625
    else: # 温度が負の場合、絶対値を取っ手からマイナスをかける
        temperature = ((~data & 0x1fff)+1) * -0.0625
    return temperature

bus =smbus.SMBus(1)
address_adt7410 = 0x48
register_adt7410 = 0x00

inputValue = read_adt7410()
#print(inputValue) #温度の表示
d=datetime.datetime.today().strftime('%Y/%m/%d %H:%M')

file=open(log_file,'a')
string_list= str(d)+','+str(inputValue)+'\n'
#print string_list
file.write(string_list)
file.close()




以下は上のプログラムをcrontabで20分毎に72[回/日]することを前提に過去24時間の温度グラフと過去10日間のグラフ、約1年分 (366日)の毎日の最高温度、最低温度のグラフを作成する設定

ondo.sh    温度を計測するシェルスクリプト
#!/bin/bash
#/usr/bin/ruby $HOME/raspi_jikken/adt/adtr01.rb
#/usr/bin/ruby /home/karappi/public_html/ondo/ondo.rb
/usr/bin/python /home/karappi/public_html/ondo/ondo.py

/usr/bin/tail -72 /home/karappi/public_html/ondo/ondo.log > /home/karappi/public_html/ondo/day.log
/usr/bin/gnuplot < /home/karappi/public_html/ondo/day.bat
#
/usr/bin/tail -720 /home/karappi/public_html/ondo/ondo.log > /home/karappi/public_html/ondo/week.log
/usr/bin/gnuplot  < /home/karappi/public_html/ondo/week.bat

ondo.log から72個のデータをday.logに移してgunuplot でグラフ化 (グラフはday.batによりでday.png で出力される)
さらに720個文のデータをweek.logに移してgnuplotで過去10日間をグラフ化(グラフはweek.batによりで week.png で出力される)


day.bat     gnuplotで過去24時間分のグラフを作るスクリプト
set output '/home/karappi/public_html/ondo/day.png'
set terminal png
set datafile separator ','
set xdata time
set timefmt '%Y/%m/%d %H:%M'
set format x '%H:%M'
set xlabel 'time'
set ylabel 'degree C'
set title 'temperature at Sawatari Spa in GUNMA JAPAN'
plot "/home/karappi/public_html/ondo/day.log" using 1:2 w lp


week.bat     gnuplotで過去10日分のグラフを作るスクリプト
set output '/home/karappi/public_html/ondo/week.png'
set terminal png
set datafile separator ','
set xdata time
set timefmt '%Y/%m/%d %H:%M'
#set format x '%H:%M'
set format x '%m/%d'
set xlabel 'time'
set ylabel 'degree C'
set title 'temperature at Sawatari Spa in GUNMA JAPAN'
plot "/home/karappi/public_html/ondo/week.log" using 1:2 w lp



maxmin.rb  1日の最高温度、最低温度をmaxmin.logに吐き出すプログラム
day.logからmaxmin.logに出力する。もしday.logに2日分以上のデータがあったら最後の方の日付の最高、最低温度を出力す る
maxmin.logは366行を超えたら先頭行を削除して後ろにデータを追加している
#!/usr/bin/env ruby6
#!/usr/bin/ruby -Ku

#**********************************************
# day.logから最高温度と最低温度のログmaxmin.logを作る
# 1日1回、23:50分にcrontabで実行する。
# 入力はday.logファイル、出力はmaxmin.logファイル
#  day.logは1日の気温が3列目に20分毎に最高72個入っている
#  すべて同日のデータは23:45分〜0:00の間にclontabで処理する
#  書式例(2917年3月16日に最低気温5.20 最高気温12.3の場合
#  2017/03/16 5.20 12.3
#  上のレコードが最大366行分記録される。367日目以降は
#  先頭行を削除して最後尾に追加
#**********************************************
require 'date'

i_file="/home/karappi/public_html/ondo/day.log"
o_file="/home/karappi/public_html/ondo/maxmin.log"


hiduke = Array.new #日付の文字列用
old_hiduke = Array.new #日付の文字列用
rec_arr = Array.new #レコード操作用
t_max = -99.99 #最高温度の初期値 ありえない程低くしておく
t_min = 99.99  #最低温度の初期値 ありえない程高くしておく
old_hiduke = "2017/3/31" #日付の初期値
#もし途中で日付が変わったら古い日付のデータは捨てる。

##################################################
# day.logファイルを開いて
# 最大72行分を配列に取り込む
##################################################
#まずは配列にとりこむ
i=0
File.open(i_file,'r'){|file1|
        file1.each{|line|
        str=line
        strAry=str.split(",")
            #strAry.each do |youso|
            #        print youso,"\n"
                #end

        hiduke=strAry[0] #1列目が日付
        hiduke=hiduke[0,hiduke.index(" ")]
        if old_hiduke != hiduke then
            t_max = -99.99 #最高温度の初期値 ありえない程低くしておく
            t_min = 99.99  #最低温度の初期値 ありえない程高くしておく
            old_hiduke = hiduke   
        end
       
        temp=  strAry[1].to_f #2列目が温度
        #print temp,"\n"
        if t_max < temp then
            t_max = temp
        end
        if t_min > temp then
            t_min = temp
        end
       
        hiduke=strAry[0] #1列目が日付
        hiduke=hiduke[0,hiduke.index(" ")]
        i=i+1
        }
}
#print hiduke," ", t_min.to_s," ",t_max.to_s,"\n"

#まずは出力ファイルを配列にとりこむ
i=0
File.open(o_file,'r'){|file1|
        file1.each{|line|
          #print line
          rec_arr[i]=line
          i=i+1
        }
}

#366行未満なら最後に日付と最低気温、最高気温を追加
#366行あったら最初の1行カットして最後に日付と最低気温と最高気温を追加
if i < 366 then
    file=File.open(o_file,'a')
       file.print hiduke," ", t_min.to_s," ",t_max.to_s,"\n"
    file.close
else
    file=File.open(o_file,'w')
        for i in 1...366 # ドットが3つのときは366を含まない範囲
            file.puts rec_arr[i]
        end
       file.print hiduke," ", t_min.to_s," ",t_max.to_s,"\n"
    file.close
end



maxmin.sh   最高温度、最低温度をグラフ化するシェルスクリプト
#!/bin/bash
/usr/bin/ruby /home/karappi/public_html/ondo/maxmin.rb
/usr/bin/gnuplot < /home/karappi/public_html/ondo/maxmin.bat

gunuplot で最高気温の変化、最低気温の変化をグラフ化するスクリプト
set output '/home/karappi/public_html/ondo/maxmin.png'
set terminal png
set datafile separator ' '
set xdata time
set timefmt '%Y/%m/%d'
set format x '%m/%d'
set xlabel 'month/day'
set ylabel 'degree C'
set title 'max & min temperature'
p '/home/karappi/public_html/ondo/maxmin.log' u 1:3 w lp,'/home/karappi/public_html/ondo/maxmin.log' u 1:2 w lp



crontab -l
#温度計測
00 * * * * /home/karappi/public_html/ondo/ondo.sh
20 * * * * /home/karappi/public_html/ondo/ondo.sh
40 * * * * /home/karappi/public_html/ondo/ondo.sh
50 23 * * * /home/karappi/public_html/ondo/maxmin.sh