Arduinoでローストビーフを作る(9)

温度変化をPythonのグラフで見ます。
ADT7410温度センサーモジュール・スケッチは取っ払いました。
最後に現状写真を載せています。

【材料】
・なし

【つなぎ方】
・ADT7410温度センサーモジュールを取っ払います。
・その他は手をつけません。

【Arduinoのライブラリのインストール】
・なし。

【スケッチ】
・Arduino IDEのスケッチ画面に以下のスケッチを書きます。
・ADT7410温度センサー関連のスケッチは削除しています。

// AC100Vを加工してニクロム線ヒーターに通電し加熱します。
// ADT7410はやめて、DS16B20を1-Wire接続し、温度を測り、表示します。
// 2024.06.05 by Kero

// 最初の宣言です
#include <Wire.h>  //I2C通信のライブラリ(忘れていました。でもLCDは動いた?)

// 温度センサDS18B20の設定(以下のサイトからもらいました。感謝)
// https://github.com/matmunk/DS18B20?tab=readme-ov-file
#include <DS18B20.h>
DS18B20 ds18(2);  // センサの黄線はArduinoの端子2につなぎます
String ds18C;  // センサからの読込は文字列変数「ds18C」に入ります
float ds18CV = 0.0;  // その文字列を実数に変換して入れる変数です

// ディスプレイLCDの設定
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,16,2); 

// 変数割り当て
int LED = 3;   // LEDのアドレス
int SSR = 6;   // SSRのアドレス
int Value = 20;  // ヒーター電力の強さ(<255の整数)
float Duty = 0.0;  // Value / 255 * 100 (%) = Duty比の初期値
 
void setup(void) {
  Serial.begin(9600);  // 通信速度セットアップ

  // DS18センサ用セットアップは不要です

  // LCDディスプレイ用セットアップ
  lcd.init();
  lcd.backlight();

  // ピンモードを「出力」に設定
  pinMode(LED,OUTPUT);
  pinMode(SSR,OUTPUT); 
}
 
void loop(){

  // DS18センサから読み込み(とにかくこう書くようです)
  while (ds18.selectNext()) {
    ds18C = ds18.getTempC();  // 文字列でds18Cに読み込み
    ds18CV = ds18C.toFloat();  // 文字列を実数に変換して表示
    Serial.println(ds18C);  //シリアルモニタに文字列として出力
  }
  
  // LEDとSSRへValue値を出力
  analogWrite(LED, Value); 
  analogWrite(SSR,Value); 

  // LCDへADT温度とDuty比の表示
  lcd.setCursor(0,1); 
  lcd.print("Duty = "); 
  lcd.setCursor(10,1); 
  Duty = (float)Value * 0.392 + 0.5;
  lcd.print((int)Duty);
  lcd.setCursor(15,1); 
  lcd.print('%'); 
  lcd.setCursor(0,0); 
  lcd.print("TempSD18= ");
  lcd.print(ds18C); 
  lcd.setCursor(15,0);
  lcd.print("C");

  delay(10000);  // 10秒休み
}

【Pythonのプログラミング】
・予め以下のライブラリ(モジュール?)をインストールしておきます。
・numpy、matplotlib、pyserial、(timeは標準で入っています。)
・このプログラムを実行するときは、Arduino IDEのシリアルモニタは消しておいてください。

# Arduino からの温度データをPythonで受け取ります。
# 当面の目標は時系列のグラフ化です。
# 2024.06.05   by Kero

import numpy as np
import matplotlib.pyplot as plt
import serial
import time

xdata = [] # 時間データを入れる配列
ydata = [] # 温度データを入れる配列

# 温度データの読み込み設定
data1 = serial.Serial('/dev/cu.usbmodem142401',9600,timeout=None)
tim = 0.0 # これは10秒単位の値です

while tim < 360: # 3600秒(=1時間)計測します
    plt.cla() # グラフをクリア
    
    # Arduinoから10秒に1回データが送信されます。
    text = data1.readline() # Arduinoからのデータ読み込み
                            
    degf = float(text[0:5]) # 文字列で入ってくるので最初の5文字を摘出
    minf = tim / 6 # 時間単位を「分」に変換
    print(minf, degf) # とりあえず標準出力しときます
    
    xdata.append(minf) # 配列に新しい分データを追加
    ydata.append(degf) # 配列に新しい温度データを追加
    plt.xlim(0, 60) # 横軸を0から60分に固定
    plt.ylim(0, 100) # 縦軸を0から100℃に固定
    plt.plot(xdata, ydata) # 折れ線グラフ描画
    plt.pause(9.0) # 9秒そのまま
    
    tim += 1.0 # 10秒分加算します

【実行】
・温度センサーを水の中に入れます。
・Arduinoの方を先に実行(IDEの「→」)します。
・PythonプログラムをRUNさせます。
・Pythonの方にグラフが出てきて、折れ線が段々伸びて行き、1時間経つと以下のようになります。
・これは、30分ヒーターに通電し、残り30分はヒーターをOFFにした温度変化です。
・予想ではS字カーブで温度上昇し、エクスポネンシャルで温度降下が起きるものと思っていました。
・ONでほぼ直線的に温度が上がり、OFFで同じく直線的に温度が下がっています。

Screenshot

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です