温度センサーをつなぐ(その2)
アリババに頼んでおいた防水型DS18B20温度センサーが忘れた頃に届いたので、急遽つないでみます。
Pythonでの温度グラフは次回で取り組みます。
最後に写真を載せています。
【材料】
・防水型DS18B20温度センサー(AliExpress)
・ブレッドボード用ジャンパ線(オス・オス)数本(前回既出)
【つなぎ方】
・私が買った防水型DS18B20温度センサーは3本線です。赤線は5V、黒線はGND、黄線は「2」へつなぎます。信号線が1本で済むので、このセンサーの接続方式は「1-Wire」接続というのだそうです。
・このセンサーには「プルアップ抵抗」(4.7kΩ〜5kΩ)なるものが必要で、黄線と赤線の間をこの抵抗で繋ぐ必要があるそうです。手元には10kΩしかなかったので、ブレッドボード上でこれを2個並行につなぎました。
・このセンサーのアドレスは分かりません。1個の場合は意識しなくても良いようです。
【ライブラリのインストール】
・この温度センサーを使うには、ライブラリのインストールが必要です。
・Arduino IDE画面最上段メニュー「ツール」→「ライブラリを管理」を選ぶと、左カラムにライブラリマネージャーが現れます。そのタイトルの直ぐ下に検索欄があるので「DS18B20」と入力します。同一名のライブラリが最初にヒットするので、それを「インストール」します。同類のライブラリ(CheckDS18B20など)もありますが無視してください。
・出力画面に「インストールは成功しました。」という言葉が一瞬表示されればオッケーです。
【スケッチ】
Arduino IDEのスケッチ画面に以下のスケッチを書きます。
温度センサーをつなぐ(その1)のスケッチをベースに、DS18B20用のスケッチを追記しています。(その他の部分も若干変更している箇所があります。ゴメンナサイ。)
// AC100Vを加工してニクロム線ヒーターに通電し加熱します。
// ADT7410をI2C接続、DS16B20を1-Wire接続し、温度を測り、表示します。
// 2024.06.04 by Kero
// 最初の宣言です
#include <Wire.h> //I2C通信のライブラリ(忘れていました。でもLCDは動いた?)
// 温度センサADT7410の設定
#include <Adafruit_ADT7410.h> // ADT7410のライブラリ読み込み
Adafruit_ADT7410 Temp1 = Adafruit_ADT7410(); // ADT温度センサーをTemp1と名付けます
// 温度センサ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); // 通信速度セットアップ
// ADTセンサ用セットアップ
Wire.begin(); // I2C通信開始(忘れていました。)
Temp1.begin(0x48); // ADTセンサのアドレスは0x48(デフォルト)
Temp1.reset(); // ソフトウェア・リセット
Temp1.setResolution(ADT7410_16BIT); // 解像度=16bitを設定
delay(250); // タイミング調整用?
// DS18センサ用セットアップは不要です
Serial.println("DS18B20"); // シリアルモニタに名前表示
// LCDディスプレイ用セットアップ
lcd.init();
lcd.backlight();
// ピンモードを「出力」に設定
pinMode(LED,OUTPUT);
pinMode(SSR,OUTPUT);
}
void loop(){
// LDTセンサから読み込み
float Cdeg = Temp1.readTempC(); // セ氏で温度(実数)を読み込む
//Serial.println(Cdeg); // LDT温度の表示はLCDだけにしました
// DS18センサから読み込み(とにかくこう書くようです)
while (ds18.selectNext()) {
ds18C = ds18.getTempC(); // 文字列でds18Cに読み込み
ds18CV = ds18C.toFloat(); // 文字列を実数に変換して表示
Serial.println(ds18CV); //シリアルモニタに出力
}
// 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("TempADT= ");
lcd.print(Cdeg,2);
lcd.setCursor(15,0);
lcd.print("C");
delay(10000); // 10秒休み
}
【実行】
・DS18B20温度センサーをビーカーの水の中に入れます。棒状温度計の近くが良いでしょう。
・スケッチ画面の上段にある「→」アイコンをクリックすると、スケッチのコンパイル(機械語翻訳)が行われ、Arduinoにダウンロードされます。Arduinoは直ちにそれを実行します。
・1602ディスプレイに「TempADT= ◯◯.◯◯ C」と、「Duty ratio = 8 %」という表示が出ます。
・TempADTの値は10秒ごとに変化します。
・Arduino IDEの「シリアルモニタ」(窓右上の虫メガネみたいなのをクリック)に、DS18B20で測定した温度が表示されます。
・棒状温度計と、DS18B20と、ADT7410とでは、測定値が皆違っています。棒状温度計よりDS18B20の方が若干(大きくて2℃程度)高いです。それは、棒状温度計の「正しい測り方」は、アルコールの先端までお湯に漬けるのだそうで、今回空中に出ている部分のアルコールが熱膨張しなかったためと考えられます。
・一方、通電している間中、DS18B20よりADT7410の方が10℃以上高い値を示しました。それは、ADT7410はビーカーの外壁に貼り付けていたのですが、ヒーターによる熱上昇気流でお湯以上に加熱され、高温になったためと考えられます。ヒーターのスイッチを切ると、急速にお湯の温度以下に下がりました。
・従って、DS18B20を水中に放り込んで水温を測定する方法が一番妥当であると考えました。
・次回はArduinoからmacに送られたデータを元に、温度変化のグラフをPythonで描いてみます。
・なお、ADT7410温度センサーは、以降、ハード・スケッチともに削除します。