2016-05-19 8 views
0

Я строю библиотеку для извлечения данных от датчика adafruit (sht31d)Ошибка датчика. Проблема с заменой библиотеки Arduino's Wire

Показание температуры кажется точным, но влажность не изменяется.

Мой отлаживать:

temp: 23.36 humid: 0.39 

Следующий метод вызывается в main.c

(метод из sht31.c):

bool readTempHum(void) 
{ 
    uint8_t readbuffer[6]; 
    writeCommand(SHT31_MEAS_HIGHREP); 
    _delay_ms(500); 

    for (uint8_t i=0; i<6; i++) 
    { 
    readbuffer[i] = read8(SHT31_DEFAULT_ADDR); 
    } 

    uint16_t ST, SRH; 
    ST = readbuffer[0]; 
    ST <<= 8; 
    ST |= readbuffer[1]; 

    SRH = readbuffer[3]; 
    SRH <<= 8; 
    SRH |= readbuffer[4]; 

    double stemp = ST; 
    stemp *= 175; 
    stemp /= 0xffff; 
    stemp = -45 + stemp; 

    temp = stemp; 

    double shum = SRH; 
    shum *= 100; 
    shum /= 0xFFFF; 

    humidity = shum; 

    return true; 
} 

To view the full implementation please click here

Благодаря

+0

«_far, чтобы соответствовать правильному», каков ожидаемый результат? – Linus

+0

Является ли контакт 2 из 'sht31' связан с' VSS'? – LPs

+0

@ Linus Просто больше вариаций со временем. Если я положу палец на датчик, чтобы сделать его более теплым, он резко изменит значение, а не привяжется к значению. Это необычно для моего опыта работы с датчиками. – SensationSama

ответ

1

Это действительно выглядит правильно. И температура и влажность кодируются двумя байтами, и если вы все расчеты вручную, он выглядит нормально (в данном случае только температура):

ST = readbuffer[0]; // 100 
ST <<= 100; // 100 << 8 = 25600 
ST |= readbuffer[1]; // 25600 | 1 = 25601 

double stemp = ST; // 25601 
stemp *= 175; // 25601 * 175 = 4480000 
stemp /= 0xffff; // 4480000/65535 = 68,36 
stemp = -45 + stemp; // -45 + 68,36 = 23,36 

Так что не имеют ничего общего с кодировкой ASCII. Просто дайте вашему сенсору немного времени.

Также, если вы посмотрите на sensor datasheet, вы увидите, что время отклика составляет от 2 до 8 секунд.

+0

Попытка отображения данных датчика в читаемом формате является проблемой ASCII. Я подозреваю, что температура может быть правильной, но влажность всегда сообщает одно и то же значение, что, безусловно, неверно. – SensationSama

+0

В этом случае попробуйте отобразить его в шестнадцатеричном формате: 'sprintf (buf,"% x ", readbuffer [i]);' – DennisS

+0

Я думаю, что это неверно. 3-й байт должен быть CRC8, который не может быть 1 в качестве значения – LPs

 Смежные вопросы

  • Нет связанных вопросов^_^