Introdução
O controle PID (Proporcional, Integral e Derivativo) é amplamente utilizado para ajustar variáveis de sistemas dinâmicos de forma eficiente. Com o avanço da Internet das Coisas (IoT), a aplicação do PID em dispositivos conectados tem permitido um controle mais preciso e otimizado de processos industriais, residenciais e comerciais.
Neste artigo, discutiremos como o controle PID pode ser integrado à IoT, suas aplicações, os desafios enfrentados nessa abordagem e um projeto apresentando essa combinação.
O que é Controle PID?
O PID (Proportional-Integral-Derivative) é um algoritmo de controle que ajusta a saída de um sistema baseado no erro entre o valor desejado (Setpoint – SP) e o valor atual (Process Variable – PV). Ele é composto por três componentes:
1. Proporcional (P): Responde de forma instantânea ao erro.
2. Integral (I): Elimina o erro acumulado ao longo do tempo.
3. Derivativo (D): Previne variações bruscas no sistema.
Com isso, é possível controlar o overshoot (máximo pico antes de estabilizar) e o tempo de acomodação (tempo para estabilizar) do seu sistema, garantindo um maior controle e estabilidade.
Por que utilizar PID em IoT?
A integração do PID com a IoT permite monitoramento remoto e ajustes automáticos em tempo real. Entre as vantagens, destacam-se:
- Controle eficiente: Mantém a estabilidade do sistema mesmo com variações externas.
- Monitoramento em tempo real: Sensores conectados enviam dados continuamente.
- Ajuste dinâmico: Parâmetros podem ser ajustados remotamente via MQTT ou API.
- Redução de custos: Evitar desperdícios ao otimizar a resposta do sistema.
Aplicações de PID na IoT
A combinação de PID com IoT tem inúmeras aplicações, como:
1. Controle de Temperatura e/ou Umidade Inteligente
- Termostatos e sensores de umidade conectados que ajustam essas variáveis com base na previsão do tempo e padrões de uso.
- Indústrias que utilizam fornos PID controlados remotamente via IoT.
2. Sistemas de Irrigação Automatizados
- Monitoramento remoto da umidade do solo e ajuste da irrigação via sensores conectados.
3. Controle de Motores e Atuadores
- Robótica: PID controla motores de precisão em braços robóticos via IoT.
- Drones e veículos autônomos: Correção de trajetória usando PID.
4. Monitoramento e Controle de Energia
- Otimização do consumo energético em sistemas de energia solar e eólica.
Aplicação Prática: Monitoramento e Controle via App Flutter
No projeto desenvolvido, foi criado um aplicativo Flutter para permitir o monitoramento remoto e parametrização dos valores do PID. O sistema possui as seguintes funcionalidades:
- Monitoramento em tempo real: O usuário pode visualizar os dados de umidade e resposta do PID.
- Configuração de parâmetros: Ajuste remoto dos valores de Kp, Ki e Kd.
- Notificações ao usuário: Opções de notificação via app, SMS e ligação.
- Controle físico: Um LED simula um borrifador acionando por PWM e outro LED para simular um exaustor ou cooler para diminuir a umidade rapidamente.
Tecnologias Utilizadas no Projeto
| Tecnologia | Função no Projeto |
| FreeRTOS | Gerenciamento de tarefas em tempo real |
| OTA | Atualização remota do firmware |
| Servidor Local (ESP32) | Configuração de Wi-Fi e MQTT via interface web |
| Watchdog Timer | Prevenção de falhas no ESP32 |
| EEPROM | Armazenamento dos parâmetros do usuário (telefone, opção de notificações, etc.) |
Arquitetura do projeto
Código Essencial do Projeto
Trecho do código responsável pelo envio das variáveis e cálculo dos ganhos:
// Task for PID control
void controlTask(void *pvParameters)
{
while (true)
{
erro = SP - PV;
cv = cv1 + (Kp + (Ki * Tm) + (Kd / Tm)) * erro + (-Kp - (2 * Kd / Tm)) * erro1 + ((Kd / Tm) * erro2);
// Updating Maximum Peak (MP)
if (PV > maxPico)
{
maxPico = PV;
client.publish(maxPeak_topic, String(maxPico).c_str());
}
if (!isSettled && abs(PV - SP) > 2.0)
{
startTime = millis();
isSettled = false;
}
bool coolerOn = (PV > SP);
if (coolerOn != lastHeatState)
{
lastHeatState = coolerOn;
if (coolerOn)
{
client.publish("esp32/cooler", "on");
digitalWrite(coolerPin, HIGH);
}
else
{
client.publish("esp32/cooler", "off");
digitalWrite(coolerPin, LOW);
}
}
// Checking the settling time (TA) (if the system has stabilized within 2% of the setpoint)
if (!isSettled && abs(PV - SP) <= 2.0)
{ // 2% of setpoint
settlingTime = (millis() - startTime) / 1000.0;
client.publish(settlingTime_topic, String(settlingTime).c_str());
isSettled = true; // The system is stabilized
}
float overshoot = (maxPico - SP) / SP * 100.0;
if (overshoot < 0)
overshoot = 0.0;
client.publish(overshoot_topic, String(overshoot).c_str());
// PID tuning using Ziegler-Nichols
if (isSettled)
{
Kp = 0.6 * maxPico;
Ki = (2 * Kp) / max(settlingTime / 1000.0, 1.0);
Kd = (Kp * max(settlingTime / 1000.0, 1.0)) / 8.0;
client.publish(kp_topic, String(Kp).c_str());
client.publish(ki_topic, String(Ki).c_str());
client.publish(kd_topic, String(Kd).c_str());
}
if (!coolerOn)
{
ledcWrite(ledChannel, (int)map(constrain(cv, 0.0, 1023.0), 0, 1023, 0, 1023));
}
else
{
ledcWrite(ledChannel, 0);
}
cv1 = cv;
erro2 = erro1;
erro1 = erro;
checkThresholdViolation(); // alert user
vTaskDelay(pdMS_TO_TICKS(1000));
}
}Como pode-se ver no Código, foi utilizado o método de Zigher-Nicols para calcular os ganhos conforme a tabela:
Observe o cálculo do “cv” (Control Variable – Variável de Controle) que representa a saída do controlador PID, seguido pela fórmula:
onde:
- cv1: representa a saída do controlador na iteração anterior. Isso mantém continuidade na saída do controlador, evitando variações bruscas.
- erro: diferença entre o Setpoint (SP) e a variável de processo (PV) no instante atual.
- erro1: erro da iteração anterior (passado imediato).
- erro2: erro de duas iterações atrás (histórico mais distante).
- Tm: Período de amostragem (tempo entre cada cálculo do PID).
Dessa forma, é necessário ir recalculando o valor do tempo de acomodação (Tu ou Ta) sempre que o sistema perder a estabilidade, assim garantindo um automático ajuste nos valores do PID e automaticamente ir atualizando o “cv”. Esse tempo nada mais é do que o que leva para o sistema atingir e permanecer dentro da tolerância ao redor do setpoint, no caso foi considerado 2%.
Ordem do Sistema e representação no MatLab
Como estamos falando de um Sistema térmico e de umidade, podemos aproximar à um Sistema de Segunda ordem, que tem o seguinte formato:


Exemplo no MatLab para um setpoint (valor definido de umidade) igual a 80 (%):
Observe que, sem modificar a planta (função de transferência), no caso os valores de Wn e zeta (ζ), temos um erro de duas vezes comparado à utilização do PID, para ajustar seria necessário modificar esses valores. Já com o PID, o termo integral acumula todo o erro ao longo do tempo, aumentando o valor de controle e forçando a saída a atingir o setpoint determinado sem a necessidade de modificar a planta.
Desafios da Integração PID + IoT
– Latência na comunicação: Pode comprometer respostas rápidas em sistemas críticos.
– Ajuste de parâmetros PID: Difícil encontrar os melhores valores Kp, Ki e Kd utilizando mais processamento.
– Segurança: Sistemas IoT são alvos de ataques cibernéticos, exigindo conhecimentos de Cybersecurity e redes.
– Manutenção: Como envolve a integração de mais de um sistema, geralmente é necessário dominar mais de uma linguagem de programação e conhecimento interdisciplinar.
Aplicativo para monitoramento e parametrização em Flutter
O aplicativo faz a conexão com o broker MQTT e o ESP32 assim que aberto, obtendo todos os parâmetros salvos na EEPROM do ESP32 e enviando para atualizar caso o usuário deseje.
Código Completo, Demonstrações e Contribuições
O código-fonte completo do projeto pode ser acessado no GitHub. Caso tenha interesse em contribuir, sinta-se à vontade para enviar sugestões e melhorias!
Conclusão
O uso do controle PID em aplicações IoT mostrou-se uma solução eficiente para sistemas que exigem ajustes automáticos e monitoramento remoto. A integração com plataformas de comunicação, como MQTT, permite um controle dinâmico e responsivo, otimizando o desempenho em tempo real.
No projeto demonstrado, foi possível visualizar como o PID melhora a estabilidade do sistema, reduzindo o erro e garantindo que a variável controlada atinja o setpoint desejado de forma mais eficiente. Além disso, a implementação em microcontroladores, como o ESP32, mostrou-se viável e acessível.
Para trabalhos futuros, podem ser exploradas estratégias de autoajuste adaptativo do PID (como controle Fuzzy-PID e PID baseado em aprendizado de máquina) e otimizações para consumo de energia em dispositivos IoT. Além disso, é essencial continuar aprimorando a segurança desses sistemas para evitar vulnerabilidades em aplicações críticas.
Referências
1. https://en.wikipedia.org/wiki/Ziegler–Nichols_method
2. https://materialpublic.imd.ufrn.br/curso/disciplina/1/63/2/11
3. https://embarcados.com.br/controlador-proporcional-em-sistemas-de-segunda-ordem/
4.https://www.ltiengenharia.com.br/2020/10/25/sistemas-de-controle-sistemas-dinamicos-de-segunda-ordem/
5.https://www.linkedin.com/pulse/implementação-de-um-controle-pid-esp32-com-algoritmo-método-mecabô/







