参考:https://playground.arduino.cc/Code/TMP102/

Example Code for a TMP102 I2c Thermometer

I've fairly extensively commented the code, hopefully it makes sense.

Example code for talking to a TMP102 I2C thermometer, like those available from Sparkfun, for example. Rather heavily based on some code I found in the forums, some  samples, and a bit of personal investigation to make it all work.

Based on my testing, the sensor overreads by around 5 degrees C at room temperature. Not too sure if it is a percentage or a constant error. I know some of the analogue sensors are prone to incorrect readings if the reference voltages are off, but as we're using a digital output, this shouldn't affect it.  Any ideas? Mention them here.

For those using the Sparkfun logic converters with I2C, here are the pin connections:

  • Low voltage to the 3.3v pin of the Arduino
  • High voltage to the 5.0v pin
  • High voltage Channel 1 Txo to the SDA pin (analog 4)
  • High voltage Channel 2 Txo to the SCL pin (analog 5)
  • Low voltage Channel 1 Txi to the SDA pin of tmp102
  • Low voltage Channel 2 Txi to the SCL pin of tmp102
  • The RX pins of the logic converter are not used
  • V+ of tmp102 connected to 3.3v
  • ADD0 of tmp102 connected to ground
  • ALT of tmp102 not connected
  • All grounds connected together.

You can instead use resistors to voltage divide the signal lines, but I've not figured out how to do that yet.

  1. #include "Wire.h"
  2. #define TMP102_I2C_ADDRESS 72 /* This is the I2C address for our chip.
  3. This value is correct if you tie the ADD0 pin to ground. See the datasheet for some other values. */
  4.  
  5.  
  6. void setup() {
  7.   Wire.begin(); // start the I2C library
  8.   Serial.begin(115200); //Start serial communication at 115200 baud
  9. }
  10.  
  11.  
  12. void getTemp102(){
  13.   byte firstbyte, secondbyte; //these are the bytes we read from the TMP102 temperature registers
  14.   int val; /* an int is capable of storing two bytes, this is where we "chuck" the two bytes together. */
  15.   float convertedtemp; /* We then need to multiply our two bytes by a scaling factor, mentioned in the datasheet. */
  16.   float correctedtemp;
  17.   // The sensor overreads (?)
  18.  
  19.  
  20.   /* Reset the register pointer (by default it is ready to read temperatures)
  21. You can alter it to a writeable register and alter some of the configuration -
  22. the sensor is capable of alerting you if the temperature is above or below a specified threshold. */
  23.  
  24.   Wire.beginTransmission(TMP102_I2C_ADDRESS); //Say hi to the sensor.
  25.   Wire.send(0x00);
  26.   Wire.endTransmission();
  27.   Wire.requestFrom(TMP102_I2C_ADDRESS, 2);
  28.   Wire.endTransmission();
  29.  
  30.  
  31.   firstbyte      = (Wire.receive());
  32. /*read the TMP102 datasheet - here we read one byte from
  33.  each of the temperature registers on the TMP102*/
  34.   secondbyte     = (Wire.receive());
  35. /*The first byte contains the most significant bits, and
  36.  the second the less significant */
  37.     val = ((firstbyte) << 4);  
  38.  /* MSB */
  39.     val |= (secondbyte >> 4);    
  40. /* LSB is ORed into the second 4 bits of our byte.
  41. Bitwise maths is a bit funky, but there's a good tutorial on the playground*/
  42.     convertedtemp = val*0.0625;
  43.     correctedtemp = convertedtemp - 5;
  44.     /* See the above note on overreading */
  45.  
  46.  
  47.   Serial.print("firstbyte is ");
  48.   Serial.print("\t");
  49.   Serial.println(firstbyte, BIN);
  50.   Serial.print("secondbyte is ");
  51.   Serial.print("\t");
  52.   Serial.println(secondbyte, BIN);
  53.   Serial.print("Concatenated byte is ");
  54.   Serial.print("\t");
  55.   Serial.println(val, BIN);
  56.   Serial.print("Converted temp is ");
  57.   Serial.print("\t");
  58.   Serial.println(val*0.0625);
  59.   Serial.print("Corrected temp is ");
  60.   Serial.print("\t");
  61.   Serial.println(correctedtemp);
  62.   Serial.println();
  63. }
  64.  
  65. void loop() {
  66.   getTemp102();
  67.   delay(5000); //wait 5 seconds before printing our next set of readings.
  68. }

Comments

Hello, thanks too for this code. I noticed that it does not work for negative temperatures now it is getting colder outside ;-)  To my opinion the problem is in line 37. If the highest bit is 1 also the 4 highest bit of the integer have to be set. I replaced this line with:
    val = firstbyte;
if ((firstbyte & 0x80) > 0) {
val |= 0x0F00;
}
val <<= 4;

