Skip to main content

Grove - I2C 高精度温度传感器(MCP9808)

Grove - I2C 高精度温度传感器(MCP9808) 是一个基于 MCP9808 的高精度数字模块。与其他传感器不同,您可以选择 此传感器的测量分辨率。除了高精度温度测量外,我们还提供可编程温度 报警功能。我们使用单独的引脚输出报警信号,您会发现将此信号用作中断来控制其他板子非常方便。

总而言之,我们相信这个传感器将成为温度控制领域的新星。

可升级为工业传感器

通过 SenseCAP S2110 控制器S2100 数据记录器,您可以轻松将 Grove 转换为 LoRaWAN® 传感器。Seeed 不仅帮助您进行原型设计,还为您提供了通过 SenseCAP 系列坚固的工业传感器扩展项目的可能性。

SenseCAP S210x 系列工业传感器为环境感知提供开箱即用的体验。请参考具有更高性能和稳定性的 S2101 无线温湿度传感器,用于空气质量监测。该系列包括土壤湿度、空气温湿度、光照强度、CO2、EC 和 8 合 1 气象站传感器。尝试最新的 SenseCAP S210x 来实现您下一个成功的工业项目。

SenseCAP 工业传感器
S2101 空气温湿度传感器

特性

  • 高精度

    • ±0.25 (典型值) 从 -40°C 到 +125°C
    • ±0.5°C (最大值) 从 -20°C 到 100°C
    • ±1°C (最大值) 从 -40°C 到 +125°C
  • 用户可选择的测量分辨率

    • +0.5°C, +0.25°C, +0.125°C, +0.0625°C
  • 用户可编程温度报警输出

  • I2C 接口

规格参数

项目
工作电压3.3V/5V
工作范围-40°C 到 +125°C
数字接口I2C 标准 400 kHz
I2C 地址0x18(默认)/ 0x18~0x1F(可选)

应用

  • 工业应用
  • 工业冷冻机和冰箱
  • 食品加工
  • 个人电脑和服务器
  • PC 外设
  • 消费电子产品
  • 手持/便携式设备

硬件概述

引脚图

I2C 地址

我们在 PCB 背面提供了 3 组焊盘。默认情况下 AD0~AD2 都连接到低电平焊盘,您可以切断这些焊盘并将它们焊接到另一侧(高电平)。 I2C 地址是一个 7 位地址 0011A0A1A20011 是地址代码,这是出厂设置,我们无法更改。 A0A1A2 是从机地址,我们可以更改它。默认设置是 A0=0/A1=0/A2=0,所以默认 I2C 地址是 0011000。通常地址应该是 8 位,所以我们需要在 MSB(最高有效位)添加一位 0,然后我们得到 0001,1000。这是一个二进制地址, 我们在代码中经常使用十六进制地址,所以让我们将二进制地址转换为十六进制地址,这里我们得到 0x18。同样地,如果我们将所有焊盘焊接到 高电平,我们将得到 0001,1111,即 0x1F。所以 I2C 地址范围从 0x18 到 0x1F,其中您可以选择任何您想要的,只需确保您将在 Grove_Temperature_sensor_MCP9808-master 库中的 Seeed_MCP9808.h 文件中更改 I2C 地址。

#define DEFAULT_IIC_ADDR  0X18

地址映射

A2=0A0=0A0=1
A1=0A2A1A0-000,0x18A2A1A0-001,0x19
A1=1A2A1A0-010,0x1AA2A1A0-011,0x1B
A2=1A0=0A0=1
A1=0=0A2A1A0-100,0x1CA2A1A0-101,0x1D
A1=0=1A2A1A0-110,0x1EA2A1A0-111,0x1F

ALE 焊盘

您可以在 PCB 背面看到 ALE 焊盘。从此焊盘输出的报警信号可以用作其他控制器的外部中断信号。 默认输出为高电平,在此板上应该是 3.3V。当满足条件时,输出电压变为低电平(0V)。当您完成本教程时,您可以设置条件 😄

原理图

I2C 地址

如上所述,我们使用这三组焊盘来选择 I2C 地址,如果您想更改默认地址,您可以切断导线并重新焊接。

MCP9808

如您所见,ALE 焊盘通过上拉电阻连接到 3.3V。

双向电平转换电路

