

Nos últimos anos, a automação passou a fazer parte de condomínios, hospitais, universidades, indústrias e até mesmo residências de alto padrão. A integração entre sensores, controladores e sistemas supervisórios tornou possível monitorar diversos equipamentos em tempo real, aumentando a eficiência energética, reduzindo custos operacionais e facilitando a manutenção preventiva.
Entretanto, para que equipamentos de fabricantes diferentes possam compartilhar informações em uma mesma rede, é necessário utilizar protocolos de comunicação padronizados. Entre esses protocolos, um dos mais importantes é o BACnet (Building Automation and Control Network), desenvolvido especificamente para sistemas de automação.
Diferentemente de protocolos proprietários, o BACnet foi projetado para permitir que dispositivos de diferentes fabricantes se comuniquem de forma transparente. Assim, um controlador de climatização pode trocar informações com um sistema de iluminação, enquanto sensores de temperatura, medidores de energia e sistemas de detecção de incêndio podem ser monitorados por uma única plataforma supervisória.
Embora o BACnet possa operar sobre diferentes meios físicos, uma das implementações mais difundidas é o BACnet MS/TP (Master-Slave/Token-Passing). Esse padrão utiliza a interface serial RS-485, conhecida por sua robustez, baixo custo de implementação e capacidade de comunicação em longas distâncias, características que a tornam ideal para instalações distribuídas em edifícios.
Com a popularização do ESP32, tornou-se possível desenvolver dispositivos BACnet de baixo custo capazes de integrar sensores e atuadores a redes de automação existentes. Equipado com elevado poder de processamento, diversas interfaces de comunicação e ampla disponibilidade de bibliotecas, o ESP32 é uma excelente plataforma para aplicações de automação.
Neste artigo, aprenderemos como utilizar a biblioteca BACnetLight para transformar um ESP32 em um dispositivo BACnet MS/TP. Para isso, utilizaremos um transceptor RS-485 conectado ao microcontrolador, permitindo sua comunicação com um computador por meio de um adaptador USB-RS485 e de um software cliente compatível com o protocolo BACnet.
Ao final do projeto, o ESP32 será capaz de responder às mensagens da rede BACnet, disponibilizando objetos que poderão ser monitorados por um sistema supervisório, servindo como base para aplicações envolvendo sensores ambientais, monitoramento de energia, controle de iluminação e diversas outras soluções de automação.O BACnet é um protocolo de comunicação criado especificamente para sistemas de automação e controle de edifícios. Seu desenvolvimento foi coordenado pela ASHRAE (American Society of Heating, Refrigerating and Air-Conditioning Engineers) e posteriormente padronizado pela norma ANSI/ASHRAE 135, além de ser reconhecido internacionalmente pela norma ISO 16484-5. Seu principal objetivo é fornecer uma linguagem comum para equipamentos de automação, permitindo que dispositivos de fabricantes diferentes possam trabalhar juntos sem a necessidade de conversores ou gateways proprietários.
Na prática, isso significa que equipamentos responsáveis pelo controle de diferentes sistemas podem compartilhar informações entre si, independentemente do fabricante. Entre as aplicações mais comuns estão:
Essa interoperabilidade é um dos principais motivos pelos quais o BACnet se tornou um dos protocolos mais utilizados na automação industrial e predial moderna.
Outro diferencial importante é que o protocolo não define apenas como os dados são transmitidos, mas também como os dispositivos são organizados. Em vez de simplesmente enviar registradores ou endereços de memória, como acontece em outros protocolos industriais, o BACnet organiza as informações em objetos, cada um contendo diversas propriedades que descrevem seu funcionamento.
Essa abordagem torna a comunicação muito mais intuitiva, permitindo que um supervisório identifique automaticamente quais informações estão disponíveis em determinado equipamento.
Ao longo dos anos, o protocolo BACnet passou a suportar diferentes meios físicos de comunicação. Entre eles podemos citar:
Entre todas essas opções, as mais usadas são o BACnet/IP e o BACnet MS/TP tornando eles os mais populares.
O RS-485 é um padrão elétrico amplamente empregado em aplicações industriais devido à sua imunidade a ruídos, capacidade de operar em longas distâncias e possibilidade de conectar diversos dispositivos em um mesmo barramento. Essas características tornam o BACnet MS/TP especialmente adequado para edifícios comerciais, onde diversos controladores precisam compartilhar uma única rede de comunicação. Ao contrário do BACnet/IP, que utiliza pacotes UDP em redes Ethernet, o BACnet MS/TP transmite seus dados diretamente pela interface serial RS-485. Nesse tipo de rede, todos os dispositivos compartilham o mesmo barramento físico. Para evitar colisões entre transmissões, o protocolo utiliza um mecanismo conhecido como Token Passing.
O Token Passing é um método de controle de acesso ao meio de comunicação utilizado pelo BACnet MS/TP. Em vez de permitir que qualquer equipamento transmita dados a qualquer momento, apenas o dispositivo que possui o chamado token recebe autorização para utilizar o barramento. Quando esse dispositivo termina sua transmissão, ele entrega o token ao próximo equipamento da rede, seguindo uma sequência previamente estabelecida. Esse mecanismo elimina praticamente todas as colisões de comunicação, tornando a rede extremamente previsível e confiável.
O processo pode ser resumido da seguinte forma:

