“(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产品资料下载]