我正在使用软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);
}
答案 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);