这是一个典型的双向电平转换电路,用于连接 I2C 总线的两个不同电压部分。该传感器的 I2C 总线使用 3.3V,如果 Arduino 的 I2C 总线使用 5V,则需要此电路。在上面的原理图中,Q6Q5 是 N 沟道 MOSFET 2N7002A,充当双向开关。为了更好地理解这部分,您可以参考 AN10441

tip

在本节中,我们只向您展示原理图的一部分,完整文档请参考 资源

支持的平台

ArduinoRaspberry Pi
caution

上面提到的支持平台是模块软件或理论兼容性的指示。在大多数情况下,我们只为Arduino平台提供软件库或代码示例。我们无法为所有可能的MCU平台提供软件库/演示代码。因此,用户必须编写自己的软件库。

入门指南

与Arduino一起使用

硬件

所需材料

Seeeduino V4.2Base ShieldGrove - I2C高精度温度传感器
立即购买立即购买立即购买
note

1 请轻轻插入USB线,否则可能会损坏端口。请使用内部有4根线的USB线,2根线的线缆无法传输数据。如果您不确定您的线缆,可以点击这里购买

2 每个Grove模块在购买时都配有一根Grove线缆。如果您丢失了Grove线缆,可以点击这里购买。

  • 步骤1. 将Grove - I2C高精度温度传感器连接到Grove-Base Shield的I2C端口。

  • 步骤2. 将Grove - Base Shield插入Seeeduino。

  • 步骤3. 通过USB线将Seeeduino连接到PC。

note

如果我们没有Grove Base Shield,我们也可以直接将此模块连接到Seeeduino,如下所示。

SeeeduinoGrove-MCP9808
5V红色
GND黑色
SDA白色
SCL黄色

软件

note

如果这是您第一次使用Arduino,我们强烈建议您在开始之前查看Arduino入门指南

  • 步骤1. 从Github下载Grove MCP9808库。

  • 步骤2. 参考如何安装库为Arduino安装库。

  • 步骤3. 重启Arduino IDE。通过路径打开示例:文件 --> 示例 --> Grove Temperature Sensor MCP9808 --> MCP9808_demo_with_limit

tip

如上图所示,我们为您提供了两个演示,MCP9808_basic_demoMCP9808_demo_with_limitMCP9808_basic_demo只提供温度,警报功能被禁用。 而对于MCP9808_demo_with_limit演示,警报功能被启用。如果您只想要温度,基本演示就足够了。如果您想使用警报功能,您应该选择限制演示。

  • 步骤4. 上传演示。如果您不知道如何上传代码,请查看如何上传代码

  • 步骤5. 通过点击工具-> 串口监视器打开Arduino IDE的串口监视器。或者同时按++ctrl+shift+m++键。如果一切正常,您将得到结果。

结果应该像这样

sensor init!!
temperature value is: 29.31
temperature value is: 29.31
temperature value is: 29.31
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.19
temperature value is: 29.25

现在,让我们看看如何使用 ALE 引脚。

演示代码 MCP9808_demo_with_limit 中的代码:

#include "Seeed_MCP9808.h"


MCP9808 sensor;

void setup()
{
Serial.begin(115200);
if(sensor.init())
{
Serial.println("sensor init failed!!");
}
//Set upper limit is 30°C
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);
delay(10);
//Set upper limit is 32°C
sensor.set_critical_limit(SET_CRITICAL_LIMIT_ADDR,0x0200);
delay(10);
//Enable the alert bit.The alert bit outputs low when the temperature value beyond limit.Otherwise stays high.
sensor.set_config(SET_CONFIG_ADDR,0x0008);

Serial.println("sensor init!!");
}


void loop()
{
float temp=0;
//Get temperature ,a float-form value.
sensor.get_temp(&temp);
Serial.print("temperature value is: ");
Serial.println(temp);
delay(1000);
}

除了测量温度外,这段代码还实现了一个功能。当温度低于30℃时,ALE 引脚输出默认高电平-3.3v。 当温度高于30℃时,ALE 引脚将输出低电平-0v。

所以你可能会问,如果我想改变阈值温度怎么办。好的,请看第14行:

sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);

我们使用这个函数来控制温度,第一个参数是UPPER_LIMIT寄存器地址,第二个参数0x01e0是我们设置的十六进制温度,如上所述,它是30℃。0x01e0是一个四位十六进制数,右边的最后一位代表小数部分。我们将其设置为0,那么有效数字是0x1ee在十进制中表示14, 高位1在十进制中表示16。所以0x1e等于16+14=30。

