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.
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.
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.
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.
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.
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.
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!