Como apenas um equipamento transmite por vez, o barramento permanece organizado mesmo quando dezenas de controladores compartilham a mesma rede RS-485. Essa previsibilidade é um dos principais motivos pelos quais o BACnet MS/TP continua sendo amplamente utilizado em sistemas críticos de automação.
Para que o ESP32 participe de uma rede BACnet MS/TP, é necessário adicionar um transceptor RS-485. Esse componente converte os níveis de tensão da interface UART do microcontrolador para o padrão diferencial utilizado pelo barramento RS-485.
Entre os circuitos integrados mais utilizados estão:
Esses dispositivos possuem baixo custo, são facilmente encontrados no mercado e permitem implementar redes contendo diversos equipamentos conectados simultaneamente.
Uma instalação típica utiliza apenas um par de fios para comunicação diferencial, identificado pelos terminais A e B, além do terra de referência quando necessário. Dependendo da extensão do cabeamento, recomenda-se também utilizar resistores de terminação nas extremidades do barramento para minimizar reflexões e melhorar a integridade do sinal.
Assim como ocorre no BACnet/IP, os dispositivos BACnet MS/TP organizam suas informações em objetos padronizados. Cada objeto representa uma informação específica do equipamento e possui diversas propriedades associadas.
Entre os objetos mais utilizados estão:
| Objeto | Aplicação |
|---|---|
| Device | Responsável por representar o próprio equipamento dentro da rede BACnet. |
| Analog Input | Entrada analógica, como sensores. Esse valor pode representar a leitura de um sensor de temperatura, umidade, corrente elétrica, tensão, luminosidade ou qualquer outra grandeza física |
| Analog Output | Saída analógica |
| Analog Value | Variável analógica |
| Binary Input | Entrada digital |
| Binary Output | Saída digital |
| Binary Value | Variável digital. Destinado ao armazenamento de estados lógicos, como o acionamento de um relé, a condição de um alarme ou o estado de uma entrada digital |
Por exemplo, um sensor de temperatura conectado ao ESP32 pode ser representado por um objeto Analog Input, enquanto um relé pode ser disponibilizado como um Binary Output. Essa organização facilita a integração com sistemas supervisórios, que conseguem identificar automaticamente os recursos disponíveis em cada equipamento sem depender de documentação específica do fabricante.
Implementar o protocolo BACnet MS/TP diretamente a partir das especificações oficiais exige um conhecimento aprofundado sobre comunicação serial, gerenciamento de quadros, sincronização da rede e tratamento dos serviços definidos pela norma. Para simplificar esse processo, utilizaremos a biblioteca BACnetLight, que fornece uma implementação leve das principais funcionalidades do protocolo, permitindo concentrar o desenvolvimento na aplicação propriamente dita.
A biblioteca disponibiliza recursos para criação do dispositivo BACnet, cadastro de objetos, atualização de propriedades e resposta às requisições enviadas pelos demais equipamentos da rede. Combinada ao ESP32 e a um transceptor RS-485, ela permite desenvolver dispositivos BACnet MS/TP capazes de integrar sensores, atuadores e sistemas de controle a uma infraestrutura de automação existente.
Acesso o projeto no Github faça o download e instale no seu projeto.
Para desenvolver o projeto apresentado neste artigo serão utilizados poucos componentes, todos facilmente encontrados na loja da Eletrogate.
Os materiais necessários são:
Como o BACnet MS/TP utiliza o barramento RS-485, o ESP32 precisa de um transceptor responsável pela conversão dos níveis elétricos da interface UART para o padrão diferencial utilizado pela rede. Um dos circuitos integrados mais utilizados para essa finalidade é o MAX485, embora também possam ser empregados dispositivos compatíveis, como o MAX3485 ou o SN75176.
A montagem do circuito é bastante simples. Os pinos de alimentação do módulo devem ser conectados normalmente ao ESP32, enquanto os sinais TX e RX da UART são ligados às entradas DI e RO do conversor RS-485. Os pinos RE (Receiver Enable) e DE (Driver Enable) normalmente são interligados e controlados por uma única saída digital do ESP32, responsável por alternar automaticamente entre os modos de transmissão e recepção.
Por fim, os terminais A e B do módulo devem ser conectados ao barramento RS-485, juntamente com o adaptador USB-RS485 utilizado pelo computador durante os testes. Em redes maiores. Como o BACnet MS/TP opera diretamente sobre uma interface serial, todos os dispositivos da rede devem utilizar a mesma configuração de comunicação. Entre as velocidades mais comuns estão 9600, 19200, 38400, 76800 e 115200 bps. Além disso, cada equipamento deve possuir um endereço Master Address exclusivo, evitando conflitos durante o processo de passagem do token (Token Passing).
| ESP32 | MAX485 |
|---|---|
| TX (GPIO17) | DI |
| RX (GPIO16) | RO |
| GPIO4 | RE + DE |
| GND | GND |
| 3V3 | VCC |
| ESP32 | Ligações |
|---|---|
| GPIO21 | LED |
| GPIO23 | BOTÃO |
| GPIO5 | Sensor de Temperatura |
| GND | GND |
| 3V3 ou 5V* | VCC |

