Arduino OneWire在索引的多个引脚上(OneWire对象的数组)?

时间:2015-11-21 20:55:56

标签: c++ arrays object arduino arduino-ide

我正在尝试在多个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)

0 个答案:

没有答案