“(SKU:SEN030001)DS18B20温度传感器”的版本间的差异
来自YwRobot Studio Wiki
YWrobot WM(讨论 | 贡献) (创建页面,内容为“DS18B20 ==简介== 基于DS18B20的数字温度传感器,可以用来对环境温度进行定量的检测。DS18B20数字...”) |
YWrobot CYB(讨论 | 贡献) (→样例代码) |
||
| 第22行: | 第22行: | ||
===样例代码=== | ===样例代码=== | ||
<pre style="color:blue"> | <pre style="color:blue"> | ||
| + | #include <OneWire.h> | ||
| + | #include <Wire.h> | ||
| + | #include <LiquidCrystal_I2C.h> | ||
| + | LiquidCrystal_I2C lcd(0x27,16,2); | ||
| + | OneWire ds(10); | ||
| + | void setup() { | ||
| + | lcd.init(); | ||
| + | lcd.backlight(); | ||
| + | lcd.setCursor(0,0); | ||
| + | lcd.print("DS18B20 Texting..."); | ||
| + | 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)) { | ||
| + | Serial.println("No more addresses."); | ||
| + | Serial.println(); | ||
| + | ds.reset_search(); | ||
| + | delay(250); | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | Serial.print("ROM ="); | ||
| + | for( i = 0; i < 8; i++) { | ||
| + | Serial.write(' '); | ||
| + | Serial.print(addr[i], HEX); | ||
| + | } | ||
| + | if (OneWire::crc8(addr, 7) != addr[7]) { | ||
| + | Serial.println("CRC is not valid!"); | ||
| + | return; | ||
| + | } | ||
| + | Serial.println(); | ||
| + | |||
| + | // the first ROM byte indicates which chip | ||
| + | switch (addr[0]) { | ||
| + | case 0x10: | ||
| + | Serial.println(" Chip = DS18S20"); // or old DS1820 | ||
| + | type_s = 1; | ||
| + | break; | ||
| + | case 0x28: | ||
| + | Serial.println(" Chip = DS18B20"); | ||
| + | type_s = 0; | ||
| + | break; | ||
| + | case 0x22: | ||
| + | Serial.println(" Chip = DS1822"); | ||
| + | type_s = 0; | ||
| + | break; | ||
| + | default: | ||
| + | Serial.println("Device is not a DS18x20 family device."); | ||
| + | return; | ||
| + | } | ||
| + | ds.reset(); | ||
| + | ds.select(addr); | ||
| + | ds.write(0x44,1); // start conversion, with parasite power on at the end | ||
| + | |||
| + | delay(100); // maybe 750ms is enough, maybe not | ||
| + | // we might do a ds.depower() here, but the reset will take care of it. | ||
| + | |||
| + | present = ds.reset(); | ||
| + | ds.select(addr); | ||
| + | ds.write(0xBE); // Read Scratchpad | ||
| + | |||
| + | Serial.print(" Data = "); | ||
| + | Serial.print(present,HEX); | ||
| + | Serial.print(" "); | ||
| + | for ( i = 0; i < 9; i++) { // we need 9 bytes | ||
| + | data[i] = ds.read(); | ||
| + | Serial.print(data[i], HEX); | ||
| + | Serial.print(" "); | ||
| + | } | ||
| + | Serial.print(" CRC="); | ||
| + | Serial.print(OneWire::crc8(data, 8), HEX); | ||
| + | Serial.println(); | ||
| + | |||
| + | // convert the data to actual temperature | ||
| + | |||
| + | unsigned int raw = (data[1] << 8) | data[0]; | ||
| + | if (type_s) { | ||
| + | raw = raw << 3; // 9 bit resolution default | ||
| + | if (data[7] == 0x10) { | ||
| + | // count remain gives full 12 bit resolution | ||
| + | raw = (raw & 0xFFF0) + 12 - data[6]; | ||
| + | } | ||
| + | } else { | ||
| + | byte cfg = (data[4] & 0x60); | ||
| + | if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms | ||
| + | else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms | ||
| + | else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms | ||
| + | // default is 12 bit resolution, 750 ms conversion time | ||
| + | } | ||
| + | celsius = (float)raw / 16.0; | ||
| + | fahrenheit = celsius * 1.8 + 32.0; | ||
| + | lcd.setCursor(0,1); | ||
| + | lcd.print("Tep: C"); | ||
| + | lcd.setCursor(5,1); | ||
| + | lcd.print(celsius); | ||
| + | delay(200); | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | </pre> | ||
==更多== | ==更多== | ||
2016年5月9日 (一) 09:36的最新版本
简介
基于DS18B20的数字温度传感器,可以用来对环境温度进行定量的检测。DS18B20数字温度传感器是美国DALLAS公司生产的一总线数字温度传感器。其测温范围 -55℃~+125℃,固有测温分辨率0.5℃,支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温,测量结果以9~12位数字量方式串行传送。
DS18B20数字温度传感器与Arduino专用传感器扩展板结合使用,可以非常容易地实现与环境温度感知相关的互动效果。
产品参数
- 尺寸:23*20mm
- 重量:4g
- 芯片:DS18B20
- 电压:3.3V、5V
- 端口:数字双向单总线
- 温度范围:-50℃- +125℃
- 平台:Arduino、单片机、ARM、树莓派
使用教程
样例代码
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
OneWire ds(10);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("DS18B20 Texting...");
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)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(100); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print(" Data = ");
Serial.print(present,HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// convert the data to actual temperature
unsigned int raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
lcd.setCursor(0,1);
lcd.print("Tep: C");
lcd.setCursor(5,1);
lcd.print(celsius);
delay(200);
}
更多
[YWRobot产品资料下载]