Example Code for a TMP102 I2c Thermometer————Arduino的更多相关文章

  1. I2C总线的Arduino库函数

    I2C总线的Arduino库函数 I2C即Inter-Integrated Circuit串行总线的缩写,是PHILIPS公司推出的芯片间串行传输总线.它以1根串行数据线(SDA)和1根串行时钟线(S ...

  2. I2C的库函数应用示例

    I2C  Arduino 简单应用举例   例1  多机通信 主机代码:(从编译器串口监视器发送数字1,2,3,4来控制从机的LED亮与灭) 1 #include <Wire.h> 2 v ...

  3. NXP LPC11xx I2C Slave 从机程序

    /**************************************************************************** * $Id:: i2cslave.c 363 ...

  4. 1000多块整个插板,arduino + android 蓝牙插板的实现--屌丝版

       需求描述 儿子有一堆充电玩具,基本上都是锂电池,经常插上去充电忘了到时拔下来,所以需要一块能设置接通时间的插板以保障电池的安全.   硬件设计: 首先需要一块插板,接着需要一个继电器,然后采用a ...

  5. (2)esp8266多国语言翻译系统

    http://bbs.mydigit.cn/simple/?t2649513.html 这个想法不错 原来只是想用esp8266搞一个百度的多国语言翻译系统出来的,只是为了尝试如何调用各种web ap ...

  6. JTAG 引脚自动识别 JTAG Finder, JTAG Pinout Tool, JTAG Pin Finder, JTAG pinout detector, JTAGULATOR, Easy-JTAG, JTAG Enumeration

    JTAG Finder Figuring out the JTAG Pinouts on a Device is usually the most time-consuming and frustra ...

  7. 编写一个Open Live Writer的VSCode代码插件

    起因 又是一年多没有更新过博客了,最近用Arduino做了一点有意思的东西,准备写一篇博客.打开尘封许久的博客园,发现因为Windows Live Writer停止更新,博客园推荐的客户端变为了Ope ...

  8. Arduino I2C + DS1307实时时钟

    主要特性 DS1307是Maxim的串行.I2C实时时钟芯片.主要特性有: 工作电压:主电源电压4.5~5.5V,电池电压2.0~3.5V 功耗:电池供电.备份模式时<500nA 接口:I2C, ...

  9. Arduino I2C + 三轴加速度计LIS3DH

    LIS3DH是ST公司生产的MEMS三轴加速度计芯片,实现运动传感的功能.主要特性有: 宽工作电压范围:1.71 ~ 3.6V 功耗:低功耗模式2μA:正常工作模式.ODR = 50Hz时功耗11μA ...

随机推荐

  1. vue 使用 sass 或者 less ( vue-cli 3 )

    项目使用 vue-cli 3 在项目中使用 sass npm install sass-loader --save -D cnpm install sass-loader --save -D      ...

  2. 关于action的使用在firefox报错的问题

    现在的网站有很多都是鼠标移到上面去才会显示出相应的一些标签之类的东西,然后再进行操作,但是因为要操作的元素一开始是隐藏的,就没办法直接定位,只能调用action来模拟鼠标悬停操作,也就是下面这句代码: ...

  3. Google Kick Start 2020 Round B T1-3

    这场题目除了最后一题稍微难了点,其他都是1眼题. T1 Bike Tour 没啥好说的,一个循环解决. T2 Bus Routes 没啥好说的,从第\(n\)的车站开始贪心取最晚的. T3 Robot ...

  4. 为什么一个还没毕业的大学生能够把 IO 讲的这么好?

    Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...

  5. 阿里云体验实验室 体验教程《Linux指令入门-系统管理》

    体验平台简介 阿里云开发者实验室提供免费云资源和丰富的场景化实践,旨在帮助开发者在学习应用技术,了解阿里云产品的特性. 阿里云体验实验室地址:https://developer.aliyun.com/ ...

  6. Dubbo系列之 (六)服务订阅(3)

    辅助链接 Dubbo系列之 (一)SPI扩展 Dubbo系列之 (二)Registry注册中心-注册(1) Dubbo系列之 (三)Registry注册中心-注册(2) Dubbo系列之 (四)服务订 ...

  7. Linux:正则表达式1

    正则表达式是以行为单位对字符串进行处理. 1.^ 以xxx开头=>比如在过滤出当前目录下的文件夹.发现文件夹都是以d开头的,那么这个命令就可以这么写 ls -l | grep ^d   过滤出以 ...

  8. jzoj 3567. 【GDKOI2014】石油储备计划

    Problem Description Input Output 对于每组数据,输出一个整数,表示达到"平衡"状态所需的最小代价. Data Constraint 对于20%的数据 ...

  9. 分布式事务框架.NetCore CAP总结

    来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...

  10. IDEA使用maven搭建SSM框架整合项目(超级详细,值得一看)

    目录 温馨提示 简单介绍下SSM 搭建过程 一.框架介绍 二.下载Maven 三.创建Maven项目 四.Maven工程需要引入的Jar 包 五.整合SSM框架.需要的相关配置文件配置项目 六.工程导 ...