Skip to Content

Tutorial do Sensor de Temperatura Si7021 com Arduino

Tutorial do Sensor de Temperatura Si7021 com Arduino

Neste tutorial vais aprender como medir a temperatura e a humidade relativa usando o Sensor Si7021 e um Arduino.

O sensor Si7021 é uma escolha popular para medir temperatura e humidade em projetos DIY. É um sensor fiável e preciso que comunica via I2C, tornando fácil a integração com microcontroladores como o Arduino e o ESP32. Com uma ampla gama de funcionamento e baixo consumo de energia, o Si7021 é adequado para várias aplicações, incluindo estações meteorológicas, dispositivos de casa inteligente e sistemas de monitorização ambiental. O seu tamanho compacto e interface simples tornam-no ideal tanto para principiantes como para makers experientes que queiram adicionar capacidades de medição ambiental aos seus projetos.

Vamos começar com os componentes necessários.

Componentes Necessários

Obviamente, vais precisar de um Sensor de Temperatura e Humidade Si7021. Normalmente, não compras o sensor em bruto, mas sim uma placa breakout que já traz alguns componentes extra, facilitando a ligação do sensor.

Além disso, vais precisar de um microcontrolador. Usei um Arduino Uno para este projeto, mas qualquer outro Arduino ou até um ESP32/ESP8266 serve perfeitamente.

Por fim, queremos mostrar os dados de temperatura e humidade medidos. Eu escolhi um OLED, mas também podes optar por um LCD display .

Sensor de Temperatura & Humidade Si7021

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Dupont wire set

Conjunto de Cabos Dupont

Half_breadboard56a

Breadboard

OLED display

Ecrã OLED

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

O Sensor de Temperatura & Humidade Si7021

O Si7021 é um sensor de humidade e temperatura muito pequeno, de baixo consumo, com eletrónica integrada. Vem calibrado de fábrica para medições precisas e comunica através de uma interface I2C. A imagem abaixo mostra o Diagrama de Blocos Funcional do Si7021:

Functional Block Diagram of Si7021
Diagrama de Blocos Funcional do Si7021 ( source )

Como podes ver, contém os elementos sensores de humidade e temperatura, um conversor analógico-digital (ADC), a lógica de controlo com memória para armazenar os fatores de calibração, e a eletrónica para a interface I2C.

Especificações Técnicas

O elemento sensor de temperatura do Si7021 pode medir temperaturas entre –10 e 85 °C com uma precisão de ±0.4 °C. O sensor de humidade mede humidade relativa entre 0 e 80% RH com uma precisão de ±3% RH.

O sensor funciona entre 1.9 e 3.6 V e o consumo de energia durante o funcionamento é de 150μA (60nA em modo standby).

Uma característica única deste sensor é o elemento de aquecimento integrado, que pode ser usado para aumentar a temperatura do sensor e eliminar condensação, ou para implementar medições de ponto de orvalho. Nota que ao ligar o aquecedor, o consumo de energia pode subir até 94.20mA (a 3.3V). Para mais detalhes, consulta a folha de dados:

Circuito de Aplicação Típica

Para usar o Si7021 numa aplicação real, normalmente é necessário adicionar resistências pull-up para a interface I2C e um condensador para estabilizar a alimentação. A imagem abaixo mostra o Circuito de Aplicação Típica:

Typical Application Circuit of Si7021
Circuito de Aplicação Típica do Si7021 ( source )

No entanto, na maioria dos casos, vais querer usar uma placa breakout que já tem estes componentes integrados.

Placa breakout para SI7021

A imagem abaixo mostra uma placa breakout típica para o SI7021. Acrescenta as resistências pull-up mencionadas e um regulador de tensão, permitindo que utilizes a placa com 3.3V ou 5V.

Front & Back of Si7021 breakout board
Frente & Verso da placa breakout Si7021

Atenção que muitas placas breakout vêm rotuladas como “SI7021” mas na verdade contêm um sensor diferente, embora comparável. No exemplo acima, podes ver a etiqueta “SI7021” na placa e as etiquetas “HTU21” e “SHT21” mesmo por baixo do sensor.

Os SI7021, HTU21 e SHT21 são intercambiáveis em termos de especificações e protocolos de comunicação e até têm o mesmo endereço I2C ( 0x40 ). No entanto, armazenam os números de série em formatos diferentes, o que pode causar um pequeno problema ao usar as bibliotecas Adafruit_Si7021 ou SparkFun_Si7021 . Mais sobre isso à frente.

Por fim, nota que os SHT21, HTU21 e Si7021 estão disponíveis com ou sem uma membrana protetora de PTFE sobre o elemento sensor. Vê a imagem seguinte para os dois tipos:

Si7021 Sensor with or without a protective membrane
Sensor Si7021 com ou sem membrana protetora

Ligar o Si7021 ao Arduino

Devido à interface I2C, ligar o sensor Si7021 a um Arduino é muito simples. Primeiro, liga os pinos SCL e SDA da placa breakout do Si7021 aos pinos correspondentes do Arduino, como mostrado abaixo. Depois, liga o GND e o VIN.

