Skip to the content
2 layers55 × 57.9 mmController, the printed circuit board in 3D

Controle de temperatura de uma câmara térmica por lógica fuzzy (Mamdani), com visualização em tempo real por um dashboard web via MQTT.

Size
55 × 57.9 mm
Copper layers
2
Thickness
1.6 mm
Parts
20
Nets
30
Pads
79
Tracks, vias
77, 14
Pours
34
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
16 Jun 2026
Updated
24 Jun 2026

Overview

Controller is an open-source printed circuit board by DaviPRabelo, from the DaviPRabelo/Fuzzy_c213 repository on GitHub. It is a 2-layer board of 55 × 57.9 mm with 20 parts on 30 nets, routed with 77 tracks and 14 vias.

It is built around the LM1117T-ADJ, AP9565K and BC846, with the SS34 among its other parts. Its parts include 6 capacitors, 6 resistors, 3 connectors, 2 ICs and 2 transistors.

Main components

4

README

README.md

Câmara Térmica — Controle Fuzzy

Controle de temperatura de uma câmara térmica por lógica fuzzy (Mamdani), com visualização em tempo real por um dashboard web via MQTT.

Python scikit-fuzzy matplotlib MQTT Fuzzy

C213 · Sistemas Embarcados · Inatel


Sumário

Integrantes

NomeMatrícula
DAVÍ PADULA RABELO1917
KAUÃ VICTOR GARCIA SIÉCOLA1887
MATHEUS RENÓ TORRES1954

Arquitetura

mermaid
flowchart LR
    DASH["Dashboard<br/>(browser)"]
    BROKER(["Broker MQTT · HiveMQ"])
    ESP["ESP32 · controle fuzzy<br/>(pendente)"]
    PLANT["Aquecedor / Cooler<br/>+ sensor de temperatura"]

    DASH -->|setpoint| BROKER
    BROKER -->|setpoint| ESP
    ESP -->|telemetria JSON| BROKER
    BROKER -->|telemetria| DASH
    ESP -->|PWM| PLANT
    PLANT -->|temperatura| ESP

    classDef pending stroke-dasharray:5 5,fill:#fff7ed,stroke:#fb923c,color:#9a3412;
    class ESP pending;

O sistema tem três peças conceituais:

PeçaArquivoPapel
Projeto do controladorfuzzy.pyDefine pertinências + 25 regras, valida e gera gráficos (roda no PC, offline)
Interfacedashboard.htmlMostra temperatura/setpoint/erro/ação em tempo real e envia o setpoint
Controle embarcado(pendente)Firmware do ESP32 que lê o sensor, roda o fuzzy, aciona PWM e publica MQTT

O fuzzy.py é uma ferramenta offline: projeta o controlador, imprime testes de sinal e gera os gráficos das pertinências e da superfície de controle.


Convenção de sinais

Toda a lógica segue uma convenção única, consistente entre o .py e o dashboard:

GrandezaDefiniçãoInterpretação
erroe = SP − Te > 0 → está frio (T abaixo do setpoint)
Δe (delta_erro)variação do erro entre amostrastendência (esfriando / esquentando)
u (ação)saída de controle em %u > 0 → aquecer · u < 0 → resfriar

Termos linguísticos: NG (negativo grande) … ZE (zero) … PG (positivo grande) para as entradas; RF (resfriar forte) … MA (manter) … AF (aquecer forte) para a saída.


Estrutura de arquivos

text
fuzzy_codigo/
├── fuzzy.py            # controlador fuzzy + geração de gráficos (offline)
├── dashboard.html      # painel web em tempo real (MQTT + Chart.js)
├── requirements.txt    # dependências Python
├── pertinencias.png    # gráfico das funções de pertinência (gerado pelo .py)
├── superficie.png      # superfície de controle 3D (gerado pelo .py)
└── README.md

Como rodar o controlador

O controlador vive em fuzzy.py.

  1. Crie um ambiente virtual e instale as dependências:

    bash
    python -m venv .venv
    # Windows
    .venv\Scripts\activate
    # Linux/macOS
    source .venv/bin/activate
    
    python -m pip install -r requirements.txt
  2. Execute:

    bash
    python fuzzy.py

    O script imprime três testes de sinal e gera os dois gráficos:

    SaídaO que mostra
    pertinencias.pngAs funções de pertinência de erro, Δe e ação
    superficie.pngA superfície de controle 3D u = f(erro, Δe)

Como abrir o dashboard

O dashboard vive em dashboard.html.

[!TIP] Sirva o arquivo por HTTP — alguns navegadores bloqueiam WebSocket a partir de file://.

bash
python -m http.server 8080
# depois abra  http://localhost:8080/dashboard.html

O indicador de status mostra:

  • 🔴 Desconectado — sem conexão com o broker (tenta reconectar a cada 3 s);
  • 🟢 Conectado — recebendo telemetria normalmente;
  • 🟡 Conectado · sem dados — conexão ativa, mas sem telemetria há mais de 8 s (ESP32 parou de publicar / sinal perdido).

Os botões de setpoint (35 / 50 / 65 °C) publicam o novo SP no broker.

Painel "Inferência Fuzzy"

O dashboard reimplementa o controlador Mamdani em JavaScript (mesmas funções de pertinência e as 25 regras de fuzzy.py) e mostra, em tempo real, o passo a passo da inferência a cada amostra:

  1. Fuzzificação — funções de pertinência de erro e Δe com o valor atual marcado e os termos ativos destacados;
  2. Base de regras — a matriz 5×5; a célula destacada (com anel) é a regra dominante no instante, tingida pela intensidade de ativação μ;
  3. Defuzzificação — o conjunto de saída agregado, o centroide e, em seguida, o comando após o ganho de saída Ku e a saturação em ±100 % (ver abaixo), atualizados junto com a telemetria.