Após a inicialização, o ESP32 configura a interface UART utilizada pelo módulo RS-485 e inicializa a biblioteca BACnetLight, responsável pela implementação do protocolo BACnet MS/TP. Em seguida, o dispositivo registra os objetos BACnet que serão disponibilizados ao restante da rede, como entradas analógicas, saídas digitais ou variáveis internas.
Durante a execução do programa, o ESP32 permanece atualizando continuamente os valores desses objetos e processando as mensagens recebidas pelo barramento RS-485. Sempre que um cliente BACnet solicitar a leitura de uma propriedade, a biblioteca responde automaticamente utilizando o valor mais recente da variável correspondente. Da mesma forma, objetos configurados para escrita podem receber comandos enviados pelo sistema supervisório, permitindo o acionamento remoto de relés, atuadores e outros dispositivos conectados ao microcontrolador.
De forma simplificada, o fluxo de funcionamento da aplicação pode ser representado na figura abaixo.
/* * @author Saulo Aislan ([email protected]) * @version 0.1 * @date 2026-07-17 * * @copyright Copyright (c) 2026 * * ESP32 + BACnet MS/TP * * AI0 -> Temperatura (DS18B20) * BO0 -> Controle de um LED */ #include <BACnetLight.h> #include <OneWire.h> #include <DallasTemperature.h> /*===================================================== Configuração da comunicação RS-485 =====================================================*/ #define RS485_RX 16 // Pino RX da UART2 #define RS485_TX 17 // Pino TX da UART2 (RO - Modulo RS-485) #define RS485_DE 4 // Controle de direção do transceptor RS-485 #define MSTP_MAC 10 // Endereço MAC do dispositivo na rede BACnet MS/TP #define MSTP_BAUD 38400 // Velocidade de comunicação da rede BACnetMSTP bacnet; /*===================================================== Configuração do sensor DS18B20 =====================================================*/ #define ONE_WIRE_BUS 5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); /*===================================================== Configuração do LED =====================================================*/ #define LED_PIN 21 /*===================================================== Configuração do botão =====================================================*/ #define BUTTON_PIN 23 /*===================================================== Inicialização =====================================================*/ void setup() { // Inicializa a porta serial para depuração Serial.begin(115200); // Configura o LED como saída pinMode(LED_PIN, OUTPUT); // Configura o botão como entrada com pull-up interno pinMode(BUTTON_PIN, INPUT_PULLUP); digitalWrite(LED_PIN, LOW); // Inicializa o sensor DS18B20 sensors.begin(); // Configura a UART utilizada pelo barramento RS-485 Serial2.begin( MSTP_BAUD, SERIAL_8N1, RS485_RX, RS485_TX ); // Informações do dispositivo BACnet bacnet.setDeviceInfo( "BACnetLight", 0, "ESP32-MSTP", "1.0", "1.0" ); // Inicializa a comunicação BACnet MS/TP bacnet.beginMSTP( 3000, // Device Instance "ESP32-MSTP", // Nome do dispositivo Serial2, RS485_DE, MSTP_MAC, MSTP_BAUD ); /*---------------------------------------------- Cadastro dos objetos BACnet ----------------------------------------------*/ // AI0 - Temperatura medida pelo sensor bacnet.addAnalogInput( 0, "Temperatura", 0, BACNET_UNITS_DEGREES_CELSIUS, "Sensor DS18B20" ); // BI0 - Estado do botão bacnet.addBinaryInput( 0, "Botao", false, "Botão da placa" ); // BO0 - Controle do LED bacnet.addBinaryOutput( 0, "LED", false, "LED da placa" ); Serial.println("Dispositivo BACnet iniciado."); } /*===================================================== Programa principal =====================================================*/ void loop() { // Processa continuamente as mensagens BACnet bacnet.loop(); static uint32_t ultimoLeitura = 0; // Atualiza os valores a cada segundo if (millis() - ultimoLeitura >= 1000) { ultimoLeitura = millis(); /*------------------------------------------ Leitura da temperatura ------------------------------------------*/ sensors.requestTemperatures(); float temperatura = sensors.getTempCByIndex(0); // Atualiza o objeto Analog Input (AI0) bacnet.setValue( BACNET_OBJ_ANALOG_INPUT, 0, temperatura ); /*------------------------------------------ Leitura do botão ------------------------------------------*/ // INPUT_PULLUP: // LOW -> botão solto // HIGH -> botão pressionado bool botao = digitalRead(BUTTON_PIN); // Atualiza o objeto Binary Input (BI0) bacnet.setValue( BACNET_OBJ_BINARY_INPUT, 0, botao ); /*------------------------------------------ Controle do LED ------------------------------------------*/ // Lê o estado do objeto Binary Output (BO0) bool led = bacnet.getValue( BACNET_OBJ_BINARY_OUTPUT, 0 ); // Atualiza o LED físico da placa digitalWrite(LED_PIN, led); /*------------------------------------------ Monitor Serial ------------------------------------------*/ Serial.print("Temperatura: "); Serial.print(temperatura); Serial.print(" °C"); Serial.print(" | Botão: "); Serial.print(botao ? "Pressionado" : "Solto"); Serial.print(" | LED: "); Serial.println(led ? "Ligado" : "Desligado"); } }
Para verificar a comunicação entre o computador e o ESP32, utilizaremos o YABE (Yet Another BACnet Explorer), um software gratuito bastante conhecido entre desenvolvedores e integradores de sistemas de automação.
O YABE é uma ferramenta de diagnóstico e testes para dispositivos BACnet, permitindo descobrir equipamentos presentes na rede, visualizar os objetos disponíveis, ler propriedades e enviar comandos para dispositivos compatíveis com o protocolo. Graças à sua interface intuitiva, ele é amplamente utilizado durante o desenvolvimento e a validação de aplicações BACnet/IP e BACnet MS/TP.
Neste projeto, o YABE será utilizado para se comunicar com o ESP32 através da rede BACnet MS/TP. Após configurar a porta serial correspondente ao adaptador USB-RS485 e definir a mesma taxa de comunicação utilizada pelo microcontrolador, o software será capaz de localizar automaticamente o dispositivo BACnet.
Depois que o ESP32 for descoberto, será possível visualizar os objetos cadastrados pela aplicação, como a temperatura medida pelo sensor (Analog Input), o estado do botão (Binary Input) e o controle do LED (Binary Output). Além disso, o YABE permite alterar o valor do objeto Binary Output, possibilitando ligar ou desligar o LED diretamente pela interface do software, veja o vídeo a seguir.
Apesar de o exemplo apresentado ter finalidade didática, a mesma estrutura pode ser utilizada em projetos profissionais de automação industrial e predial.Entre as aplicações possíveis destacam-se:
O BACnet MS/TP continua sendo uma das tecnologias mais utilizadas em sistemas de automação industrial e predial graças à sua robustez, simplicidade de instalação e excelente desempenho em redes baseadas em RS-485. Mesmo com o crescimento do BACnet/IP, inúmeras instalações comerciais e industriais ainda utilizam essa arquitetura devido à confiabilidade e ao baixo custo de implementação, para mais informações sobre o BACnet acesse o site oficial: https://bacnetinternational.org.
Neste artigo, vimos que o ESP32, aliado à biblioteca BACnetLight e a um transceptor RS-485, pode ser utilizado para desenvolver dispositivos compatíveis com BACnet MS/TP de maneira relativamente simples. Além de disponibilizar informações provenientes de sensores e atuadores, o microcontrolador pode ser integrado a sistemas supervisórios já existentes, ampliando as possibilidades de monitoramento e controle em edifícios inteligentes.
Com pequenas adaptações, o projeto pode evoluir para aplicações mais complexas, incorporando múltiplos objetos BACnet, novos sensores, módulos de acionamento e integração com outros protocolos industriais. Isso torna o ESP32 uma plataforma extremamente versátil para estudos, prototipagem e desenvolvimento de soluções de automação baseadas em padrões abertos.
Para mais materiais como esse, continue acompanhando as postagens semanais do blog e não deixe de visitar nossa loja. Lá você encontra todos os componentes necessários para desenvolver esse e muitos outros projetos!
Que a força esteja com você! Até mais!
|
ESP32 e BACnet/IP: Como Criar um Dispositivo BACnet Utilizando a Biblioteca BACnetLight.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200