もんく [英語ダメでもマレーシアで働いてみたよ]

インドネシアや台湾なんかにもいたのです。(since Oct. 2004)

デジタルな温度計 その1 (修正あり)

2017-05-13 23:59:59 | ABCのAはArduinoのA
金曜の夜はYoutubeではっぴーえんど(NHKの番組)を見てその次に再結成ライブ映像も見ていたので寝るのが遅くなってしまった。昼頃にクリニックに行って月末の狂犬病の予防注射の予約と書類記入の確認をしてもらう。(自分のじゃなくて猫たちのため) その後、昼過ぎになって頭がちょっとズキンズキンとして来るとともに眠くなって寝た。寝不足の症状。起きたのは何時か覚えていないけれど午後だ。

思い立って先日買った温度センサーを試してみる事にした。DS18B20と言うセンサーだ。世の中にはとてもクールでスマートなデバイスがあるもので、何とこの温度センサー、デジタル信号を直接送ってくる。今時そんな物が簡単に通販で手に入る。しかも中国製だって! 値段はRM9.9/1個(260円ほど)。何て世の中になったんだ!(文章じゃわかりにくいと思うが驚いてしかも感動していると思ってほしい。→ "!")

温度を測ると言えば、すぐに思いつくのは熱電対、サーミスタ、測温抵抗体、それに最近はアナログ電圧を送ってくるICもある。が、これはデジタル信号を送ってくると言うのだからビックリ。熱電対は出てくる電圧が小さいのでArduinoに直接つなげられないし、測温抵抗体もブリッジみたいにして途中の電線の長さを補償しないといけない。サーミスタやIC式だと使いやすいけれど配線が長かったりコネクタが入った時などにホントにその温度で合ってるの?と言う部分をどうにかしないといけない。が、(何度も言うけれど)このDS18B20はデジタル信号で来る。こりゃすごい、面白い、面白い、素晴らしい(かもしれない)じゃないか!


と言うわけで使ってみるのだけれど、早速これを使う用途と言うのがある。工場の作業員が温度計を持って歩いて定期的に、それもかなり頻繁に温度をチェックしないといけない部分があるからだ。早い話がセンサーを各所に設置して中央に表示しておきたい。(簡単な希望だと思う。)


さてこのDS18B20、使うにはセンサー自体が持つIDを調べないといけない。調べるにはArduinoに繋いで調べるプログラムを動かす。下のスケッチはネットで他人にいただいたもの。だからあまり深く考えないでそのまま使う。何しろ単に素子のIDがわかればそれで良いのだから。

接続は10番ピンにしてみた。
(先にOneWireのライブラリーをダウンロードしておく。)



-------------------------------------------------------

/This sketch is for detection of DS18B20 sensor serial number only

//Connect 1pc of DS18B20 on No.10 pin of UNO.
//Install this sketch on UNO.
//Open serial monitor on PC.
//Check number, take note and put a label on the sensor.

#include
const byte ONEWIRE_PIN = 10; //Connect DS18B20 on No.10 pin
OneWire onewire(ONEWIRE_PIN);
void setup()
{
while(!Serial);
Serial.begin(9600);
}
void loop()
{
byte address[8];

onewire.reset_search();
while(onewire.search(address))
{
if (address[0] != 0x28)
continue;

if (OneWire::crc8(address, 7) != address[7])
{
Serial.println(F("ERROR Not detected"));
break;
}
for (byte i=0; i<8; i++)
{
Serial.print(F("0x"));
Serial.print(address[i], HEX);
if (i< 7)
Serial.print(F(", "));
}
Serial.println();
}
while(1);
}


-------------------------------------------------------

1個繋いではシリアルモニタで確認、メモしてセンサーにタグを付けて置く。


次いでは接続図。
16x2のLCDに表示するようにしてある。
今のところDS18B20は4個接続している。
なぜなら通販で買った時に見せに在庫がそれしか無かったから。
本当はあと5個足して9個にしたい。
スケッチは9個仕様になっている。


上の図に間違いがあったので下のように修正。(2017/5/21)



スケッチはこんな感じ。
DeviceAddressのところはちゃんと9個あるけれど、良く見ると上の4つのセンサーのIDが繰り返し使われているだけ。また5個買ったらここは変更する予定。

-------------------------------------------------------

//Temp. checking with DS18B20 sensors

//DB12B20 section
#include       //ダウンロードしておく。(ライブラリ)
#include  //これもダウンロードしておく。(ライブラリ)

//LCD section
#include    //LCD用 (ライブラリ)

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //LCDのピン番号


#define ONE_WIRE_BUS 10 //input pin No.
#define SENSER_BIT 9 //センサーの分解能を指定している。無くても可。

OneWire oneWire(ONE_WIRE_BUS); //おまじない
DallasTemperature sensors(&oneWire); //おまじない

DeviceAddress t1D1Z = { 0x28, 0xFF, 0x4A, 0xDE, 0x93, 0x16, 0x5, 0xBD };
DeviceAddress t1D2Z = { 0x28, 0xFF, 0x89, 0x28, 0x94, 0x16, 0x5, 0xD3 };
DeviceAddress t2D1Z = { 0x28, 0xFF, 0xC7, 0xE0, 0x93, 0x16, 0x5, 0xC7 };
DeviceAddress t2D2Z = { 0x28, 0xFF, 0xFF, 0x40, 0x8C, 0x16, 0x3, 0x1C };
DeviceAddress t3D1Z = { 0x28, 0xFF, 0x4A, 0xDE, 0x93, 0x16, 0x5, 0xBD };
DeviceAddress t3D2Z = { 0x28, 0xFF, 0x89, 0x28, 0x94, 0x16, 0x5, 0xD3 };
DeviceAddress t4D1Z = { 0x28, 0xFF, 0xC7, 0xE0, 0x93, 0x16, 0x5, 0xC7 };
DeviceAddress t4D2Z = { 0x28, 0xFF, 0xFF, 0x40, 0x8C, 0x16, 0x3, 0x1C };
DeviceAddress t4D3Z = { 0x28, 0xFF, 0xFF, 0x40, 0x8C, 0x16, 0x3, 0x1C };

