Grove - Sensor de Temperatura I2C de Alta Precisão (MCP9808)
O Grove - Sensor de Temperatura I2C de Alta Precisão (MCP9808) é um módulo digital de alta precisão baseado no MCP9808. Diferente de outros sensores, você pode escolher a resolução de medição deste sensor. Além de medições de temperatura de alta precisão, também oferecemos alerta de temperatura programável. Usamos um pino separado para enviar o sinal de alarme, você achará muito conveniente usar esse sinal como uma interrupção para controlar outra placa.
Em resumo, acreditamos que este sensor será uma nova estrela para controle de temperatura.
Atualizável para Sensores Industriais
Com o controlador S2110 SenseCAP e o registrador de dados S2100, você pode facilmente transformar o Grove em um sensor LoRaWAN®. A Seeed não só ajuda você na prototipagem, mas também oferece a possibilidade de expandir seu projeto com a série SenseCAP de robustos sensores industriais.
A série de sensores industriais SenseCAP S210x oferece uma experiência pronta para uso para medição ambiental. Consulte o Sensor Sem Fio de Temperatura e Umidade S2101, com maior desempenho e robustez para monitoramento da qualidade do ar. A série inclui sensores para umidade do solo, temperatura e umidade do ar, intensidade de luz, CO2, EC e uma estação meteorológica 8 em 1. Experimente o mais recente SenseCAP S210x em seu próximo projeto industrial de sucesso.
| Sensor Industrial SenseCAP |
| S2101 Temperatura do Ar & Umidade |
Recursos
-
Alta precisão
- ±0,25 (típico) de -40°C a +125°C
- ±0,5°C (máximo) de -20°C a 100°C
- ±1°C (máximo) de -40°C a +125°C
-
Resolução de medição selecionável pelo usuário
- +0,5°C, +0,25°C, +0,125°C, +0,0625°C
-
Saída de alerta de temperatura programável pelo usuário
-
Interface I2C
Especificação
| Item | Valor |
|---|---|
| Tensão de trabalho | 3.3V/5V |
| Faixa de operação | -40°C a +125°C |
| Interface digital | Padrão I2C 400 kHz |
| Endereço I2C | 0x18(padrão)/ 0x18~0x1F(opcional) |
Aplicações
- Aplicações industriais
- Freezers e refrigeradores industriais
- Processamento de alimentos
- Computadores pessoais e servidores
- Periféricos de PC
- Eletrônicos de consumo
- Dispositivos portáteis/de mão
Visão geral de hardware
Mapa de pinos


Endereço I2C
Oferecemos 3 conjuntos de pads na parte de trás da placa de circuito impresso. O padrão é que AD0~AD2 estejam todos conectados aos pads de nível baixo; você pode cortar esses pads e soldá-los para o outro lado (nível alto). O endereço I2C é um endereço de 7 bits 0011A0A1A2. 0011 é o código de endereço, que é a configuração de fábrica, nós não podemos mudá-lo. A0A1A2 é o endereço escravo, nós podemos mudá-lo. A configuração padrão é A0=0/A1=0/A2=0, portanto o endereço I2C padrão é 0011000. Normalmente o endereço deve ter 8 bits, então precisamos adicionar um bit 0 ao MSB (Most Significant Bit), e então obtemos 0001,1000. Este é um endereço binário, e frequentemente usamos o endereço hexadecimal no código, então vamos converter o endereço binário em um endereço hexadecimal; aqui obtemos 0x18. Pelo mesmo raciocínio, se soldarmos todos os pads para o nível alto, obteremos 0001,1111, que é 0x1F. Portanto, o endereço I2C varia de 0x18 a 0x1F; dentre eles, você pode escolher o que quiser, apenas certifique-se de mudar o endereço I2C no arquivo Seeed_MCP9808.h na biblioteca Grove_Temperature_sensor_MCP9808-master.
#define DEFAULT_IIC_ADDR 0X18
Mapa de endereços
| A2=0 | A0=0 | A0=1 |
|---|---|---|
| A1=0 | A2A1A0-000,0x18 | A2A1A0-001,0x19 |
| A1=1 | A2A1A0-010,0x1A | A2A1A0-011,0x1B |
| A2=1 | A0=0 | A0=1 |
|---|---|---|
| A1=0=0 | A2A1A0-100,0x1C | A2A1A0-101,0x1D |
| A1=0=1 | A2A1A0-110,0x1E | A2A1A0-111,0x1F |
ALE Pad
Você pode ver o pad ALE na parte de trás da placa de circuito impresso. O sinal de alerta enviado por esse pad pode ser usado como um sinal de interrupção externa para outros controladores. A saída padrão é alta; nesta placa deve ser 3,3V. Quando a condição é atendida, a tensão de saída se torna baixa (0V). Você pode definir a condição quando terminar este wiki 😄
Esquemático
Endereço I2C

