Pular para o conteúdo principal

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

ItemValor
Tensão de trabalho3.3V/5V
Faixa de operação-40°C a +125°C
Interface digitalPadrão I2C 400 kHz
Endereço I2C0x18(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=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 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

dica

Nesta seção mostramos apenas parte do esquemático; para o documento completo, consulte os Recursos

Plataformas compatíveis

ArduinoRaspberry Pi
cuidado

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.2Base ShieldGrove - I2C High Accuracy Temperature Sensor
Adquira agoraAdquira agoraAdquira agora
nota

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.

nota

Se não tivermos o Grove Base Shield, também podemos conectar este módulo diretamente ao Seeeduino como abaixo.

SeeeduinoGrove-MCP9808
5VVermelho
GNDPreto
SDABranco
SCLAmarelo

Software

nota

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.

dica

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

cuidado

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 piGrove Base Hat for RasPiGrove - I2C High Accuracy Temperature Sensor
Adquira agoraAdquira agoraAdquira 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

cuidado

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
success

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

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.

Loading Comments...