×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
・RaspberypiでガーデンIot その6 計測を自動実行 cronを仕様 2017/08
・cronはすでに含まれているのでcrontabを記載すれば自動実行
1.書式は
crontab -l 内容表示
crontab -e ファイル編集
crontab -r ファイル削除
2.コマンド
* * * * * 分 時 日 月 曜日
0-59 0-23 1-31 1-12 0-7 日-日
例
0-59 * * * * 毎分実行
*/5 * * * * 5分間隔で実行
0 * * * * 毎時00分に実行
*0,3,6 * * * 0,3,6時に実行
0 0 1 * * 毎月1日の0時0分に実行
3.コマンドは一般権限なので注意
3.編集
nanoで編集 CTRL+Oで上書き CTRL+Xで終了
4.今回の設定
毎時実行を確認
・cronはすでに含まれているのでcrontabを記載すれば自動実行
1.書式は
crontab -l 内容表示
crontab -e ファイル編集
crontab -r ファイル削除
2.コマンド
* * * * * 分 時 日 月 曜日
0-59 0-23 1-31 1-12 0-7 日-日
例
0-59 * * * * 毎分実行
*/5 * * * * 5分間隔で実行
0 * * * * 毎時00分に実行
*0,3,6 * * * 0,3,6時に実行
0 0 1 * * 毎月1日の0時0分に実行
3.コマンドは一般権限なので注意
3.編集
nanoで編集 CTRL+Oで上書き CTRL+Xで終了
4.今回の設定
0 * * * * python3 /home/pi/senseronce.py
毎時実行を確認
・RaspberypiでガーデンIot その3 web環境の生成 cgiserver
・cgiserver.py
・cgiserver.py
import http.server
import sys
try:
server_address = ("", 8000)
handler_class = http.server.CGIHTTPRequestHandler #1 ハンドラを設定
server = http.server.HTTPServer(server_address, handler_class)
server.serve_forever()
except KeyboardInterrupt:
sys.exit()
・cgiserverの起動
sudo pyhton3 -m cgiserver.py
・cgiディレクトの作成 (cgiserverの規定値)
/home/piの下にcgi-binを作成する
・sencer.htmlの作成
・cgiserverの起動
sudo pyhton3 -m cgiserver.py
・cgiディレクトの作成 (cgiserverの規定値)
/home/piの下にcgi-binを作成する
・sencer.htmlの作成
<html>
<head>
<title>Python3 CGI test1</title>
</head>
<body>
<h1>Python3 CGI sencer</h1><hr><p>
<form name = "Form1" method="POST" action="/cgi-bin/sencerdsp.py">
ymd: <input type="text" size=30 name="ymd"><p>
<input type="submit" value="送信" name="button1"><p>
</form>
</body>
</html>
・起動は
http://localhost:8000/sencer.html
ipアドレスでも可能
・起動は
http://localhost:8000/sencer.html
ipアドレスでも可能
・RaspberypiでガーデンIot その2 センサーデータ収集 MCP3208
CSVでデータ出力
sencer.py
#spi 電圧に変換3.3v
#spi電圧に変換5v
#spi LM35用 電圧を温度に
#bme280 初期設定
#データの読み込み
CSVでデータ出力
sencer.py
import spidev
import time
import csv
import datetime
import smbus #bme280
#bme280
bus_number = 1
i2c_address = 0x76
bus = smbus.SMBus(bus_number)
digT = []
digP = []
digH = []
t_fine = 0.0
#bme280
#spi
#spiのオープンとspiバスの指定
#spiのオープンとspiバスの指定
spi= spidev.SpiDev()
spi.open(0,0)
#csv
filena='data.csv'
#spi mco3208
#12ビットでデータを指定チャネルから読み込み
#12ビットでデータを指定チャネルから読み込み
def adc_read12(ch):
r = spi.xfer2([4|2|(ch >> 2), (ch & 3 ) << 6,0])
v=((r[1] & 0xF) << 8 ) + r[2]
return v
#spi 電圧に変換3.3v
def conv_volts(data,places):
volts = (data *3.3)/float(4096)
volts=round(volts,places)
return volts
#spi電圧に変換5v
def conv_volts5(data,places):
volts = (data *5.0)/float(4096)
volts=round(volts,places)
return volts
#spi LM35用 電圧を温度に
def conv_temp(volts,places):
temp = volts * 100
temp =round(temp,places)
return temp
#spi
#i2c モードの書き込み
def writeReg_bme280(reg_address, data):
bus.write_byte_data(i2c_address,reg_address,data)
#bme280 初期設定
def get_calib_param_bme280():
calib = []
for i in range (0x88,0x88+24):
calib.append(bus.read_byte_data(i2c_address,i))
calib.append(bus.read_byte_data(i2c_address,0xA1))
for i in range (0xE1,0xE1+7):
calib.append(bus.read_byte_data(i2c_address,i))
digT.append((calib[1] << 8) | calib[0])
digT.append((calib[3] << 8) | calib[2])
digT.append((calib[5] << 8) | calib[4])
digP.append((calib[7] << 8) | calib[6])
digP.append((calib[9] << 8) | calib[8])
digP.append((calib[11]<< 8) | calib[10])
digP.append((calib[13]<< 8) | calib[12])
digP.append((calib[15]<< 8) | calib[14])
digP.append((calib[17]<< 8) | calib[16])
digP.append((calib[19]<< 8) | calib[18])
digP.append((calib[21]<< 8) | calib[20])
digP.append((calib[23]<< 8) | calib[22])
digH.append( calib[24] )
digH.append((calib[26]<< 8) | calib[25])
digH.append( calib[27] )
digH.append((calib[28]<< 4) | (0x0F & calib[29]))
digH.append((calib[30]<< 4) | ((calib[29] >> 4) & 0x0F))
digH.append( calib[31] )
for i in range(1,2):
if digT[i] & 0x8000:
digT[i] = (-digT[i] ^ 0xFFFF) + 1
for i in range(1,8):
if digP[i] & 0x8000:
digP[i] = (-digP[i] ^ 0xFFFF) + 1
for i in range(0,6):
if digH[i] & 0x8000:
digH[i] = (-digH[i] ^ 0xFFFF) + 1
#データの読み込み
def readData_bme280():
data = []
for i in range (0xF7, 0xF7+8):
data.append(bus.read_byte_data(i2c_address,i))
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
hum_raw = (data[6] << 8) | data[7]
return(temp_raw,pres_raw,hum_raw)
#compensate_bme280_T(temp_raw)
#compensate_bme280_P(pres_raw)
#compensate_bme280_H(hum_raw)
def compensate_bme280_P(adc_P):
global t_fine
pressure = 0.0
v1 = (t_fine / 2.0) - 64000.0
v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * digP[5]
v2 = v2 + ((v1 * digP[4]) * 2.0)
v2 = (v2 / 4.0) + (digP[3] * 65536.0)
v1 = (((digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8) + ((digP[1] * v1) / 2.0)) / 262144
v1 = ((32768 + v1) * digP[0]) / 32768
if v1 == 0:
return 0
pressure = ((1048576 - adc_P) - (v2 / 4096)) * 3125
if pressure < 0x80000000:
pressure = (pressure * 2.0) / v1
else:
pressure = (pressure / v1) * 2
v1 = (digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096
v2 = ((pressure / 4.0) * digP[7]) / 8192.0
pressure = pressure + ((v1 + v2 + digP[6]) / 16.0)
return pressure
#print ("pressure : %7.2f hPa" % (pressure/100))
def compensate_bme280_T(adc_T):
global t_fine
v1 = (adc_T / 16384.0 - digT[0] / 1024.0) * digT[1]
v2 = (adc_T / 131072.0 - digT[0] / 8192.0) * (adc_T / 131072.0 - digT[0] / 8192.0) * digT[2]
t_fine = v1 + v2
temperature = t_fine / 5120.0
return temperature
#print ("temp : %-6.2f " % (temperature))
def compensate_bme280_H(adc_H):
global t_fine
var_h = t_fine - 76800.0
if var_h != 0:
var_h = (adc_H - (digH[3] * 64.0 + digH[4]/16384.0 * var_h)) * (digH[1] / 65536.0 * (1.0 + digH[5] / 67108864.0 * var_h * (1.0 + digH[2] / 67108864.0 * var_h)))
else:
return 0
var_h = var_h * (1.0 - digH[0] * var_h / 524288.0)
if var_h > 100.0:
var_h = 100.0
elif var_h < 0.0:
var_h = 0.0
return var_h
#print ("hum : %6.2f " % (var_h))
def setup_bme280():
osrs_t = 1 #Temperature oversampling x 1
osrs_p = 1 #Pressure oversampling x 1
osrs_h = 1 #Humidity oversampling x 1
mode = 3 #Normal mode
t_sb = 5 #Tstandby 1000ms
filter = 0 #Filter off
spi3w_en = 0 #3-wire SPI Disable
ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode
config_reg = (t_sb << 5) | (filter << 2) | spi3w_en
ctrl_hum_reg = osrs_h
writeReg_bme280(0xF2,ctrl_hum_reg)
writeReg_bme280(0xF4,ctrl_meas_reg)
writeReg_bme280(0xF5,config_reg)
#exec
#
setup_bme280()
get_calib_param_bme280()
#bme280
while True:
try:
d=adc_read12(1)
#print("adc 0 : {:8} ".format(d))
v=conv_volts(d,4)
#print("volts: {:8.2f}".format(v))
t=conv_temp(v,4)
print("temp1 : {:8.2f}".format(t))
t1= t
#print("------------------------")
#time.sleep(1)
d=adc_read12(2)
# print("adc 1: {:8} ".format(d))
v=conv_volts(d,4)
# print("volts: {:8.2f}".format(v))
t=conv_temp(v,4)
print("temp2 : {:8.2f}".format(t))
t2= t
#print("------------------------")
#time.sleep(1)
d=adc_read12(0)
print("light : {:8} ".format(d))
v=conv_volts(d,4)
#print("volts: {:8.2f}".format(v))
l1= d
#print("------------------------")
#time.sleep(1)
d=adc_read12(3)
print("suibun: {:8} ".format(d))
v=conv_volts5(d,4)
# print("volts: {:8.2f}".format(v))
s1= d
#print("------------------------")
adc_T,adc_P,adc_H=readData_bme280()
t280=compensate_bme280_T(adc_T)
print ("temp : %-6.2f " % (t280))
p280=compensate_bme280_P(adc_P)
print ("pressure : %7.2f hPa" % (p280/100))
h280=compensate_bme280_H(adc_H)
print ("hum : %6.2f " % (h280))
print("---------------------------")
now=datetime.datetime.now()
tstr = now.strftime('%Y/%m/%d-%H:%M:%S')
list = [tstr,t1, t2, l1 ,s1,round(t280,2),round(p280/100,2),round(h280,2)]
filena = now.strftime('%Y%m%d') + ".csv"
f=open(filena,'a+')
writer = csv.writer(f, lineterminator='\n')
writer.writerow(list)
f.close()
#bme280
time.sleep(5)
except KeyboardInterrupt:
break
spi.close()
・RaspberypiでガーデンIot その1 2017/08現在
・仕様
webで年月日を入力 >> webで時間ごとのCSVセンサー値を表示
定時でセンサーからの信号をCSVで記録
・センサー
温度 LM35(土中、土壌面)
湿度 BME280(空中) 土壌センサー
明るさ 光センサー CDS 10kで分流
気圧 BME280
・ソフト
web python3 cgiserver
html python3 cgi python3
センサ python3
・センサーとraspberypiとの接続
SPI MCP2308 LM3 土壌センサー 光センサー
I2C BE280
・結果
日付を入力
時間ごとのセンス値を表示
・できなかった事
CGI中でセンサー値収集を実行しようとしたが、
センサー値収集等IO端子の実行sudoさんでないと実行できない
CGIではsudo権限がない
wiringpiで実行できるようだが2017/7現在raspberypi3とは
相性が悪い
よって単純にCSVデータでのやり取りで実行した
・仕様
webで年月日を入力 >> webで時間ごとのCSVセンサー値を表示
定時でセンサーからの信号をCSVで記録
・センサー
温度 LM35(土中、土壌面)
湿度 BME280(空中) 土壌センサー
明るさ 光センサー CDS 10kで分流
気圧 BME280
・ソフト
web python3 cgiserver
html python3 cgi python3
センサ python3
・センサーとraspberypiとの接続
SPI MCP2308 LM3 土壌センサー 光センサー
I2C BE280
・結果
日付を入力
時間ごとのセンス値を表示
・できなかった事
CGI中でセンサー値収集を実行しようとしたが、
センサー値収集等IO端子の実行sudoさんでないと実行できない
CGIではsudo権限がない
wiringpiで実行できるようだが2017/7現在raspberypi3とは
相性が悪い
よって単純にCSVデータでのやり取りで実行した