Em diversos setores industriais, que vão desde a produção de alimentos até a fabricação de eletrônicos, manter condições precisas de temperatura e umidade é crucial. Nesse contexto, o sensor de temperatura e umidade XY-MD02 emerge como uma solução avançada, proporcionando precisão e confiabilidade incomparáveis na monitorização desses parâmetros.
O sensor XY-MD02 destaca-se como um equipamento industrial de alta versatilidade, integrando-se facilmente a uma ampla gama de máquinas. Neste blog, aprenderemos como utilizar o sensor de temperatura e umidade, XY-MD02, com ESP32, fazendo uso do PLC 32.
Sumário
Conhecendo o sensor XY-MD02
Como utilizar o sensor XY-MD02 com ESP32
1. Conhecendo o sensor XY-MD02
O sensor XY-MD02 incorpora internamente o sensor de temperatura e umidade SHT20, reconhecido no setor de desenvolvimento pela sua qualidade e confiabilidade dos dados fornecidos durante a operação. Este dispositivo é recomendado para uma ampla variedade de aplicações, incluindo estufas, estações meteorológicas, armazéns, laboratórios, hospitais, fábricas, entre outros.
Um destaque significativo do sensor XY-MD02 é sua habilidade de comunicação através do protocolo RS485, seguindo as normas do padrão industrial Modbus. Para uma compreensão mais detalhada, é possível visualizar as características visuais do XY-MD02 na figura a seguir.
Adicionalmente, o sensor XY-MD02 é apresentado em um case plástico de excelente qualidade, especialmente projetado para fixação direta em trilhos DIN. Além disso, dispõe de bornes destinados à fixação segura dos cabos de alimentação e de dados. Na figura a seguir, é possível observar a pinagem do sensor e suas dimensões.
Como mencionado anteriormente, a comunicação com o XY-MD02 é realizada por meio de RS485, utilizando o protocolo industrial MODBUS. Agora, vamos explorar alguns detalhes desse processo. 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 sensor XY-MD02, 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. O campo “endereço” refere-se ao valor que identifica o dispositivo na rede, permitindo a conexão de vários dispositivos em um único barramento de dados. Assim, cada equipamento na rede (o mesmo se aplica a outros além do sensor XY-MD02) possui um endereço único, sendo o endereço padrão do XY-MD02 configurado como 0x01.
O campo “função” determina a ação a ser executada pela mensagem, podendo envolver uma alteração nas configurações do sensor ou uma leitura de temperatura, umidade ou outras configurações relevantes. Na tabela abaixo, apresentamos as funções que podem ser executadas.
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. Na tabela abaixo, apresentamos os endereços e os conteúdos dos registradores do XY-MD02.
Por fim, o “CRC Check” é um código de segurança que assegura a correta recepção da mensagem no destino. Ele é calculado com base na mensagem e enviado junto a ela. O receptor utiliza esse código para verificar a integridade dos dados transmitidos. Para obter mais informações sobre o cálculo do CRC, recomendamos consultar este site.
A seguir podemos ver um exemplo (retirado do manual do XY-MD02) de uma mensagem enviada para o sensor e a resposta dele.
Aqui, observamos que o sensor está configurado com o endereço 0x01, e foi solicitada a execução da função 0x04 (Leitura dos sensores). A leitura é realizada no endereço 0x0001 do sensor, correspondente à temperatura. Em seguida, é enviado o número de registradores lidos, neste caso, apenas 1. O CRC correspondente à mensagem também é incluído.
Como resposta do sensor XY-MD02, recebemos seu endereço (0x01) e o código da função solicitada (0x04). O sensor informa o número de bytes na mensagem, que é 0x02. Posteriormente, são fornecidos dois bytes representando a temperatura: 0x01 e 0x31. Ao combiná-los, obtemos o valor hexadecimal 0x0131, equivalente a 305 em decimal. Para obter a temperatura final, é necessário dividir esse valor por 10, resultando em 30,5ºC.
Para mais exemplos e detalhes sobre a comunicação com o sensor XY-MD02, recomendamos consultar o manual do sensor.
2. Como utilizar o sensor XY-MD02 com ESP32
Agora que estamos mais familiarizados com o sensor XY-MD02, podemos iniciar o estudo sobre como realizar a leitura dele utilizando um ESP32. 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.
Como exemplo, desenvolvemos um código que permite ao ESP32 enviar a temperatura e umidade fornecidas pelo XY-MD02 para o terminal serial. O código completo pode ser visualizado a seguir:
#include <ModbusMaster.h>
#define MAX485_DIR 2
#define SSERIAL_RX_PIN 17
#define SSERIAL_TX_PIN 16
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.readInputRegisters(0x0001, 2);
Serial.println("Realizando leitura");
if (result == node.ku8MBSuccess) {
Serial.print("Temperatura: ");
Serial.print(float(node.getResponseBuffer(0) / 10.00F));
Serial.print(" Umidade: ");
Serial.println(float(node.getResponseBuffer(1) / 10.00F));
}
delay(1000);
}
Para implementar o protocolo MODBUS, fizemos uso da biblioteca “ModbusMaster”. Essa biblioteca facilita a implementação de todas as especificidades do protocolo, incluindo os cálculos do CRC. Para utilizá-la, é necessário primeiro criar um objeto da classe “ModbusMaster” para cada componente ou equipamento na rede. No nosso exemplo, criamos o objeto 'node' para a comunicação com o sensor.
ModbusMaster node;
Agora precisamos definir como será feita a comunicação com esse objeto. Como já mencionado, vamos utilizar o Serial 2. Para iniciar a comunicação utilizou-se o código a seguir:
Serial2.begin(9600);
Como vamos utilizar o RS485, é necessário definir o pino de direção da comunicação, definimos ele como saída. Como mostrado a seguir.
pinMode(MAX485_DIR, OUTPUT);digitalWrite(MAX485_DIR, 0);
Além disso, precisamos criar uma função para transmitir (definir pino 2 como nível alto) e receber (definir pino 2 como baixo). Elas podem ser vistas a seguir.
void preTransmission() {
digitalWrite(MAX485_DIR, 1);
}
void postTransmission() {
digitalWrite(MAX485_DIR, 0);
}
Após a preparação de todos esses passos, é necessário iniciar a comunicação com o objeto “node”. Para isso, utilizamos o método “begin”, no qual informamos o endereço do dispositivo e o meio de comunicação utilizado. Como mostrado a seguir, o endereço do dispositivo é 1, e optamos por utilizar a Serial2.
node.begin(1, Serial2);
Depois precisamos informar para o objeto “node” qual serão as funções executadas antes e depois da comunicação. No caso, as funções para enviar e receber.
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
Agora é possível estabelecer a comunicação entre o ESP32 e o XY-MD02 por meio do protocolo MODBUS. No exemplo, utilizamos a função “readInputRegisters” para a leitura dos registros de entrada 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.
"readCoils" - Utilizada para ler valores de bobinas (coils) em dispositivos Modbus. As bobinas são usadas para armazenar valores de saída binários.
"readHoldingRegisters" - Semelhante a “readInputRegisters”, mas é usada para ler registros de saída (holding registers). Esses registros são frequentemente usados para armazenar valores analógicos ou de controle.
"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" - Utilizada 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 “readInputRegisters”, indicamos ao dispositivo quais registradores serão lidos e a quantidade a ser lida a partir do primeiro. Optamos por ler dois registradores específicos: 0x0001 e 0x0002.
uint8_t result = node.readInputRegisters(0x0001, 2);
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 ler os valores recebidos (registradores 0x0001 e 0x0002), utilizamos a função “getResponseBuffer”. Nela, informamos a posição do vetor a ser lido, sendo 0 para temperatura e 1 para umidade. Se tudo ocorrer como esperado, o resultado obtido no monitor serial deve ser semelhante ao apresentado na figura a seguir.
Neste exemplo, utilizamos as configurações padrão do XY-MD02 e apresentamos um código base para projetos futuros. Para aprender mais sobre o XY-MD02 e o protocolo MODBUS, assista ao vídeo a seguir.
Autor: Thales Ferreira
Comments