I2C传感器Arduino输出0?

时间:2015-04-09 21:59:50

标签: arduino sensor i2c

我有这款D6T欧姆龙温度传感器(1x8阵列)并尝试从中获取温度读数。但是,在调试并确保没有错误之后,我无法得到任何输出但只是0。 这是代码,基本上是从github的SoftI2CMaster库中包含的示例修改的,更多信息在这里http://playground.arduino.cc/Main/SoftwareI2CLibrary

// 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);
}

请提供任何帮助:(

1 个答案:

答案 0 :(得分:0)

我有几条建议。

首先,从温度设备返回的数据不会作为浮点值发送给您 - 它是一个16位有符号整数。例如,如果器件检测到它是25.8度,则在I2C通信期间,您将从器件获得值258(0x0102)。此外,对代码的快速扫描显示,在readOneVal()例程中,您将返回标记为float,但您的函数被定义为返回int。无论如何,类型转换都没有多大帮助,因为数据不是您期望的格式。你必须自己转换它。

您真的需要花时间了解您的温度传感器以及I2C的工作原理。我建议您阅读Mouser有here的应用说明。它特定于您的设备,并且C语言中的示例非常简单。这应该有助于让你走上正确的轨道。