DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

RaspberryPiと炊飯器で低温調理器を自作してみた⑨ 「ヒーター制御デーモン」

現在の温度を取得、設定温度と比較してヒーターの制御を行なう、実際に調理を行なうするための主要プログラムです。

f:id:DreamerDream:20190918164220p:plain


<heaterd.py>

 

#!/usr/bin/python2

import RPi.GPIO as GPIO
import time
import sys
import atexit
import file_mng as file
import datetime

heater = 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_time

    else:
      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

 

<全プログラム内部構造一覧>

dreamerdream.hateblo.jp

 

kampa.me