Функция мягкого пинга I²C
Я использую мягкую реализацию I²C для считывания набора датчиков Sensirion SHT21. Я пытаюсь выяснить, как датчики отвечают, чтобы увидеть, действительно ли они подключены к устройству. Я использую Arduino, что означает, что весь мой код на C/C++
Библиотеки, которые я использую, находятся здесь.
Код, используемый для считывания датчиков, следующий:
#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 ответ
Большой кодовый блок - это код для функции 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 до 0 перед выполнением чтения, чтобы вы могли проверить допустимые значения. Как это...
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)()) {
}
.час
uint8_t measureTest(uint8_t type, void (*delayFun)() =0);