软I²Cping功能

时间:2012-09-03 15:38:15

标签: c++ arduino i2c

我正在使用软I²C实现来读取一组Sensirion SHT21传感器。我试图找出让传感器回答的方法,看看它们是否实际连接到设备。我使用的是Arduino,这意味着我所有的代码都是C / C ++

我使用的库是here

用于读取传感器的代码如下:

#include <Ports.h>
#include <PortsSHT21.h>

//Define soft I²C channels for three sensors
SHT21 hsensor2 (2); // pins A1 and D5 - Sensor 2

//define variables for temp data
float h, t;

void setup() {}

void loop()
{
    // Get data from sensor soft I²C
    hsensor2.measure(SHT21::HUMI);
    hsensor2.measure(SHT21::TEMP);
    hsensor2.calculate(h, t);
    float hum2 = (h);
    float temp2 = (t);
}

1 个答案:

答案 0 :(得分:1)

大代码块是measure()函数的代码。请注意,它在一个点上返回0而不执行connReset()。这应该是一种检测有效设备的方法,例如......

bool hasHUMI;
if (hsensor2.measure(SHT21::HUMI))
{
  hasHUMI=true;
}

if (hsensor2.measure(SHT21::HUMI) && hsensor2.measure(SHT21::TEMP))
{
 hsensor2.calculate(h, t); 
 float hum2 = (h); 
 float temp2 = (t);    
}

在进行读取之前,您的代码应该将h和t清零,以便您可以测试有效值。像这样......

void loop() 
{ 
    h=0.00f;
    t=0.00f;
    // Get data from sensor soft I²C 
    hsensor2.measure(SHT21::HUMI); 
    hsensor2.measure(SHT21::TEMP); 
    hsensor2.calculate(h, t); 
    float hum2 = (h); 
    float temp2 = (t); 
    if (h>0) {
    }
    if (t>0) {
    }
} 

如果没有,那么你可以制作(复制)你自己版本的measure()函数来测试meas[type]中的有效返回值。您需要在阅读之前将meas[type]设置为已知的无效值(例如0)。

uint8_t SHT21::measure(uint8_t type, void (*delayFun)()) {

    start();
    writeByte(type == TEMP? MEASURE_TEMP : MEASURE_HUMI)

    for (uint8_t i = 0; i < 250; ++i) {
        if (!digiRead()) {
            meas[type] = readByte(1) << 8;
            meas[type] |= readByte(1);
            uint8_t flipped = 0;

            for (uint8_t j = 0x80; j != 0; j >>= 1) {
                flipped >>= 1;
            }

            if (readByte(0) != flipped)
                break;

            return 0;
        }


        if (delayFun)
            delayFun();
        else
            delay(1);
    }

    connReset();
    return 1;
}

你可能知道,如果你向库cpp添加一个方法,那么你还需要在.h中添加一个相应的原型,否则arduino将无法编译你的代码。

的.cpp

uint8_t SHT21::measureTest(uint8_t type, void (*delayFun)()) {

    }

·H

uint8_t measureTest(uint8_t type, void (*delayFun)() =0);