2015-04-09 4 views
0

У меня есть датчик температуры D6T Omron (массив 1x8) и попытка получить показания температуры от него. Однако после отладки и проверки ошибок нет, я ничего не могу получить, но просто 0. Вот код, в основном модифицированный из примера, который содержится в библиотеке SoftI2CMaster из GitHub, больше информации здесь http://playground.arduino.cc/Main/SoftwareI2CLibraryI2C Датчик Arduino выходы 0s?

// Simple sketch to read out BMA020 using SoftI2C 
// Readout BMA020 chip 
// use low processor speed (you have to change the baud rate to 2400!) 
// #define I2C_CPUFREQ (F_CPU/8) 
#define NO_INTERRUPT 1 
#define I2C_TIMEOUT 1000 

#define SDA_PORT PORTC 
#define SDA_PIN 4 
#define SCL_PORT PORTC 
#define SCL_PIN 5 
#include <SoftI2CMaster.h> 
#include <avr/io.h> 


#define BMAADDR 0x14 

float PTAT, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, PEC; 

void CPUSlowDown(void) { 
    // slow down processor by a factor of 8 
    CLKPR = _BV(CLKPCE); 
    CLKPR = _BV(CLKPS1) | _BV(CLKPS0); 
} 


boolean setControlBits(uint8_t cntr) 
{ 
    Serial.println(F("Soft reset")); 
    if (!i2c_start(BMAADDR | I2C_WRITE)) { 
    Serial.println("failed at write start"); 
    return false; 
    } 
    if (!i2c_write(0x4C)) { 
    Serial.println("failed at write"); 
    return false; 
    } 
    i2c_stop(); 
    return true; 
} 

boolean initBma(void) 
{ 
    if (!setControlBits(B00000010)) return false;; 
    delay(100); 
    return true; 
} 

int readOneVal(boolean last) 
{ 
    uint8_t msb, lsb; 
    lsb = i2c_read(false); 
    msb = i2c_read(last); 
    if (last) i2c_stop(); 
    return (float)((msb<<8)|lsb)/64; 
} 

boolean readBma(void) 
{ 
    PTAT = 0xFFFF; 
    P0 = 0xFFFF; 
    P1 = 0xFFFF; 
    P2 = 0xFFFF; 
    P3 = 0xFFFF; 
    P4 = 0xFFFF; 
    P5 = 0xFFFF; 
    P6 = 0xFFFF; 
    P7 = 0xFFFF; 
    PEC= 0xFFFF; 
    if (!i2c_start(BMAADDR | I2C_WRITE)) return false; 
    if (!i2c_write(0x01)) return false; 
    if (!i2c_rep_start(BMAADDR | I2C_READ)) return false; 
    PTAT = readOneVal(false); 
    P0 = readOneVal(false); 
    P1 = readOneVal(false); 
    P2 = readOneVal(false); 
    P3 = readOneVal(false); 
    P4 = readOneVal(false); 
    P5 = readOneVal(false); 
    P6 = readOneVal(false); 
    P7 = readOneVal(false); 
    PEC = readOneVal(true); 
    return true; 
} 



//------------------------------------------------------------------------------ 
void setup(void) { 
#if I2C_CPUFREQ == (F_CPU/8) 
    CPUSlowDown(); 
#endif 
    Serial.begin(19200); // in case of CPU slow down, change to baud rate/8! 
    if (!initBma()) { 
    Serial.println(F("INIT ERROR")); 
    } 

} 

void loop(void){ 
    if (!readBma()) Serial.println(F("READ ERROR")); 
    Serial.print(F("PTAT=")); 
    Serial.println(PTAT); 
    Serial.print(F(" P0=")); 
    Serial.println(P0); 
    Serial.print(F(" P1=")); 
    Serial.println(P1); 
    Serial.print(F(" P2=")); 
    Serial.println(P2); 
    Serial.print(F(" P3=")); 
    Serial.println(P3); 
    Serial.print(F(" P4=")); 
    Serial.println(P4); 
    Serial.print(F(" P5=")); 
    Serial.println(P5); 
    Serial.print(F(" P6=")); 
    Serial.println(P6); 
    Serial.print(F(" P7=")); 
    Serial.println(P7); 
    Serial.print(F(" PEC=")); 
    Serial.println(PEC); 
    delay(300); 
} 

Пожалуйста, любая помощь будет оценена :(

+0

Почему бы не использовать библиотеку проводов? http://arduino.cc/en/reference/wire –

ответ

0

У меня есть несколько рекомендаций.

Во-первых, данные, возвращаемые с вашего температурного устройства, не отправляются вам как значение с плавающей запятой - это 16-разрядное целое число со знаком. Например, если устройство считает, что оно составляет 25,8 градусов, вы будете получить значение 258 (0x0102) от устройства во время обмена I2C нс. Кроме того, быстрое сканирование кода показывает, что в вашей процедуре readOneVal() вы возвращаете свой результат как float, но ваша функция определена для возврата int. Приведенный тип ничего не помогает, так как данные не в том формате, который вы ожидаете. Вам придется преобразовать его самостоятельно.

Вам действительно нужно потратить время, чтобы понять свой температурный датчик и как работает I2C. Я бы порекомендовал вам прочитать примечание к приложению, которое Mouser имеет here. Он специфичен для вашего устройства и имеет примеры на языке C, которые достаточно просты. Это должно помочь вам на правильном пути.