Medir a temperatura é uma necessidade em diversas aplicações, desde residenciais, dispositivos móveis, industriais e outros. Os PT100 são excelentes opções de sensores. Os PT100 são sensores de temperatura que contém um resistor que altera o valor da resistência conforme sua temperatura se altera.
Para facilitar a utilização de PT100 em projetos existe o módulo PTA8D08. Este módulo permite ler 8 PT100 utilizando protocolo MODBUS via RS485. Neste blog vamos ver como utilizar o PTA8D08 Para ler um PT100 utilizando ESP32.
Sumário
1. Conhecendo o módulo PTA8D08
O PTA8D08 é um módulo robusto, adequado para aplicações industriais, que permite a leitura de até 8 sensores de temperatura PT100. A comunicação com o módulo é feita via RS485 utilizando o protocolo MODBUS. Na figura a seguir podemos ver o módulo PTA8D08.
O módulo PTA8D08 possui todo o hardware e ferramentas necessárias para realizar a leitura dos sensores. Portanto, quando solicitamos o valor dos sensores, ele consegue entregar diretamente a temperatura medida.
No protocolo MODBUS cada dispositivo deve ter um endereço. Na figura a seguir podemos ver em destaque o conjunto de chaves que é utilizado para definir o endereço do PTA8D08 na rede. Desta forma, definindo endereços diferentes, podemos ligar mais de um módulo PTA8D08 juntos em um mesmo barramento.
Na figura a seguir é possível ver como podemos ligar três sensores de temperatura PT100 no PTA8D08. Em vermelho ligamos os pinos PT+ e em preto GND e PT-.
Na figura a seguir podemos ver a pinagem para alimentação e comunicação com o módulo PTA8D08.
Agora vamos ver como realizar a comunicação com o módulo PTA8D08 por meio de RS485, utilizando o protocolo industrial MODBUS. Para a comunicação via RS485, é essencial empregar o hardware apropriado, incluindo o MAX485. Neste blog, optamos pelo uso do PLC 32, uma de nossas placas projetadas com ESP32 e MAX485. O PLC 32 pode ser visualizado na figura abaixo.
O protocolo MODBUS pode ser implementado por meio de software. O módulo PTA8D08, utiliza o modo RTU (Remote Terminal Unit). Na figura a seguir, apresentamos o formato geral de uma mensagem transmitida nesse modo.
Cada campo da mensagem possui uma finalidade específica. Como exemplo podemos ver o campo “endereço”, que se refere ao valor que identifica o dispositivo na rede.
No momento que este artigo foi escrito, não encontramos nenhum manual que descreva com mais detalhes as funções e os registradores internos dele. Porém, com as informações que encontramos, descobrimos que, para fazer uma leitura dos sensores, devemos utilizar a função 0x03 (Leitura de bloco de registradores do tipo holding).
O campo “dado” representa o valor enviado, variando de acordo com a função executada. Geralmente, é o endereço do registrador a ser lido ou escrito, seguido pela quantidade de valores a serem lidos ou um valor a ser escrito no registrador. Para o PTA8D08 devemos ler o registrador 0x0000 para o sensor 1, 0x0001 para o sensor 2, 0x0002 para o sensor 3 e assim até o 0x0007 para o sensor 8.
No próximo tópico vamos ver com mais detalhes como realizar a comunicação entre ESP32 e o módulo PTA8D08.
2. Como utilizar o módulo PTA8D08 com ESP32
Agora podemos iniciar o estudo sobre como realizar a leitura do PTA8D08 com um ESP32. Para isso, desenvolvemos um código que permite ao ESP32 enviar a temperatura fornecida pelo PTA8D08 para o terminal serial. O código completo pode ser visualizado a seguir:
#include <ModbusMaster.h>
#define MAX485_dir 2
ModbusMaster node;
void preTransmission() {
digitalWrite(MAX485_dir, 1);
}
void postTransmission() {
digitalWrite(MAX485_dir, 0);
}
void setup() {
pinMode(MAX485_dir, OUTPUT);
digitalWrite(MAX485_dir, 0);
Serial.begin(9600);
Serial2.begin(9600);
node.begin(1, Serial2);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop() {
uint8_t result = node.readHoldingRegisters(0x0000, 1);
Serial.println("Data Requested");
if (result == node.ku8MBSuccess) {
Serial.print("Temperatura: ");
Serial.println(float(node.getResponseBuffer(0) / 10.00F));
}
delay(1000);
}
Primeiro vamos conhecer um pouco do hardware utilizado. Como já mencionado, para a elaboração deste exemplo utilizamos o PLC32. Essa placa possui integrado a ela um MAX485, juntamente com um circuito que isola a comunicação entre ele e o ESP32. São utilizados os pinos da Serial 2 do ESP32, pino 17 para RX e 16 para TX e o 2 para definir o sentido da comunicação. Para mais detalhes sobre o PLC 32 recomendamos consultar o manual da placa. Na figura a seguir podemos ver como conectar o sensor ao PLC 32.
Para a implementação do protocolo MODBUS, empregamos a biblioteca "ModbusMaster", que simplifica a incorporação de todas as particularidades do protocolo, incluindo cálculos CRC. Para utilizar esta biblioteca, é necessário criar um objeto da classe "ModbusMaster" para cada componente ou equipamento na rede. No exemplo dado, instanciamos o objeto "node" para a comunicação com o sensor:
ModbusMaster node;
A comunicação com esse objeto se dá utilizando a Serial 2. Ela será inicializada com o seguinte código:
Serial2.begin(9600);
Considerando o uso do RS485, é crucial definir o pino de direção da comunicação como saída. Isso é realizado da seguinte maneira:
pinMode(MAX485_DIR, OUTPUT);
digitalWrite(MAX485_DIR, 0);
Além disso, são necessárias funções para transmissão (definir pino 2 como nível alto) e recepção (definir pino 2 como nível baixo). Elas podem ser visualizadas abaixo:
void preTransmission() {
digitalWrite(MAX485_DIR, 1);
}
void postTransmission() {
digitalWrite(MAX485_DIR, 0);
}
Após a conclusão dessas etapas, é possível iniciar a comunicação com o objeto "node" usando o método "begin", onde informamos o endereço do dispositivo e o meio de comunicação utilizado. No exemplo, o endereço do dispositivo é 1 (definido utilizando as chaves), e optamos por utilizar a Serial2.
node.begin(1, Serial2);
Em seguida, informamos ao objeto "node" as funções que serão executadas antes e depois da comunicação, ou seja, as funções de envio e recebimento.
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
Assim, é estabelecida a comunicação entre o ESP32 e o PTA8D08 por meio do protocolo MODBUS. No exemplo, utilizamos a função "readHoldingRegisters" para a leitura dos registradores do tipo Holding em dispositivos Modbus, ou seja, os valores dos sensores. Além dessa função, a biblioteca oferece outras, dependendo do tipo de operação desejada, como:
readCoils: para ler valores de bobinas (coils) em dispositivos Modbus.
readInputRegisters: semelhante a "readHoldingRegisters", mas para ler registros de entrada.
writeSingleCoil: permite escrever um único valor de bobina (coil) em um dispositivo Modbus.
writeSingleRegister: permite escrever um único valor em um registro Modbus, seja de entrada ou de saída.
writeMultipleCoils: para escrever valores em múltiplas bobinas (coils) em um único pedido.
writeMultipleRegisters: similar a "writeSingleRegister", mas permite escrever valores em múltiplos registros Modbus.
Na função "readHoldingRegisters", indicamos ao dispositivo quais registradores serão lidos e a quantidade a ser lida a partir do primeiro. No exemplo, optamos por ler um registrador específico: 0x0000.
uint8_t result = node.readInputRegisters(0x0000, 1);
Caso a comunicação ocorra corretamente, a variável "result" receberá 0. A função "ku8MBSuccess" sempre retorna 0, sendo utilizada aqui para verificar a integridade dos dados recebidos. Na tabela a seguir, apresentamos outras funções e os códigos de erro correspondentes.
Para recuperar os valores recebidos, empregamos a função "getResponseBuffer". Nesta função, especificamos a posição do vetor a ser lido.
Caso tudo transcorra conforme o esperado, os resultados visualizados no monitor serial devem assemelhar-se à representação ilustrada na figura subsequente.
Neste exemplo, adotamos as configurações padrão do PTA8D08 e disponibilizamos um código-base para projetos futuros. Para aprofundar seus conhecimentos sobre o PTA8D08 e o protocolo MODBUSS, recomendamos assistir ao vídeo a seguir.
Autor: Thales Ferreira
Comments