Como mencionamos acima, usamos esses três conjuntos de pads para selecionar o endereço I2C; se você quiser mudar o endereço padrão, pode cortar o fio e ressoldá-lo.
MCP9808

Como você pode ver, o pad ALE está conectado aos 3,3V através de um resistor de pull-up.
Circuito de conversor de nível bidirecional

Este é um circuito típico de conversor de nível bidirecional para conectar duas seções de tensão diferente de um barramento I2C. O barramento I2C deste sensor usa 3,3V; se o barramento I2C do Arduino usar 5V, este circuito será necessário. No esquemático acima, Q6 e Q5 são MOSFETs de canal N 2N7002A, que atuam como chaves bidirecionais. Para entender melhor esta parte, você pode consultar o AN10441
Nesta seção mostramos apenas parte do esquemático; para o documento completo, consulte os Recursos
Plataformas compatíveis
| Arduino | Raspberry Pi | |||
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
As plataformas mencionadas acima como compatíveis são uma indicação da compatibilidade de software ou teórica do módulo. Na maioria dos casos, fornecemos apenas biblioteca de software ou exemplos de código para a plataforma Arduino. Não é possível fornecer biblioteca de software/código de demonstração para todas as possíveis plataformas de MCU. Portanto, os usuários precisam escrever sua própria biblioteca de software.
Primeiros Passos
Brincar com Arduino
Hardware
Materiais necessários
| Seeeduino V4.2 | Base Shield | Grove - I2C High Accuracy Temperature Sensor |
|---|---|---|
![]() | ![]() | |
| Adquira agora | Adquira agora | Adquira agora |
1 Conecte o cabo USB com cuidado, caso contrário você pode danificar a porta. Use o cabo USB com 4 fios internos, o cabo com 2 fios não consegue transferir dados. Se você não tiver certeza sobre o cabo que possui, você pode clicar aqui para comprar.
2 Cada módulo Grove vem com um cabo Grove quando você compra. Caso você perca o cabo Grove, você pode clicar aqui para comprar.
-
Passo 1. Conecte o Grove - I2C High Accuracy Temperature Sensor à porta I2C do Grove-Base Shield.
-
Passo 2. Conecte o Grove - Base Shield ao Seeeduino.
-
Passo 3. Conecte o Seeeduino ao PC por meio de um cabo USB.

Se não tivermos o Grove Base Shield, também podemos conectar este módulo diretamente ao Seeeduino como abaixo.
| Seeeduino | Grove-MCP9808 |
|---|---|
| 5V | Vermelho |
| GND | Preto |
| SDA | Branco |
| SCL | Amarelo |
Software
Se esta é a primeira vez que você trabalha com Arduino, recomendamos fortemente que você veja Getting Started with Arduino antes de começar.
-
Passo 1. Baixe a biblioteca Grove MCP9808 do Github.
-
Passo 2. Consulte How to install library para instalar a biblioteca para o Arduino.
-
Passo 3. Reinicie a Arduino IDE. Abra o exemplo pelo caminho: File --> Examples --> Grove Temperature Sensor MCP9808 --> MCP9808_demo_with_limit.