Saída do atuador (ganho Ku + saturação)

O centroide do conjunto agregado nunca alcança as bordas do universo — mesmo com RF/AF totalmente ativados ele satura em ≈ ±79 %. Por isso o controlador aplica a estrutura padrão núcleo fuzzy → ganho de saída Ku ≈ 1,27 → saturação em ±100 %, usando toda a faixa física do atuador (u>0 aquece, u<0 resfria). O painel de defuzzificação mostra as duas grandezas: o centroide (tracejado) e o comando final (linha cheia).


Comunicação MQTT

ItemValor
Brokerbroker.hivemq.com
Porta8000 (WebSocket)
Tópico de telemetriainatel/c213/camara/dados — ESP32 → dashboard (JSON)
Tópico de setpointinatel/c213/camara/setpoint — dashboard → ESP32 (número como texto, retained)

Formato do JSON em inatel/c213/camara/dados:

json
{ "temp": 31.4, "sp": 50, "erro": 18.6, "u": 73 }
CampoTipoDescrição
tempnúmerotemperatura medida (°C)
spnúmerosetpoint atual (°C)
erronúmeroe = sp − temp (°C)
unúmeroação de controle em % (u>0 aquece, u<0 resfria)
denúmero (opcional)variação do erro Δe; se ausente, o dashboard a deriva de amostras sucessivas

O dashboard tolera campos ausentes e ignora payloads com JSON inválido ou campos mal-tipados (validação numérica em cada campo).


Limitações conhecidas

  • Broker público sem isolamento: broker.hivemq.com é compartilhado e sem autenticação/TLS; os tópicos são fixos. Para uso em laboratório, prefira WSS (porta 8884) e prefixe os tópicos com um identificador único da equipe.

C213 · Sistemas Embarcados · Inatel

Parts

20
QtyValueFootprintReferences
2100nFCapacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolderC2, C6
2100uFCapacitor_THT:C_Radial_D6.3mm_H11.0mm_P2.50mmC1, C4
24.7KRResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR1, R3
1100KRResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR4
1100RResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR2
110uFCapacitor_THT:C_Radial_D5.0mm_H11.0mm_P2.00mmC5
122.1KRCapacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolderR6
130.9KRResistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR5
1470uFCapacitor_THT:C_Radial_D8.0mm_H11.5mm_P3.50mmC3
1AP9565KEasyEDA:TO-252-2_L6.6-W6.1-P4.57-LS10.1-BR-CWQ2
1BC846Package_TO_SOT_SMD:SOT-23Q1
1Barrel_Jack_SwitchConnector_BarrelJack:BarrelJack_GCT_DCJ200-10-A_HorizontalJ1
1GY-87 connConnector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_HorizontalJ2
1LM1117T-ADJPackage_TO_SOT_THT:TO-220-3_Horizontal_TabDownU3
1SS34Diode_SMD:D_SMAD1
1VentoinhaConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_HorizontalJ3
1~local_library:ESP32-C3 ModuleU1

Similar boards

  • 2 layers77.5 × 41.5 mmIntro to PCB, the printed circuit board in 3D

    Intro to PCB

    jtausif568/ATmega328P-Development-Board

    An ATmega328P-based development board (Arduino-compatible) designed from scratch in KiCad

    45 parts
  • 2 layers78 × 79.5 mmPulse oximeter, the printed circuit board in 3D

    Pulse oximeter

    khomyakova228-cell/pulse-oximeter

    Домашнее задание по курсу «САПР электронных средств» «Проект печатного узла пульсоксиметра в KiCad: оформление по ГОСТ, библиотека компонентов, автоматизация проверки и выпуска» Обозначение документа: БИГЕ.149980.001 Э3

    93 parts
  • 2 layers79 × 50.5 mmIntro to PCB, the printed circuit board in 3D

    Intro to PCB

    Rubeez1/Intro_PCB

    45 parts
  • 2 layersESP, the printed circuit board in 3D

    ESP

    MurilloHorvath/KiCad

    Projetos utilizando o software KiCad

    72 parts1MIT
  • 2 layers49 × 48 mmPirat, the printed circuit board in 3D

    Pirat

    ein-erin/pirat-metal-detector

    PIRAT (Pulse Induction) metal detector PCB

    46 parts
  • 2 layers43 × 35 mmLYFT CTRL, the printed circuit board in 3D

    LYFT CTRL

    mgkoenig/lyft

    LYFT is a sophisticated remote control for your IKEA BEKANT desk.

    43 parts88GPL-3.0
  • 2 layers64.1 × 36.2 mmProbeConverter, the printed circuit board in 3D

    ProbeConverter

    Open-Lab-Starter-Kit/OLSK-Small-CNC

    Open Source CNC Milling machine - Small version - Open Lab Starter Kit

    13 parts62CERN-OHL-W-2.0
  • 4 layers137.4 × 199.1 mmSt251n 20603, the printed circuit board in 3D

    St251n 20603

    schlae/HardDriveInfo

    Repair info and schematics for mostly older MFM hard drives

    277 parts38

Questions

How big is the Controller PCB?

It measures 55 × 57.9 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Controller use?

20 parts, built around the LM1117T-ADJ, AP9565K, BC846 and SS34. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Controller KiCad files?

From the DaviPRabelo/Fuzzy_c213 repository on GitHub, at the commit this page was made from: the board is hardware/controller/controller.kicad_pcb and its schematic hardware/controller/controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Controller design in my own project?

Its repository states no licence, so its author keeps all rights: ask DaviPRabelo before reusing the design.