水温センサDS18B20
Arduinoで水温センサDS18B20を使ってみましょう。単純な水温センサでステンレス(?)の棒の先が温度計になっており、シリアル通信でArduinoで値がとれます。
動作の様子
使い方
素のDS18B20の場合、抵抗が必要らしいので注意です。黄色線が少し複雑です。5Vからもらってきて、抵抗をつなぎ、その先を黄色線とデジタルピンに繋ぎます。
コード
まずライブラリを導入してください。こちら。
するとライブラリにTempratureのコードができるのでそれを使うことができます。デジタルピンをどこにつなぐかに注意しましょう。サンプルコードは10番のデジタルピンになってます。温度だけを出力して、シリアルプロッターでも表示できるようにしたコードが下です。つなぐデジタルピンは3番にしてあります。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <OneWire.h> | |
OneWire ds(3); //繋いだデジタルピン | |
void setup(void) { | |
Serial.begin(9600); | |
} | |
void loop(void) { | |
byte i; | |
byte present = 0; | |
byte type_s; | |
byte data[12]; | |
byte addr[8]; | |
float celsius, fahrenheit; | |
if ( !ds.search(addr)) { | |
ds.reset_search(); | |
delay(250); | |
return; | |
} | |
switch (addr[0]) { | |
case 0x10: | |
type_s = 1; | |
break; | |
case 0x28: | |
type_s = 0; | |
break; | |
case 0x22: | |
type_s = 0; | |
break; | |
default: | |
return; | |
} | |
ds.reset(); | |
ds.select(addr); | |
ds.write(0x44, 1); | |
delay(300); | |
present = ds.reset(); | |
ds.select(addr); | |
ds.write(0xBE); | |
for ( i = 0; i < 9; i++) { | |
data[i] = ds.read(); | |
} | |
int16_t raw = (data[1] << 8) | data[0]; | |
if (type_s) { | |
raw = raw << 3; | |
if (data[7] == 0x10) { | |
raw = (raw & 0xFFF0) + 12 - data[6]; | |
} | |
} else { | |
byte cfg = (data[4] & 0x60); | |
if (cfg == 0x00) raw = raw & ~7; | |
else if (cfg == 0x20) raw = raw & ~3; | |
else if (cfg == 0x40) raw = raw & ~1; | |
} | |
celsius = (float)raw / 16.0; | |
fahrenheit = celsius * 1.8 + 32.0; | |
Serial.println(celsius); | |
} |
Post a Comment