DS18B20单总线配置
单总线即one-wire总线,是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同.它采用单根信号线,既传输时钟又传输数据,而且数据传输是双向的,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。因此我们可以只用一个数字接口,连接多个温度传感器。
在这个教程中,我们将使用dfrobot出的DS18B20防水温度传感器套件,一块UNO板,以及跳线若干。
库文件需要用到OneWire。
单总线协议简介(The 1-Wire Protocol)每一个单总线设备都有一个独一无二的”ROM”地址,包含了一个8-bit family code,48-bit serial number和一个8-bit CRC。 CRC (cyclic redundancy check)循环冗余检查, 用于验证数据完整性。if ( addr != 0x10 && addr != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
如上面代码所示,地址的首位,用于确定设备的类型,我们这次用到的温度传感器就是DS18B20,所以得到的地址的第一位为0x28(hex)。Arduino作为主设备,连接的传感器作为从设备。在DS18B20防水温度传感器套件中的转接器已经包含了上拉电阻,因此并不需要外接电了。
下图为连接图,一块UNO板,两个DS18B20温度传感器,在面包板上进行连接。接在UNO的D2口。首先我们可以,用一个Address finder来测试一下是否正确的连接了。打开串口监视器,我们可以得到两个设备的ROM地址。这个地址也可以直接使用。在OneWire的库文件中,有一个crc8(address, 7)函数可以直接调用,用于计算CRC的值。
读取数据:读取单总线设备需要几个步骤。不同的设备有不同的能力。这次用的DS18B20可以读取和报告温度,而DS2438可以读取电压,电流和温度。
while (bus.search(address))
bus.search 执行搜索,如果这个函数返回一个’1’, 则表示他找到找到了下一个设备, 你可以通过address来检索ROM。如果没有其他设备会返回0。可以用OneWire::reset_search() 函数来重置搜索。
bus.reset();
bus.select(address);
bus.write(0x44, 1);
选择ROM地址,在此之前要先reset. 下图为DS18B20的指令表。Bus.write(0x44,1)表示执行一个conversation 操作。 bus 是一个OneWire 类的一个实例。当这个指令Bus.write(0x44,1)输入后,设备会读取内部的ADC, 当这个步骤完成后,他会复制数据到暂存器(scratchpad)中。
数据被复制到暂存器后,可以被读取。暂存器可以在任何时候被读取,并不需要conversion 指令。
byte present = bus.reset();
bus.select(address);
bus.write(0xBE); // Read Scratchpad
bus.write(0xBE); //读取暂存器中的数据
下面截图是得到的数据,前面是传感器Rom的地址,后面是测得的温度。
感谢提供这么详细的教程 感谢提供这么详细的教程 超级感谢,我正需要
页:
[1]