Wiring of Si7021sensor with Arduino
Ligação do sensor Si7021 ao Arduino

A placa breakout funciona com 5V ou 3.3V e podes usar qualquer um para o VIN. Na ligação acima, estou a usar 3.3V para o VIN.

De seguida, vamos escrever algum código simples para testar o funcionamento do sensor Si7021.

Código para ler dados do Si7021

Antes de podermos ler os dados de temperatura e humidade do sensor Si7021, precisamos de instalar uma biblioteca. Duas opções comuns são a Adafruit_Si7021 ou a SparkFun_Si7021 . Eu vou usar a Adafruit_Si7021 .

Abre o Library Manager, procura por “Si7021” e install a biblioteca Adafruit_Si7021 , como mostrado abaixo.

Adafruit_Si7021 library installed in  Library Manager
Biblioteca Adafruit_Si7021 instalada no Library Manager

Agora podemos escrever um código de teste simples. Começamos por incluir a biblioteca Adafruit_Si7021 e criar o objeto do sensor. Na função setup() inicializamos o sensor através de sensor.begin() , e no loop lemos e mostramos a humidade e temperatura medidas.

#include "Adafruit_Si7021.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();

void setup() {
  Serial.begin(9600);
  sensor.begin();
}

void loop() {
  Serial.print("Hum:");
  Serial.println(sensor.readHumidity(), 2);
  Serial.print("Temp:");
  Serial.println(sensor.readTemperature(), 2);
  delay(1000);
}

Se carregares e executares este código, deves ver a seguinte saída no Serial Monitor. Certifica-te de que a taxa de transmissão está definida para 9600 baud.

Output of Si7021 measurements on Serial Monitor
Saída das medições do Si7021 no Serial Monitor

Também podes abrir o Serial Plotter e soprar para o sensor. Deves ver um aumento na humidade e temperatura medidas. Na imagem abaixo, a linha azul mostra a humidade a atingir 100% e um ligeiro aumento na temperatura (linha vermelha).

Output of Si7021 measurements on Serial Plotter
Saída das medições do Si7021 no Serial Plotter

Se o sensor não funcionar, certifica-te de que está corretamente ligado e pode ser detetado como um dispositivo I2C. Podes verificar isto executando um scanner I2C.

#include "I2CScanner.h"

I2CScanner scanner;

void setup() {
  Serial.begin(9600);
  while (!Serial) {};

  scanner.Init();
}

void loop() {
  scanner.Scan();
  delay(5000);
}

Se carregares e executares o código acima, deve aparecer a seguinte saída no Serial Monitor

--- Scan started ---
I2C device found at address 0x40  !

onde 0x40 é o endereço I2C por defeito do sensor Si7021. Se não vires isto, ou a ligação está errada, ou o teu sensor está avariado, ou tem um endereço I2C diferente, o que não deveria acontecer.

Did not find Si7021 sensor

Se tentares executar o código de exemplo si7021.ino que vem com a biblioteca Adafruit_Si7021 , podes ver a mensagem de erro “Did not find Si7021 sensor!”. O erro é gerado pelo seguinte trecho de código na função setup() :

void setup() {  
  ...
  if (!sensor.begin()) {
    Serial.println("Did not find Si7021 sensor!");
    while (true)
      ;
  }
  ...
}

Vais ver esta mensagem, mesmo quando o scan I2C confirma que o sensor Si7021 é detetado no endereço 0x40 e está a funcionar corretamente.

Analisei mais de perto a inicialização code para o sensor e o erro é causado pela chamada da função _readRegister8() no código abaixo.

bool Adafruit_Si7021::begin() {
  if (!i2c_dev->begin())
    return false;

  reset();
  if (_readRegister8(SI7021_READRHT_REG_CMD) != 0x3A)
    return false;

  readSerialNumber();
  _readRevision();

  return true;
}

A razão é que muitas placas breakout rotuladas como “Si7021” usam na verdade um sensor SHT21 ou HTU21. Estes sensores são comparáveis ao Si7021 mas aparentemente armazenam o número de série num formato/endereço diferente, o que causa este erro.

A forma mais fácil de contornar isto é chamar a função begin() mas ignorar o valor de retorno – como fiz no exemplo acima. O sensor e o resto do código funcionam perfeitamente, mas não vais conseguir mostrar o número de série ou a versão do sensor.

Também experimentei a biblioteca SparkFun_Si7021 e teve o mesmo problema. Se não quiseres usar nenhuma destas duas bibliotecas e quiseres resolver este problema, podes implementar a funcionalidade tu mesmo. Não é difícil. O post no blog Bare Si7021 temperature/relative humidity sensor mostra como se faz.

Para qualquer aplicação prática, provavelmente vais querer mostrar os dados de temperatura e humidade num ecrã e não apenas no Serial Monitor. É isso que vamos fazer na próxima secção. Vamos adicionar um OLED e mostrar lá os dados do sensor.

Adicionar um OLED para mostrar dados do Si7021

Como o OLED também é um dispositivo I2C, a ligação é direta. Basta ligar o SDA e SCL aos mesmos pinos onde o sensor Si7021 está ligado. Como o OLED funciona a 3.3V, também podemos partilhar as linhas de alimentação. A imagem abaixo mostra toda a ligação.

Connecting OLED and Si7021 with Arduino
Ligação do OLED e Si7021 ao Arduino

Se tiveres dificuldades com o OLED, vê o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino . A imagem abaixo mostra toda a ligação numa breadboard real:

Wiring of OLED and Si7021 with Arduino
Ligação do OLED e Si7021 ao Arduino

Código para mostrar dados do Si7021 no OLED

Nesta secção vamos escrever o código para mostrar a temperatura e humidade medidas pelo sensor Si7021 num ecrã OLED. Para escrever no OLED vamos usar a biblioteca Adafruit_SSD1306 . Podes install it via the Library Manager como habitual:

Adafruit_SSD1306 library installed in Library Manager
Biblioteca Adafruit_SSD1306 instalada no Library Manager

O código abaixo lê as medições do sensor Si7021 e mostra os valores de temperatura e humidade no OLED. Vê primeiro o código completo e depois analisamos os detalhes.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

void centered(const char* text, int y) {
  int16_t x1, y1;
  uint16_t w, h;
  oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
  oled.setCursor(64 - w / 2, y);
  oled.print(text);
}

void display() {
  static char text[30];
  float temp = sensor.readTemperature();
  float hum = sensor.readHumidity();

  oled.clearDisplay();
  sprintf(text, "%.1f c", temp);
  centered(text, 12);
  sprintf(text, "%.1f %%", hum);
  centered(text, 38);
  oled.display();
}

void setup() {
  oled_init();
  sensor.begin();
}

void loop() {
  display();
  delay(1000);
}

Bibliotecas e Inicialização do Ecrã

Começamos por incluir as bibliotecas necessárias para o sensor Si7021 e para o ecrã OLED Adafruit SSD1306. Depois inicializamos o ecrã OLED na função oled_init() . Esta função prepara o ecrã, limpa-o, define o tamanho e a cor do texto.

#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
}

Nota que o endereço I2C do ecrã OLED está definido para 0x3C em oled.begin() . A maioria destes pequenos OLEDs usa este endereço, mas o teu pode ser diferente. Se não vires nada no OLED, provavelmente tem um endereço I2C diferente e tens de alterar o endereço passado para oled.begin() . Se não souberes o endereço I2C, vê o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino .

Funções de Display

A função centered() é usada para imprimir texto centrado no ecrã OLED numa coordenada y específica. A função display() lê os dados de temperatura e humidade do sensor e mostra-os no ecrã OLED.

void centered(const char* text, int y) {
  // Function to center text on OLED
}

void display() {
  // Function to display temperature and humidity on OLED
}

Função Setup

Na função setup() , inicializamos a comunicação série para debug, inicializamos o ecrã OLED e começamos a comunicação com o sensor Si7021. Como mencionado antes, se o sensor Si7021 não for detetado, verifica as ligações, o endereço I2C e ignora o valor de retorno de sensor.begin() .

void setup() {
  oled_init();
  sensor.begin();
}

Função Loop

A função loop() chama continuamente a função display() para atualizar e mostrar os valores no ecrã OLED. Depois espera 1 segundo (1000ms) antes da próxima atualização.

void loop() {
  display();
  delay(1000);
}

Saída no OLED

Se carregares e executares o código, deves ver a temperatura em Celsius e a humidade relativa em percentagem mostradas no OLED.

Si7021Output on OLED
Saída do Si7021 no OLED

E assim tens um pequeno e prático sensor ambiental!

Conclusões

Neste tutorial aprendeste a usar o sensor de temperatura e humidade Si7021, um OLED e um Arduino Uno para construir um sensor ambiental.

Como o Si7021 tem um modo de baixo consumo e funciona a 3.3V, também é adequado para construir um sensor ambiental alimentado a bateria usando um ESP32. Vê o Simple ESP32 Internet Weather Station , onde usamos um ESP32 alimentado a bateria, por exemplo. Se quiseres reduzir ainda mais o consumo de energia, recomendo um ecrã e-Paper em vez de um OLED. O tutorial Weather Station on e-Paper Display pode ser útil aqui.

Nota que existem muitos outros sensores de temperatura (e humidade) alternativos que podes usar. Aqui está uma lista de tutoriais onde usamos alguns desses sensores.

O mais comparável, em termos de consumo, facilidade de uso e precisão, é provavelmente o sensor BME280 . Há um excelente comparison of Temperature/Humidity sensors , que vale a pena ler.

Finalmente, se preferes o ESP32 ao Arduino, vê os seguintes tutoriais.

Espero que te tenhas divertido a construir e experimentar este projeto. Se tiveres dúvidas, deixa um comentário.

Boas invenções ; )