我有这款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);
}
请提供任何帮助:(
答案 0 :(得分:0)
我有几条建议。
首先,从温度设备返回的数据不会作为浮点值发送给您 - 它是一个16位有符号整数。例如,如果器件检测到它是25.8度,则在I2C通信期间,您将从器件获得值258(0x0102)。此外,对代码的快速扫描显示,在readOneVal()
例程中,您将返回标记为float
,但您的函数被定义为返回int
。无论如何,类型转换都没有多大帮助,因为数据不是您期望的格式。你必须自己转换它。
您真的需要花时间了解您的温度传感器以及I2C的工作原理。我建议您阅读Mouser有here的应用说明。它特定于您的设备,并且C语言中的示例非常简单。这应该有助于让你走上正确的轨道。