我正在尝试在多个GPIO引脚上实现一个带有多个温度计(DS18x20)的Arduino项目。我正在使用OneWire库(http://www.pjrc.com/teensy/td_libs_OneWire.html)。我想在引脚之间轻松切换,最好通过引脚对象数组中的索引来引用引脚对象。我不是C ++程序员,我不知道该怎么做。
我实际上已经设法通过破解库来提出解决方法,但它绝对是一个HACK而不是正确的C ++编码。我想知道如何正确地做到这一点。
pin对象的OneWire Library对象构造函数" ds"是:OneWire ds(pinNum);
这会创建对象并设置一些变量......没什么异国情调。
调用一个函数,例如" reset"是:ds.reset();
我希望能够在执行各种DS18B20温度计功能的引脚之间轻松来回切换。我发现多个引脚的唯一建议是创建多个对象,但这意味着对每个操作分别进行调用,例如:ds1.reset(); ds2.reset(); //etc.
我的HACK通过编写和插入函数来解决这个问题" apin(pinNum)"它与构造函数的代码完全相同,但不是构造函数,而是可调用函数。此新功能已添加到 OneWire.h , OneWire.cpp 和 keywords.txt 。因此,如果您将pin对象定义为" ds",则调用:ds.apin(pinNum)
"更改"引脚对象是新引脚。您可以将引脚号放在一个数组中并调用" apin"由数组元素索引,例如:ds.apin(pinNum[i]);
hack工作正常,但是C ++实践很糟糕。
我认为,好的C ++实践是以某种方式为pin数组创建一个OneWire对象数组,以便您可以通过对象索引调用函数,如:ds[i].reset
。问题是如何实现数组和构造函数???
这里有一些代码,基本上显示了如何运行单个引脚...你可以看到有两个或更多的每次调用是多么麻烦:
#include <OneWire.h>
int pinNum[] = { 9, 10 }; // Array of pins that can be used
uint8_t addr[8]; // array of bytes for the 64 bit device address
byte data[12]; // Raw data from read of Scratch Pad
void setup(void) {
OneWire ds(pinNum[1]); // Constructor for object ds(10)
ds.reset();
ds.search(addr); // find device address, put in array addr
ds.reset();
ds.select(addr); // Issue the address of the current device
ds.write(0x44,0); // Start the conversion
delay(775); // Wait at least 750 milliseconds
ds.write(0xBE); // Read the device Scratchpad
// Read 9 bytes of Scratch Pad Data
for (int k = 0; k < 9; k++) {
data[k] = ds.read();
}
}
感谢您在此努力中提供的所有意见,建议和帮助。
丰富的祝福,一切顺利,以及请享用! 美国宾夕法尼亚州卡莱尔的艺术(Webtest)