Como mostrado na imagem acima, fornecemos dois demos para você, MCP9808_basic_demo e MCP9808_demo_with_limit. O MCP9808_basic_demo apenas fornece a temperatura, a função de alerta está desativada. E para o demo MCP9808_demo_with_limit, a função de alerta está ativada. Se você só quer a temperatura, o demo básico será suficiente. Se você quiser usar a função de alerta, você deve escolher o demo com limite.
-
Passo 4. Envie o demo. Se você não souber como enviar o código, verifique How to upload code.
-
Passo 5. Abra o Serial Monitor da Arduino IDE clicando em Tool-> Serial Monitor. Ou pressione as teclas ++ctrl+shift+m++ ao mesmo tempo. Se tudo correr bem, você obterá o resultado.
O resultado deve ser como
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
Agora, vamos ver como usar o Pad ALE.
O código no demo 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);
}
Além de medir a temperatura, este código também implementa uma função. Quando a temperatura é menor que 30℃, o Pad ALE fornece, por padrão, alta-3,3 V. Quando a temperatura é maior que 30℃, o Pad ALE fornecerá baixa-0 V.
Então você pode perguntar, e se eu quiser mudar a temperatura de limiar. Ok, por favor vá até a linha 14:
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);
Usamos esta função para controlar a temperatura, o primeiro parâmetro é o endereço do registrador UPPER_LIMIT e o segundo parâmetro 0x01e0 é a temperatura em hexadecimal que definimos, como mencionamos acima, é 30℃. O 0x01e0 é um número hexadecimal de quatro bits, o último bit à direita representa a parte fracionária. Nós o definimos como 0, então o número válido é 0x1e. e significa 14 em decimal, e o bit mais alto 1 significa 16 em decimal. Então 0x1e é igual a 16+14=30.
Fornecemos 3 funções no arquivo Seeed_MCP9808.cpp.
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);
As we mentioned before, the default output of the ALE Pad is high, and the output level goes low when the temperature meets certain conditions. You can use those 3 functions to set your own conditions.
sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,u16) is used to set the lower temperature limit, u16 is the 4 bit Hexadecimal temperature we set. When the temperature is lower than the value we set, the output of the ALE Pad will goes down.
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,u16) is used to set the upper temperature limit, also u16 is the 4 bit Hexadecimal temperature we set. When the temperature is higher than the value we set, the output of the ALE Pad will goes down.
sensor.set_critical_limit(SET_CRITICAL_LIMIT_ADDR,u16) is used for the inturrupt mode, in this wiki we only show you how to work as a comparator. If you want to know more, please check the datasheet .
Now we can set a condition zone by lower_limit and upper_limit, when the temperature comes to the condition zone, the output will goes low.

For example, if you want the ALE Pad output high between 28℃ and 30℃, and output low when the tempareture is higer than 30℃ or lower than 28℃. The code should be like:
sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,0x01c0);
delay(10);
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);
delay(10);
Please make sure the upper_limit is higer than the lower_limit, otherwise it will not output properly. And please make sure the critical_limit is higer than the upper_limit. A certain delay() is required to ensure that the registers are written correctly.
Play With Raspberry Pi
Hardware
- Step 1. Things used in this project:
| Raspberry pi | Grove Base Hat for RasPi | Grove - I2C High Accuracy Temperature Sensor |
|---|---|---|
![]() | ||
| Adquira agora | Adquira agora | Adquira agora |
- Step 2. Plug the Grove Base Hat into Raspberry.
- Step 3. Connect the Grove - I2C High Accuracy Temperature Sensor to I2C port of the Base Hat.
- Step 4. Connect the Raspberry Pi to PC through USB cable.

Software
If you are using Raspberry Pi with Raspberrypi OS >= Bullseye, you have to use this command line only with Python3.
-
Step 1. Follow Setting Software to configure the development environment and install the grove.py to your raspberry pi.
-
Step 2. Excute below commands to run the code.
# virutalenv para Python3
virtualenv -p python3 env
source env/bin/activate
#digitar comando
grove_high_accuracy_temperature
Following is the mcp9808.py code.
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
If everything goes well, you will be able to see the following result
(env)pi@raspberrypi:~ grove_high_accuracy_temperature
Insira Grove - I2C-High-Accuracy-Temperature
em qualquer slot I2C do Grove-Base-Hat
Detectando temperatura...
24.5 Celsius
24.5 Celsius
24.375 Celsius
^CRastreamento (última chamada mais recente):
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
You can quit this program by simply press ctrl+c.
Schematic Online Viewer
Resources
- [Zip] Grove - I2C High Accuracy Temperature Sensor(MCP9808) Eagle files
- [Zip] Seeed MCP9808 Library
- [PDF] Datasheet of MCP9808
- [PDF] Datasheet of 2N7002A
- [PDF] AN10441
Project
This is the introduction Video of this product, simple demos, you can have a try.
Tech Support & Product Discussion
Thank you for choosing our products! We are here to provide you with different support to ensure that your experience with our products is as smooth as possible. We offer several communication channels to cater to different preferences and needs.









