現在の温度を取得、設定温度と比較してヒーターの制御を行なう、実際に調理を行なうするための主要プログラムです。
<heaterd.py>
#!/usr/bin/python2
import RPi.GPIO as GPIO
import time
import sys
import atexit
import file_mng as file
import datetimeheater = 17
set_heat_time = 10.0
#出力値をストック
stock_power =
#温度をストック
stock_temp =#ストックするサイズ
size_list = 12
#10秒中、何秒ヒーターをONにするか
power_on = 10.0#ログデータのファイル名
file_log = None
#ログデータ保存
def save_log( now_temp, power_on ):
global file_log
if file_log is None:
now = datetime.datetime.now()
file_log = now.strftime("%Y%m%d-%H%M%S")
file.log( file_log, now_temp, power_on )
#ヒーター出力ピン設定
def init():
GPIO.setmode(GPIO.BCM)
GPIO.setup(heater,GPIO.OUT)
atexit.register(end)#異常終了時にGPIOをリセット
def end():
GPIO.cleanup()
print "cleanup"
#ヒーターのON,OFF
def on():
GPIO.output(heater,1)
def off():
GPIO.output(heater,0)
#ヒーターをON、OFFにして指定時間待機
def heat( tim_on ):
tim_off = set_heat_time - tim_on
if 0.0 < tim_on:
on()
file.save_row_4('heating...' + str( tim_on ) +'sec' )
time.sleep( tim_on )
if 0.0 < tim_off:
off()
file.save_row_4('cooling...' + str( tim_off ) +'sec' )
time.sleep( tim_off )
def main():
global stock_power, stock_temp ,power_on#設定温度を読み出し
set_temp = float( file.get_temp_set() )
#温度制御開始は設定温度の半分に達してから
start_temp = set_temp *0.5
now_temp = file.load_temp()#現在温度を読み込む
try:
now_temp = float(now_temp)
except:#読み込み失敗したらストッカーの最新の温度で代用
if 0 < len(stock_temp):
now_temp = stock_temp[ len(stock_temp) -1 ]
else:
now_temp = 0.0
#設定温度以上ならヒーターOFF
if set_temp <= now_temp:
power_on = 0.0
#制御開始温度以上であればヒーターON時間を計算する
elif start_temp < now_temp :
#温度に反比例するように制御(廃案)
#wari = 1.0 - ( ( now_temp - start_temp ) / ( set_temp - start_temp ) )
#sinカーブを利用して制御(採用)
d = 90 * ( set_temp - now_temp ) / ( set_temp - start_temp )
wari = math.sin( math.radians( d ) )
if 0 < wari:power_on = set_heat_time * wari
if size_list <= len(stock_temp):
sum_temp = 0
sum_power = 0
count_heat = 0
for i in range( 1, len(stock_temp) ):
sum_temp = sum_temp + ( stock_temp[ i ] - stock_temp[ i -1 ] )
sum_power = sum_power + stock_power[ i -1 ]
avl_temp = sum_temp / ( len( stock_temp ) -1 )
avl_power = sum_power / ( len( stock_power ) -1 )
if avl_power > 0.0:
#ターボモード、温度が勢いよく下がったらヒーター時間を長くする
tarbo = ( avl_temp / avl_power )
if tarbo < 0.0:
power_on = power_on * ( 1 - tarbo *100 )
#リレーの反応時間を考慮して細かすぎる制御は省く(最低0.5秒)
if power_on < 0.5:
power_on = 0.5
if set_heat_time - 0.5 < power_on:
power_on = set_heat_timeelse:
power_on = 0.0
#温度が制御開始温度以下ならヒーターを最高出力
else:
power_on = set_heat_time
#ヒーター温度と制御時間を新しい情報にして保存
stock_power.append( power_on )
stock_power = stock_power[-size_list:]
stock_temp.append( now_temp )
stock_temp = stock_temp[-size_list:]
heat( power_on )
save_log( now_temp, power_on )
if __name__=='__main__':
init()
while True:#スタートファイルが存在していれば過熱開始
if file.is_start():
main()#スタートファイルが無ければスタンバイ
else:
time.sleep( 2 )
file.save_row_4('standby...')
file_log = None
<全プログラム内部構造一覧>