4866| 3
|
[进阶] 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)循环冗余检查, 用于验证数据完整性。 [mw_shl_code=c,true] if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; }[/mw_shl_code] 如上面代码所示,地址的首位,用于确定设备的类型,我们这次用到的温度传感器就是DS18B20,所以得到的地址的第一位为0x28(hex)。Arduino作为主设备,连接的传感器作为从设备。在DS18B20防水温度传感器套件中的转接器已经包含了上拉电阻,因此并不需要外接电了。 下图为连接图,一块UNO板,两个DS18B20温度传感器,在面包板上进行连接。接在UNO的D2口。 首先我们可以,用一个Address finder来测试一下是否正确的连接了。打开串口监视器,我们可以得到两个设备的ROM地址。这个地址也可以直接使用。在OneWire的库文件中,有一个crc8(address, 7)函数可以直接调用,用于计算CRC的值。 读取数据: 读取单总线设备需要几个步骤。不同的设备有不同的能力。这次用的DS18B20可以读取和报告温度,而DS2438可以读取电压,电流和温度。 [mw_shl_code=c,true]while (bus.search(address))[/mw_shl_code] bus.search 执行搜索,如果这个函数返回一个’1’, 则表示他找到找到了下一个设备, 你可以通过address来检索ROM。如果没有其他设备会返回0。可以用OneWire::reset_search() 函数来重置搜索。 [mw_shl_code=c,true] bus.reset(); bus.select(address); bus.write(0x44, 1);[/mw_shl_code] 选择ROM地址,在此之前要先reset. 下图为DS18B20的指令表。Bus.write(0x44,1)表示执行一个conversation 操作。 bus 是一个OneWire 类的一个实例。当这个指令Bus.write(0x44,1)输入后,设备会读取内部的ADC, 当这个步骤完成后,他会复制数据到暂存器(scratchpad)中。 数据被复制到暂存器后,可以被读取。暂存器可以在任何时候被读取,并不需要conversion 指令。 [mw_shl_code=c,true] byte present = bus.reset(); bus.select(address); bus.write(0xBE); // Read Scratchpad [/mw_shl_code] bus.write(0xBE); //读取暂存器中的数据 下面截图是得到的数据,前面是传感器Rom的地址,后面是测得的温度。 |
453 Bytes, 下载次数: 740
651 Bytes, 下载次数: 749
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed