sensor de temperatura com arduino

Como utilizar um sensor de temperatura com Arduino? Deixe um comentário

Nesse post vamos explorar o uso do sensor de temperatura com Arduino, mais especificamente o DS18B20, usado no protótipo elétrico do Cheetah E-Racing. Mas antes de tudo vale o questionamento, que é temperatura?

Entre todas as grandezas que são medidas pelos sensores de Sistemas Embarcados, umas das mais importantes e versáteis que encontramos é a temperatura. A temperatura, em sua essência, é uma grandeza escalar que determina o grau de agitação das moléculas de um corpo (energia cinética) e, de acordo com essa agitação, podemos dizer se o corpo está quente (agitação maior) ou frio (agitação menor).

Porém, como conseguimos exatamente medir a temperatura? Bom, quando temos um corpo quente, as moléculas estão mais agitadas e tendem a se afastar cada vez mais umas das outras, com isso conseguimos perceber um comportamento chamado de dilatação térmica. O comportamento inverso, quando um corpo é resfriado, é chamado de contração térmica. E com isso conseguimos entender a forma mais simples de se medir a temperatura, onde pegamos as dilatações e contrações térmicas de um certo material e, através dessas informações, é possível construir uma escala termométrica.

Um dos sensores de temperatura que mais está presente no cotidiano das pessoas é o termômetro, todo mundo com certeza já precisou usar para aferir a sua própria temperatura ou de outra pessoa. Ou até mesmo vemos constantemente nos celulares, notícias ou jornais informações da temperatura que está fazendo em um respectivo dia.

Tipos de sensor de temperatura

Os sensores de temperaturas são dispositivos de medição que detectam a temperatura a partir de uma mudança em outra caraterística física, como radiação térmica, resistência elétrica ou campo eletromagnético. Dos possíveis tipos de sensores temos:

  • Termopares;
  • Detectores de temperatura de resistência (RTDs);
  • Termistores;
  • Bimetálicos;
  • Infravermelho.

Termopares

Um termopar é um par de fios metálicos, com propriedades distintas, que são acoplados em uma extremidade. Então, é gerada uma diferença de tensão termoelétrica entre as pontas e isso vai ser responsável por indicar a diferença de temperatura que existe entre ambas as partes (efeito Seedbeck). São mais utilizados em aplicações industriais, automotiva e, às vezes, de consumo.

Vantagens: Precisão, sensibilidade, ampla faixa de operação.
Desvantagens: Corrosão, falhas quando usado por muito tempo, necessidade de duas temperaturas distintas.

RTDs

Os RTDs são caracterizados por serem um enrolamento de fios feitos normalmente de platina, cobre ou níquel. A medição é feita pois se a temperatura muda, a resistência de qualquer metal muda, e assim é possível calcular a temperatura desejada. Tem um formato de mola e quando é aquecido, apresenta variações na temperatura ambiente. O PT100 é um exemplo desse tipo de sensor.

Vantagens: Resposta linear, estabilidade, precisão, calibração fácil.
Desvantagens: Autoaquecimento, mais caro que termopares ou termistores, faixa de operação menor.

Termistores

Esse tipo de sensor é caracterizado como um dispositivo semicondutor, que significa equivalência entre os limites da resistência elétrica e da temperatura. Podemos dividi-los em termistores NTC e termistores PTC.
Os NTC (Coeficiente de Temperatura Negativo) têm sua resistência diminuída conforme o aumento da temperatura. A média da sua faixa ideal de operação é entre -50°C a 300°C e são feitos geralmente de cerâmica ou polímeros.

Os PTC (Coeficiente de Temperatura Positivo) têm sua resistência aumentada conforme o aumento da temperatura. Geralmente são feitos de materiais cerâmicos policristalinos e tem sua faixa de operação média entre -100°C a 300°C

Vantagens: Altíssimo coeficiente de sensibilidade, tamanho menor, custo menor, precisão, durabilidade.
Desvantagens: Curva de temperatura não linear, difícil uso a temperaturas extremas.

Bimetálicos

Esses sensores consistem em dois metais com coeficientes de expansão linear muito diferentes, por exemplo: ferro e latão, níquel e ferro, que se aproveitam da expansão dos metais quando aquecidos. Os metais são ligados juntos a um ponteiro, e quando aquecido, um lado da tira bimetálica se expandirá mais que o outro, assim, conseguimos observar a variação da temperatura.

Vantagens: Baixo custo, simples manuseio, robusto.
Desvantagens: Limitado a certas aplicações pelo seu tamanho, não recomendado para leituras remotas e transientes.

Infravermelhos

São sensores que não necessitam necessariamente de contato, ele vai medir os raios infravermelhos que são irradiados por objetos. São utilizados para detecção de temperatura e movimento. Uma lente consegue direcionar a energia infravermelha em um receptor que converte essa energia em um sinal elétrico.
Vantagens: Não precisa de contato, pontaria a laser e facilidade de uso.
Desvantagens: Custo elevado, necessidade de energia elétrica para medição.

Como usamos o sensor de temperatura no carro?

Para o nosso carro, possuímos alguns usos de sensores de temperatura de suma importância, por exemplo, os termistores, um semicondutor sensível à temperatura, que vão ser encarregados de medir a temperatura nas células. Todos os dados monitorados relacionados a temperatura estão na tabela a seguir:

Nome Dado Coletado Subequipe Principal
Sensor de temperatura infravermelho Temperatura do centro do disco de freio frontal direito Freios
Sensor de temperatura infravermelho Temperatura da borda do disco de freio frontal direito Freios
Sensor de temperatura infravermelho Temperatura do centro do disco de freio frontal esquerdo Freios
Sensor de temperatura infravermelho Temperatura da borda do disco de freio frontal esquerdo Freios
Sensor de temperatura infravermelho Temperatura do centro do disco de freio traseiro direito Freios
Sensor de temperatura infravermelho Temperatura da borda do disco de freio traseiro direito Freios
Sensor de temperatura infravermelho Temperatura do centro do disco de freio traseiro esquerdo Freios
Sensor de temperatura infravermelho Temperatura da borda do disco de freio traseiro esquerdo Freios
Temperatura (IMU) Temperatura da placa de telemetria traseira Telemetria
Temperatura alta (BMS) Temperatura da célula mais quente Powertrain
Temperatura baixa (BMS) Temperatura da célula mais fria Powertrain
Temperatura média (BMS) Temperatura média das células  Powertrain
Temperatura interna (BMS) Temperatura interna do BMS Powertrain
Temperatura (Inversor) Temperatura do MOSFET (P0030) Powertrain
Temperatura (Inversor) Temperatura do MOSFET  2 (P0033) Powertrain
Temperatura (Inversor) Temperatura do ar interno (P0034) Powertrain

Esses dados da tabela são os dados que vão ser monitorados constantemente pelo sistema de Telemetria, porém, também é possível fazer esses testes em bancada, sem a necessidade de se ter o carro completo e rodando.

Os dados coletados para Freios são importantíssimos para informarmos sobre a temperatura dos quatro discos de freios presentes no nosso carro, tanto na borda como no centro, para a subequipe de Freios verificar se a teoria em torno do projeto deles está batendo com o que estamos vendo na prática ou não.

Visualização da temperatura de freios no supervisório para equipe técnica
Visualização da temperatura de freios no supervisório para equipe técnica

O restante dos dados aferidos, tirando a temperatura da placa de telemetria traseira que é coletado pelo IMU (Inertial Measurement Unit) sensor, temos informações essenciais para a subequipe de Powertrain. O monitoramento das células que é feito tanto pelo BMS (Battery Management System) como pelos termistores, são obrigatórios devido a uma regra do regulamento da FSAE, por isso coletamos a temperatura mais alta, mais baixa e a média das células de lítio, além da temperatura interna do BMS. Além de conseguirmos coletar também diretamente do inversor, a temperatura dos dois MOSFETs e do ar interno.

Visualização da temperatura do sistema de Powertrain no supervisório para equipe técnica
Visualização da temperatura do sistema de Powertrain no supervisório para equipe técnica

Essas informações são levadas para o nosso supervisório através das placas eletrônicas e comunicação via wi-fi, e então conseguimos ter uma noção visual tanto para o piloto quanto para a equipe de testes.

Visualização de dados importantes resumidos no supervisório para o piloto
Visualização de dados importantes resumidos no supervisório para o piloto

Como usar um sensor de temperatura com Arduino

Vamos mostrar para vocês um exemplo de teste funcional com um sensor de temperatura com Arduino (DS18B20) utilizando um Arduino. Escolhemos este modelo pois se destaca por sua facilidade de conexão, fácil utilização e sua alta precisão. Vamos utilizar o One Wire como protocolo de comunicação, e com isso, podemos usar mais de um mesmo sensor no mesmo barramento, o que traz mais recursos ao nosso projeto e economiza pinos no Arduino. O DS18B20 é um sensor de temperatura da Dallas/Maxim, ele trabalha com um pino digital bidirecional e dois pinos de alimentação (VCC e GND), possui uma função de alarme programável e sua faixa de operação é entre -55°C a 125°C com uma precisão de ±0,5°C. Sua alimentação precisa estar entre 3,3V a 5V e seu consumo gira em torno de 1mA.

Pinagem Sensor de temperatura DS18B20
Pinagem DS18B20
Arduino Uno
Arduino Uno

Componentes necessários

Montagem física

Utilizaremos um Arduino Uno como microcontrolador neste projeto, e para começarmos as conexões podemos conectar o VCC do sensor no pino de alimentação 5V do Arduino e o GND do sensor no GND do Arduino. Depois, é preciso ligar o sinal do sensor de temperatura no Arduino em algum dos pinos digitais, no nosso exemplo foi escolhido o pino 4, e também temos que colocar um resistor de 4.7K entre o sinal e o pino de alimentação, para manter a transferência de dados estável.

Esquemático sensor de temperatura com arduino
Esquemático do projeto com o sensor de temperatura com Arduino (DS18B20)

Programação

Para darmos início à programação do código, vamos precisar usar duas bibliotecas que terão que ser baixadas, que são: OneWire.h e DallasTemperature.h. Essas bibliotecas podem ser baixadas na própria IDE do Arduino acessando em Sketch –> Incluir Biblioteca –> Gerenciador Bibliotecas…, depois pesquise pelos nomes das bibliotecas desejadas.

Local onde podemos baixar as bibliotecas
Local onde podemos baixar as bibliotecas

Depois vamos abrir o exemplo de teste que vem disponível na biblioteca DallasTemperature, para isso vamos em Arquivo –> Exemplos –> DallasTemperature > Tester.

O código será igual ao abaixo

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9 // Lower resolution

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		Serial.print("Found device ");
		Serial.print(i, DEC);
		Serial.print(" with address: ");
		printAddress(tempDeviceAddress);
		Serial.println();
		
		Serial.print("Setting resolution to ");
		Serial.println(TEMPERATURE_PRECISION, DEC);
		
		// set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
		sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
		
		Serial.print("Resolution actually set to: ");
		Serial.print(sensors.getResolution(tempDeviceAddress), DEC); 
		Serial.println();
	}else{
		Serial.print("Found ghost device at ");
		Serial.print(i, DEC);
		Serial.print(" but could not detect address. Check power and cabling");
	}
  }

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  if(tempC == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		// Output the device ID
		Serial.print("Temperature for device: ");
		Serial.println(i,DEC);
		
		// It responds almost immediately. Let's print out the data
		printTemperature(tempDeviceAddress); // Use a simple function to print out the data
	} 
	//else ghost device! Check your power requirements and cabling
	
  }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

O exemplo do código a seguir é um exemplo resumido do código de testes que funciona com a nossa montagem apresentada.

// Projeto de medição de temperatura do sensor DS18B20

// Bibliotecas necessárias
#include <OneWire.h>
#include <DallasTemperature.h>

// Definição de qual porta do Arduino está conectado no pino de dados do sensor 
#define porta 4

// Defini a porta com o protocolo OneWire
OneWire oneWire (porta);

// Passa referências OneWire para o sensor. 
DallasTemperature sensors (&oneWire);

// Laço de configuração
void setup(void)
{
  // Inicia porta serial
  Serial.begin(9600); // Definição de Baudrate de 9600
  Serial.println("Teste de funcionamento do sensor"); 
  sensors.begin(); // Inicia biblioteca.
}
// Laço de repetição
void loop(void)
{
  Serial.print("Solicitando temperatura...");
  sensors.requestTemperatures (); // Envia o comando para ler a temperatura Serial.println("Pronto");
  Serial.print ("Temperatura: ");
  Serial.print(sensors.getTempCByIndex(0)); // Endereço do sensor
}

Gostou? Siga o Cheetah E-Racing nas redes sociais e fique ligado para nossos novos posts! Até a próxima!

Faça seu comentário

Acesse sua conta e participe