我们在文件Seeed_MCP9808.cpp中提供了3个函数。
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,u16); sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,u16); sensor.set_critical_limit(SET_CRITICAL_LIMIT_ADDR,u16);

如前所述,ALE 引脚的默认输出是高电平,当温度满足特定条件时,输出电平变为低电平。你可以使用这3个函数来设置你自己的条件。

sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,u16) 用于设置温度下限,u16是我们设置的4位十六进制温度。当温度低于我们设置的值时,ALE 引脚的输出将变低。

sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,u16) 用于设置温度上限,同样u16是我们设置的4位十六进制温度。当温度高于我们设置的值时,ALE 引脚的输出将变低。

sensor.set_critical_limit(SET_CRITICAL_LIMIT_ADDR,u16) 用于中断模式,在这个wiki中我们只展示如何作为比较器工作。如果你想了解更多,请查看数据手册

现在我们可以通过lower_limit和upper_limit设置一个条件区域,当温度进入条件区域时,输出将变低。

例如,如果你想要**ALE 引脚**在28℃和30℃之间输出高电平,当温度高于30℃或低于28℃时输出低电平。 代码应该是这样的:


sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,0x01c0);
delay(10);
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);
delay(10);

caution

请确保upper_limit高于lower_limit,否则不会正常输出。并且请确保critical_limit高于upper_limit。需要一定的delay()来确保寄存器被正确写入。

与树莓派一起使用

硬件

  • 步骤 1. 本项目中使用的物品:
树莓派Grove Base Hat for RasPiGrove - I2C High Accuracy Temperature Sensor
立即获取立即获取立即获取
  • 步骤 2. 将Grove Base Hat插入树莓派。
  • 步骤 3. 将Grove - I2C High Accuracy Temperature Sensor连接到Base Hat的I2C端口。
  • 步骤 4. 通过USB线将树莓派连接到PC。

软件

caution

如果你使用的是Raspberry Pi with Raspberrypi OS >= Bullseye,你必须仅使用Python3来使用这个命令行。

  • 步骤 1. 按照设置软件配置开发环境并将grove.py安装到你的树莓派。

  • 步骤 2. 执行以下命令来运行代码。


# Python3 虚拟环境
virtualenv -p python3 env
source env/bin/activate
#输入命令
grove_high_accuracy_temperature

以下是 mcp9808.py 代码。


import math
import threading
from grove.i2c import Bus
from grove.temperature import Temper

RES_LOW = 0x00
RES_MEDIUM = 0x01
RES_HIGH = 0x02
RES_PRECISION = 0x03

MCP9808_REG_AMBIENT_TEMP = 0x05

class TemperMCP9808(Temper):
def __init__(self, address=0x18):
self._addr = address
self._bus = Bus()
self._resolution = Temper.RES_1_2_CELSIUS

def _derive_res(self, res):
ares = -1
if res >= Temper.RES_1_2_CELSIUS:
ares = RES_LOW
elif res >= Temper.RES_1_4_CELSIUS:
ares = RES_MEDIUM
elif res >= Temper.RES_1_8_CELSIUS:
ares = RES_HIGH
elif res >= Temper.RES_1_16_CELSIUS:
ares = RES_PRECISION

if ares < 0:
return False
self._bus.write_byte(self._addr, ares)
# print("ares = {}".format(ares))
return True

@property
def temperature(self):
result = self._bus.read_word_data(self._addr, MCP9808_REG_AMBIENT_TEMP)
# Swap the bytes
data = (result & 0xff) 8 | (result & 0xff00) 8
# print("data = {}".format(data))
# print("data = {}".format(hex(data)))
# Check if the temperature is negative
if data & 0x1000:
data = -((data ^ 0x0FFF) + 1)
else:
data = data & 0x0fff
return data / 16.0
success

如果一切顺利,您将能够看到以下结果


(env)pi@raspberrypi:~ grove_high_accuracy_temperature
Insert Grove - I2C-High-Accuracy-Temperature
to Grove-Base-Hat any I2C slot
Detecting temperature...
24.5 Celsius
24.5 Celsius
24.375 Celsius
^CTraceback (most recent call last):
File "grove_high_accuracy_temperature.py", line 54, in <module>
main()
File "grove_high_accuracy_temperature.py", line 50, in main
time.sleep(1)
KeyboardInterrupt

您可以通过简单地按 ctrl+c 来退出此程序。

原理图在线查看器

资源

项目

这是该产品的介绍视频,包含简单的演示,您可以尝试一下。

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...