Функция мягкого пинга 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);
Другие вопросы по тегам