温度変化を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で同じく直線的に温度が下がっています。