void setup(void) {

//LCD initialize
lcd.begin(16, 2); //16 Char. x 2 Lines
lcd.clear(); //Clear screen
lcd.setCursor(0, 0); //Primary position
lcd.print("Start"); //Show "Start"
delay(1000);
lcd.clear(); //Clear screen

//Serial for Debug
Serial.begin(9600); //デバッグ用

//DB18B20 initialize
sensors.setResolution(SENSER_BIT);
sensors.begin();

}

void loop(void) {

//1D (LCDが2行しか表示しないのでセクションに分けている)
lcd.setCursor(0,0);
lcd.print("1D");
delay(1000);
lcd.clear();

sensors.requestTemperatures(); //温度を見に行っている

Serial.print("1D1Z=");
Serial.println(sensors.getTempC(t1D1Z)); //シリアルモニタに温度表示
lcd.setCursor(0,0);           //こちらはLCDに同じ事を表示
lcd.print("1D1Z=");
lcd.print(sensors.getTempC(t1D1Z));
delay(1000);

sensors.requestTemperatures();

Serial.print("1D2Z=");
Serial.println(sensors.getTempC(t1D2Z));
lcd.setCursor(0,1);
lcd.print("1D2Z=");
lcd.print(sensors.getTempC(t1D2Z));
delay(5000);
lcd.clear();

//2D
lcd.setCursor(0,0);
lcd.print("2D");
delay(1000);
lcd.clear();

sensors.requestTemperatures();

Serial.print("2D1Z=");
Serial.println(sensors.getTempC(t2D1Z));
lcd.setCursor(0,0);
lcd.print("2D1Z=");
lcd.print(sensors.getTempC(t2D1Z));
delay(1000);

sensors.requestTemperatures();

Serial.print("2D2Z=");
Serial.println(sensors.getTempC(t2D2Z));
lcd.setCursor(0,1);
lcd.print("2D2Z=");
lcd.print(sensors.getTempC(t2D2Z));
delay(5000);
lcd.clear();

//3D
lcd.setCursor(0,0);
lcd.print("3D");
delay(1000);
lcd.clear();

sensors.requestTemperatures();

Serial.print("3D1Z=");
Serial.println(sensors.getTempC(t3D1Z));
lcd.setCursor(0,0);
lcd.print("3D1Z=");
lcd.print(sensors.getTempC(t3D1Z));
delay(1000);

sensors.requestTemperatures();

Serial.print("3D2Z=");
Serial.println(sensors.getTempC(t3D2Z));
lcd.setCursor(0,1);
lcd.print("3D2Z=");
lcd.print(sensors.getTempC(t3D2Z));
delay(5000);
lcd.clear();

//4D-1
lcd.setCursor(0,0);
lcd.print("4D");
delay(1000);
lcd.clear();

sensors.requestTemperatures();

Serial.print("4D1Z=");
Serial.println(sensors.getTempC(t3D1Z));
lcd.setCursor(0,0);
lcd.print("4D1Z=");
lcd.print(sensors.getTempC(t3D1Z));
delay(1000);

sensors.requestTemperatures();

Serial.print("4D2Z=");
Serial.println(sensors.getTempC(t3D2Z));
lcd.setCursor(0,1);
lcd.print("4D2Z=");
lcd.print(sensors.getTempC(t3D2Z));
delay(5000);
lcd.clear();

//4D-2

sensors.requestTemperatures();

Serial.print("4D3Z=");
Serial.println(sensors.getTempC(t4D3Z));
lcd.setCursor(0,0);
lcd.print("4D3Z=");
lcd.print(sensors.getTempC(t4D3Z));
delay(5000);
lcd.clear();


Serial.println();
}


-------------------------------------------------------


Serial.xxxの行はデバッグ用なので走らせる時には消してもOK。


sensors.requestTemperatures();
↑この行を各所に入れているのは、できるだけ最新の温度を表示したいため。
ただ、リアルタイムで大きく変化する温度を想定していないので所々にdelayを入れている。作業員が見てメモできるようにしたいため。


初心者らしい間違いをしてしまった点。

DeviceAddress t1D1Z ←ここで最初に1D1Zのように数字で始まる変数を書いてしまった。こうするとエラーが出る。リファレンスを見るとちゃんと数字で始まる変数は止めろと一番最後の行に書いてあった。(基本的なところ、ちゃんと読めと言う事らしい。)

なので頭にtを付けておいた。
変数の記号、1D1Zとか2D2Zとかにしているのは単にセンサーを設置する場所を示しているだけなのでこれは自分の都合で変更して欲しい。(だれもマネしないだろうけれど。)



さて、ここまででプロトタイプその1は完成とします。
後は実際に電線を伸ばしていってノイズの影響などがあるかチェックの予定。
『その他』 ジャンルのランキング
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« 小包が届くような届かないよ... | トップ | きなこ、喧嘩より逃げる方法... »
最近の画像もっと見る

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL