<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>esp32 - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/esp32/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Sun, 15 Feb 2026 14:26:27 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>esp32 - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Filtro notch discreto (notch IIR) e média sincronizada (sync averaging)</title>
		<link>https://mcu.tec.br/algoritimos/filstros/filtro-notch-discreto-notch-iir-e-media-sincronizada-sync-averaging/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=filtro-notch-discreto-notch-iir-e-media-sincronizada-sync-averaging</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Tue, 24 Feb 2026 14:23:52 +0000</pubDate>
				<category><![CDATA[Filstros]]></category>
		<category><![CDATA[ADC DMA microcontrolador]]></category>
		<category><![CDATA[análise de sinais repetitivos]]></category>
		<category><![CDATA[Biquad]]></category>
		<category><![CDATA[biquad digital]]></category>
		<category><![CDATA[DSP em microcontroladores]]></category>
		<category><![CDATA[encoder sincronização]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[filtro digital]]></category>
		<category><![CDATA[filtro digital em C]]></category>
		<category><![CDATA[filtro notch IIR]]></category>
		<category><![CDATA[firmware tempo real]]></category>
		<category><![CDATA[média sincronizada]]></category>
		<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[processamento de sinais]]></category>
		<category><![CDATA[processamento digital de sinais embarcados]]></category>
		<category><![CDATA[remoção de 60Hz]]></category>
		<category><![CDATA[RP2040]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[SNR em sistemas embarcados]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[synchronous averaging]]></category>
		<category><![CDATA[tempo real]]></category>
		<category><![CDATA[zero crossing]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1356</guid>

					<description><![CDATA[<p>Fechando a ideia: o notch discreto e a média sincronizada resolvem problemas parecidos (melhorar a qualidade do sinal), mas por “mecanismos” bem diferentes, e isso muda totalmente quando cada um é a melhor escolha. O notch é a ferramenta certa quando você conhece uma frequência indesejada bem definida e relativamente estável e quer arrancá-la do sinal com o mínimo de impacto no restante do espectro. Em firmware, isso costuma ser “hum” de 50/60 Hz, tons de chaveamento, ou uma ressonância estreita que aparece como pico bem localizado. O ponto crítico é que o notch é tão bom quanto a precisão do seu (f_0) e a escolha de (Q): se a interferência varia de frequência, um notch muito estreito deixa passar; se você alarga demais, começa a “machucar” conteúdo útil perto de (f_0). Além disso, como é um IIR, você precisa cuidar de estabilidade numérica e do formato de implementação (a forma direta II transposta tende a ser mais robusta em ponto flutuante e também costuma ser a melhor porta de entrada para depois migrar para ponto fixo).</p>
<p>Já a média sincronizada não é “um filtro de frequência” no sentido clássico; ela é uma técnica de extração por coerência: tudo que está alinhado com o período de referência fica mais forte, e o que não está alinhado tende a desaparecer. Por isso ela é superior quando o sinal útil é repetitivo e você tem um marcador de fase confiável, como encoder em máquina rotativa, o próprio PWM em conversores/inversores, ou zero-cross da rede. O ganho prático é enorme porque ela aumenta SNR sem precisar “inventar” um modelo espectral do ruído, mas ela também tem uma fragilidade: se o sincronismo for ruim (jitter, período variável, marcador inconsistente) a média “borrará” a forma de onda e pode até criar artefatos que parecem sinal real. Em projetos de rede elétrica, por exemplo, se você fixa (N) como “amostras por ciclo” sem acompanhar a variação real da frequência, a média começa a perder fase ao longo dos ciclos; nesse caso, ou você mede o período e ajusta (N) dinamicamente, ou você reamostra o ciclo para um grid fixo antes de acumular.</p>
<p>Na prática, em pipeline embarcado, uma combinação muito comum é usar notch primeiro para remover uma interferência tonal forte e depois usar média sincronizada para revelar a forma repetitiva de interesse com ruído bem mais baixo. Isso funciona especialmente bem quando a interferência não é coerente com o período que você está usando para sincronizar; se for coerente, a média pode reforçar a interferência, e aí o notch vira praticamente obrigatório antes. Se o seu sistema estiver no limite de CPU, o notch custa um número fixo e pequeno de multiplicações por amostra, enquanto a média sincronizada pode custar pouco por amostra mas “cobra” um custo por período quando você atualiza a forma média; dá para manter determinismo atualizando médias de forma incremental, ou reduzindo taxa, ou usando buffers e processamento em tarefa de menor prioridade.</p>
<p>Se você me disser qual é o seu caso (por exemplo: remover 60 Hz do ADC de shunt, ou extrair assinatura de vibração sincronizada com encoder, ou limpar ripple de PWM), eu adapto os coeficientes, a estratégia de sincronismo e o código para um cenário mais “pé no chão” com ADC+DMA, saturação, e versão em ponto fixo (Q31) pronta para rodar liso em Cortex-M.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/filstros/filtro-notch-discreto-notch-iir-e-media-sincronizada-sync-averaging/">Filtro notch discreto (notch IIR) e média sincronizada (sync averaging)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Em sistemas embarcados, “tirar uma frequência específica do sinal” costuma aparecer em dois cenários muito práticos: remover uma interferência estreita e persistente (por exemplo, 50/60 Hz de rede, ou um tom de comutação) e aumentar SNR (relação sinal-ruído) quando o fenômeno de interesse é repetitivo e existe uma referência de fase (por exemplo, rotação com encoder, comutação PWM, ou zero-cross da rede). O filtro notch discreto resolve muito bem o primeiro caso porque ele cria uma atenuação profunda numa frequência central (f_0) com pouca alteração do resto do espectro. Já a média sincronizada resolve muito bem o segundo porque ela soma ciclos “alinhados” no tempo/fase, reforçando o componente coerente e cancelando ruído não correlacionado e componentes que não encaixam exatamente naquele período.</p>



<p class="wp-block-paragraph">Quando o firmware precisa ser previsível (tempo real), o desenho do filtro não é só “matemático”: você escolhe estruturas e limites para garantir custo computacional constante, estado pequeno e estabilidade numérica, principalmente se você for para ponto fixo ou tiver ADC+DMA alimentando o pipeline. (Essa preocupação de arquitetura e previsibilidade é típica de projetos de tempo real.)</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1) Notch discreto: o “biquad” que apaga uma frequência</h2>



<p class="wp-block-paragraph">Um notch digital clássico pode ser implementado como um biquad IIR (segunda ordem) com zeros exatamente na frequência que você quer cancelar e polos próximos, controlando a largura do “buraco” via fator de qualidade (Q). Quanto maior o (Q), mais estreito é o notch (ótimo para interferência tonal estável), mas maior a sensibilidade a variação de (f_0) e a quantização dos coeficientes. Em termos práticos: para hum de rede em 60 Hz, se o sinal tiver variação de frequência (rede oscilando, ou a interferência “escorregando”), um (Q) alto demais pode deixar “vazar” parte do ruído. Para tom de comutação de um inversor ou fonte chaveada, se o clock for estável, dá para usar (Q) alto e atacar de forma cirúrgica.</p>



<p class="wp-block-paragraph">O biquad notch mais comum pode ser escrito como:</p>



<p class="wp-block-paragraph">\[<br>H(z)=\frac{1 &#8211; 2\cos(\omega_0)z^{-1} + z^{-2}}{1 &#8211; 2r\cos(\omega_0)z^{-1} + r^2 z^{-2}}<br>\]



<p class="wp-block-paragraph">onde \(\omega_0=2\pi f_0/F_s\) e (r) controla a “proximidade” dos polos aos zeros (quanto mais perto de 1, mais estreito e mais profundo). Uma ligação prática entre (r) e (Q) é aproximar a largura de banda por \(BW \approx f_0/Q\) e usar \(r \approx e^{-\pi BW/F_s}\). Isso funciona muito bem para firmware porque você calcula coeficientes uma vez (ou quando \(f_0\) muda) e o processamento por amostra fica constante.</p>



<h3 class="wp-block-heading">Código em C: biquad notch (float) com inicialização por \(F_s, f_0, Q\)</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include &lt;math.h>
#include &lt;stdint.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

typedef struct {
    // Coeficientes normalizados (a0 = 1)
    float b0, b1, b2;
    float a1, a2;

    // Estados (forma direta II transposta)
    float z1, z2;
} NotchBiquad;

/**
 * @brief Inicializa um filtro notch IIR (biquad) em forma direta II transposta.
 * @param f     Ponteiro para a estrutura do filtro.
 * @param Fs    Frequência de amostragem (Hz).
 * @param f0    Frequência central do notch (Hz).
 * @param Q     Fator de qualidade (adimensional). Ex.: 10..50 típicos.
 *
 * Observação prática:
 *  - Q maior => notch mais estreito, mais sensível a variações de f0 e quantização.
 *  - Q menor => notch mais largo, remove mais “vizinhança” de frequências.
 */
static inline void notch_init(NotchBiquad *f, float Fs, float f0, float Q)
{
    const float w0 = 2.0f * (float)M_PI * (f0 / Fs);

    // Largura de banda aproximada (Hz)
    const float BW = f0 / Q;

    // Polo raio r (aprox.) -> define a largura do notch
    const float r = expf(-(float)M_PI * (BW / Fs));

    const float c = cosf(w0);

    // Numerador (zeros no círculo unitário em ±w0)
    const float b0 = 1.0f;
    const float b1 = -2.0f * c;
    const float b2 = 1.0f;

    // Denominador (polos em raio r)
    const float a0 = 1.0f;
    const float a1 = -2.0f * r * c;
    const float a2 = r * r;

    // Normaliza por a0 (a0=1 aqui, mas mantemos o padrão)
    f->b0 = b0 / a0;
    f->b1 = b1 / a0;
    f->b2 = b2 / a0;
    f->a1 = a1 / a0;
    f->a2 = a2 / a0;

    f->z1 = 0.0f;
    f->z2 = 0.0f;
}

/**
 * @brief Processa 1 amostra pelo biquad notch (DF-II Transposta).
 * @param f Estrutura do filtro.
 * @param x Amostra de entrada.
 * @return  Amostra filtrada.
 */
static inline float notch_process(NotchBiquad *f, float x)
{
    // DF-II transposta:
    // y = b0*x + z1
    // z1 = b1*x - a1*y + z2
    // z2 = b2*x - a2*y
    const float y = (f->b0 * x) + f->z1;
    const float z1 = (f->b1 * x) - (f->a1 * y) + f->z2;
    const float z2 = (f->b2 * x) - (f->a2 * y);

    f->z1 = z1;
    f->z2 = z2;
    return y;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">math</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stdint</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">ifndef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">M_PI</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">M_PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3.14159265358979323846</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">endif</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Coeficientes normalizados (a0 = 1)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b2</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a2</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Estados (forma direta II transposta)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z2</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NotchBiquad</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Inicializa um filtro notch IIR (biquad) em forma direta II transposta.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">f</span><span style="color: #616E88">     Ponteiro para a estrutura do filtro.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">Fs</span><span style="color: #616E88">    Frequência de amostragem (Hz).</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">f0</span><span style="color: #616E88">    Frequência central do notch (Hz).</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">Q</span><span style="color: #616E88">     Fator de qualidade (adimensional). Ex.: 10..50 típicos.</span></span>
<span class="line"><span style="color: #616E88"> *</span></span>
<span class="line"><span style="color: #616E88"> * Observação prática:</span></span>
<span class="line"><span style="color: #616E88"> *  - Q maior =&gt; notch mais estreito, mais sensível a variações de f0 e quantização.</span></span>
<span class="line"><span style="color: #616E88"> *  - Q menor =&gt; notch mais largo, remove mais “vizinhança” de frequências.</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">notch_init</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">NotchBiquad</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">f</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Fs</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Q</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> w0 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 2</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">M_PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">f0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Fs</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Largura de banda aproximada (Hz)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> BW </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Q</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Polo raio r (aprox.) -&gt; define a largura do notch</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> r </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">expf</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">M_PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">BW</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Fs</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> c </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">cosf</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">w0</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Numerador (zeros no círculo unitário em ±w0)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> b0 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> b1 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">2</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">c</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> b2 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Denominador (polos em raio r)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> a0 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 1</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> a1 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">2</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">r</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">c</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> a2 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">r</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">r</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Normaliza por a0 (a0=1 aqui, mas mantemos o padrão)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">b0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">b1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">b2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">b2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">a1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">a2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">z1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">z2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> 0</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Processa 1 amostra pelo biquad notch (DF-II Transposta).</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">f</span><span style="color: #616E88"> Estrutura do filtro.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">x</span><span style="color: #616E88"> Amostra de entrada.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">return</span><span style="color: #616E88">  Amostra filtrada.</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">notch_process</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">NotchBiquad</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">f</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// DF-II transposta:</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// y = b0*x + z1</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// z1 = b1*x - a1*y + z2</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// z2 = b2*x - a2*y</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> y </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">b0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">z1</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> z1 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">b1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">a1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">z2</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> z2 </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">b2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">a2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">z1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z1</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">f</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">z2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">z2</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Melhores usos do notch:</strong> quando você conhece (ou mede) a frequência indesejada e ela é estreita, relativamente estável e você quer preservar quase tudo ao redor. Em instrumentação, isso aparece em leitura de shunt/ADC contaminada por rede; em áudio, hum; em controle, ressonância mecânica estreita (desde que não destrua margem de fase indevidamente); em eletrônica de potência, uma componente tonal em corrente/tensão.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2) Média sincronizada: “soma coerente” alinhada à fase</h2>



<p class="wp-block-paragraph">A média sincronizada (às vezes chamada de synchronous averaging, time synchronous averaging) não é “só uma média móvel”. A sacada é que você escolhe uma janela exatamente igual a um período do fenômeno repetitivo (ou múltiplos inteiros) e reinicia/alinha essa janela usando um evento de referência: um zero-cross, um pulso de encoder, um índice, ou um marcador derivado do PWM. Se você tem (N) amostras por período e faz uma média sobre (K) períodos alinhados, o componente que se repete com a mesma fase soma e cresce proporcionalmente, enquanto ruído aleatório cai como (\sqrt{K}) no RMS. Além disso, componentes que não “encaixam” naquele período tendem a se cancelar.</p>



<p class="wp-block-paragraph">Em termos de filtro, isso se comporta como um filtro tipo comb (pente) extremamente eficiente para rejeitar tudo que não é coerente com o período escolhido. A diferença para um notch é que você não está mirando uma única frequência: você está favorecendo toda a forma de onda repetitiva no domínio do tempo, desde que sincronizada.</p>



<h3 class="wp-block-heading">Código em C: média sincronizada por períodos (com referência externa)</h3>



<p class="wp-block-paragraph">A seguir vai uma implementação simples (e bem útil) para firmware: você acumula amostras de cada posição dentro do período e, a cada período completo, você atualiza a média. Isso é perfeito quando você tem um “gatilho de início de período” (por exemplo, interrupção de índice do encoder ou zero-cross).</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include &lt;stdint.h>
#include &lt;string.h>

typedef struct {
    uint16_t N;          // amostras por período
    uint16_t idx;        // posição atual no período &#91;0..N-1&#93;
    uint32_t K;          // quantos períodos já acumulados (limite/controle externo)

    // Buffers de acumulação (use int64 se seu range for grande)
    int64_t *acc;        // soma por posição
    int32_t *avg;        // média por posição (resultado)
} SyncAvg;

/**
 * @brief Inicializa a média sincronizada.
 * @param s       Estrutura.
 * @param acc     Buffer de acumulação de tamanho N (int64_t).
 * @param avg     Buffer de saída média de tamanho N (int32_t).
 * @param N       Amostras por período.
 */
static inline void syncavg_init(SyncAvg *s, int64_t *acc, int32_t *avg, uint16_t N)
{
    s->N = N;
    s->idx = 0;
    s->K = 0;
    s->acc = acc;
    s->avg = avg;

    memset(s->acc, 0, (size_t)N * sizeof(int64_t));
    memset(s->avg, 0, (size_t)N * sizeof(int32_t));
}

/**
 * @brief Deve ser chamado quando ocorre o "marcador" de início de período (ex.: zero-cross ou índice do encoder).
 *        Isso força alinhamento de fase.
 */
static inline void syncavg_period_reset(SyncAvg *s)
{
    s->idx = 0;
}

/**
 * @brief Alimenta a média sincronizada com uma amostra do ADC já alinhada ao relógio de amostragem.
 * @param s Estrutura.
 * @param x Amostra (ex.: ADC já convertido para int32).
 *
 * Funcionamento:
 *  - A cada amostra, acumula na posição idx.
 *  - Ao completar N amostras, fecha um período e atualiza avg[].
 *  - A referência de fase vem de syncavg_period_reset() (externa).
 */
static inline void syncavg_push_sample(SyncAvg *s, int32_t x)
{
    s->acc&#91;s->idx&#93; += (int64_t)x;
    s->idx++;

    if (s->idx >= s->N) {
        s->idx = 0;
        s->K++;

        // Atualiza a média inteira por posição (custo O(N) por período).
        // Se N for grande e seu MCU for apertado, dá para atualizar de forma incremental.
        for (uint16_t i = 0; i &lt; s->N; i++) {
            s->avg&#91;i&#93; = (int32_t)(s->acc&#91;i&#93; / (int64_t)s->K);
        }
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stdint</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">string</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">          </span><span style="color: #616E88">// amostras por período</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">idx</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">// posição atual no período &#91;0..N-1&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">K</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">          </span><span style="color: #616E88">// quantos períodos já acumulados (limite/controle externo)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Buffers de acumulação (use int64 se seu range for grande)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int64_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">acc</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">// soma por posição</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">avg</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">// média por posição (resultado)</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SyncAvg</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Inicializa a média sincronizada.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">s</span><span style="color: #616E88">       Estrutura.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">acc</span><span style="color: #616E88">     Buffer de acumulação de tamanho N (int64_t).</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">avg</span><span style="color: #616E88">     Buffer de saída média de tamanho N (int32_t).</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">N</span><span style="color: #616E88">       Amostras por período.</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">syncavg_init</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">SyncAvg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">s</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int64_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">acc</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">avg</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">idx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">K</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">acc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">acc</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">avg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">avg</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">memset</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">acc</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">int64_t</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">memset</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">avg</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">size_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sizeof</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Deve ser chamado quando ocorre o &quot;marcador&quot; de início de período (ex.: zero-cross ou índice do encoder).</span></span>
<span class="line"><span style="color: #616E88"> *        Isso força alinhamento de fase.</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">syncavg_period_reset</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">SyncAvg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">idx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">/**</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">brief</span><span style="color: #616E88"> Alimenta a média sincronizada com uma amostra do ADC já alinhada ao relógio de amostragem.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">s</span><span style="color: #616E88"> Estrutura.</span></span>
<span class="line"><span style="color: #616E88"> * </span><span style="color: #ECEFF4">@</span><span style="color: #8FBCBB">param</span><span style="color: #616E88"> </span><span style="color: #D8DEE9">x</span><span style="color: #616E88"> Amostra (ex.: ADC já convertido para int32).</span></span>
<span class="line"><span style="color: #616E88"> *</span></span>
<span class="line"><span style="color: #616E88"> * Funcionamento:</span></span>
<span class="line"><span style="color: #616E88"> *  - A cada amostra, acumula na posição idx.</span></span>
<span class="line"><span style="color: #616E88"> *  - Ao completar N amostras, fecha um período e atualiza avg[].</span></span>
<span class="line"><span style="color: #616E88"> *  - A referência de fase vem de syncavg_period_reset() (externa).</span></span>
<span class="line"><span style="color: #616E88"> */</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">inline</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">syncavg_push_sample</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">SyncAvg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">s</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">acc</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">idx</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">+=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int64_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">x</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">idx</span><span style="color: #81A1C1">++;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">idx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">N</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">idx</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">K</span><span style="color: #81A1C1">++;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Atualiza a média inteira por posição (custo O(N) por período).</span></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Se N for grande e seu MCU for apertado, dá para atualizar de forma incremental.</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">uint16_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">N</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">avg</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF">)(</span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">acc</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF">&#93; </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int64_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">K</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Melhores usos da média sincronizada:</strong> quando existe um evento/clock de referência que define o período do fenômeno e você quer extrair o comportamento repetitivo com máxima imunidade a ruído. Isso aparece em análise vibroacústica sincronizada com rotação (encoder), em medição de ripple sincronizada com PWM, em leitura de sinais biomédicos quando há marcador, e em sistemas de potência quando você quer “ver” a forma média ao longo de ciclos de rede sem ser enganado por ruído ou eventos transientes fora de fase.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3) Exemplo prático combinando os dois: remover hum e depois reforçar a forma repetitiva</h2>



<p class="wp-block-paragraph">Em pipeline real, é comum usar notch primeiro para derrubar uma interferência tonal forte e, em seguida, média sincronizada para aumentar SNR do que restou (principalmente se o sinal útil é repetitivo e você tem referência). A ordem pode inverter dependendo do caso: se a interferência também for coerente com o mesmo período, a média pode reforçá-la, então o notch antes costuma ser mais seguro.</p>



<p class="wp-block-paragraph">Abaixo, um esqueleto de uso. Imagine ADC a 4 kHz, hum em 60 Hz, e você quer fazer média sincronizada por ciclo de 60 Hz usando zero-cross (logo \(N \approx 4000/60 \approx 66\) amostras por ciclo; na prática você ajusta para manter N inteiro e usar PLL/medição de período se a rede variar).</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#include &lt;stdio.h>

// Reaproveita NotchBiquad e SyncAvg já definidos acima.

#define FS_HZ        4000.0f
#define NOTCH_F0_HZ  60.0f
#define NOTCH_Q      25.0f

#define N_SAMPLES_PER_PERIOD  66  // exemplo (depende do seu sincronismo real)

static int64_t acc_buf&#91;N_SAMPLES_PER_PERIOD&#93;;
static int32_t avg_buf&#91;N_SAMPLES_PER_PERIOD&#93;;

int main(void)
{
    NotchBiquad notch;
    notch_init(&amp;notch, FS_HZ, NOTCH_F0_HZ, NOTCH_Q);

    SyncAvg s;
    syncavg_init(&amp;s, acc_buf, avg_buf, N_SAMPLES_PER_PERIOD);

    // Exemplo: loop de aquisição (mock)
    for (int n = 0; n &lt; 20000; n++) {
        // Em firmware real: x_raw vem do ADC (DMA buffer), e zero-cross chama syncavg_period_reset(&amp;s)
        int32_t x_raw = (int32_t)(1000 * sinf(2.0f * (float)M_PI * 10.0f * (n / FS_HZ))); // sinal útil 10 Hz
        x_raw += (int32_t)(300 * sinf(2.0f * (float)M_PI * 60.0f * (n / FS_HZ)));        // hum 60 Hz

        // Notch (float) -> converte de volta para int32
        float y_notch = notch_process(&amp;notch, (float)x_raw);
        int32_t y = (int32_t)y_notch;

        // Evento externo de sincronismo: aqui é só demonstração (a cada N amostras)
        if ((n % N_SAMPLES_PER_PERIOD) == 0) {
            syncavg_period_reset(&amp;s);
        }

        // Média sincronizada
        syncavg_push_sample(&amp;s, y);

        // Quando s.K aumenta, avg_buf contém a forma média por período
        if (s.K > 0 &amp;&amp; (n % (N_SAMPLES_PER_PERIOD * 20)) == 0) {
            printf("K=%lu, avg&#91;0&#93;=%ld, avg&#91;10&#93;=%ld\n",
                   (unsigned long)s.K, (long)avg_buf&#91;0&#93;, (long)avg_buf&#91;10&#93;);
        }
    }

    return 0;
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">stdio</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// Reaproveita NotchBiquad e SyncAvg já definidos acima.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">FS_HZ</span><span style="color: #D8DEE9FF">        4000</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NOTCH_F0_HZ</span><span style="color: #D8DEE9FF">  60</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NOTCH_Q</span><span style="color: #D8DEE9FF">      25</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">define</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N_SAMPLES_PER_PERIOD</span><span style="color: #D8DEE9FF">  </span><span style="color: #B48EAD">66</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// exemplo (depende do seu sincronismo real)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int64_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">acc_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">N_SAMPLES_PER_PERIOD</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">static</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">avg_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #D8DEE9">N_SAMPLES_PER_PERIOD</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">main</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">NotchBiquad</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">notch</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">notch_init</span><span style="color: #D8DEE9FF">(¬</span><span style="color: #D8DEE9">ch</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">FS_HZ</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NOTCH_F0_HZ</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NOTCH_Q</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">SyncAvg</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">s</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">syncavg_init</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">s</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">acc_buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">avg_buf</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N_SAMPLES_PER_PERIOD</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Exemplo: loop de aquisição (mock)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">20000</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">n</span><span style="color: #81A1C1">++</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Em firmware real: x_raw vem do ADC (DMA buffer), e zero-cross chama syncavg_period_reset(&amp;s)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">x_raw</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF">)(</span><span style="color: #B48EAD">1000</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sinf</span><span style="color: #D8DEE9FF">(2</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">M_PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> 10</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">FS_HZ</span><span style="color: #D8DEE9FF">)))</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// sinal útil 10 Hz</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">x_raw</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF">)(</span><span style="color: #B48EAD">300</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sinf</span><span style="color: #D8DEE9FF">(2</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">M_PI</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> 60</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">0</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">FS_HZ</span><span style="color: #D8DEE9FF">)))</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">        </span><span style="color: #616E88">// hum 60 Hz</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Notch (float) -&gt; converte de volta para int32</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y_notch</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">notch_process</span><span style="color: #D8DEE9FF">(¬</span><span style="color: #D8DEE9">ch</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">x_raw</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">int32_t</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">y_notch</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Evento externo de sincronismo: aqui é só demonstração (a cada N amostras)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> ((</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">N_SAMPLES_PER_PERIOD</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">syncavg_period_reset</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Média sincronizada</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">syncavg_push_sample</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">s</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">        </span><span style="color: #616E88">// Quando s.K aumenta, avg_buf contém a forma média por período</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">K</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">N_SAMPLES_PER_PERIOD</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">20</span><span style="color: #D8DEE9FF">)) </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">K=%lu, avg&#91;0&#93;=%ld, avg&#91;10&#93;=%ld</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                   (</span><span style="color: #D8DEE9">unsigned</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">long</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">s</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">K</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">long</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">avg_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">&#93;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">long</span><span style="color: #D8DEE9FF">)</span><span style="color: #D8DEE9">avg_buf</span><span style="color: #D8DEE9FF">&#91;</span><span style="color: #B48EAD">10</span><span style="color: #D8DEE9FF">&#93;)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Fechando a ideia: o notch discreto e a média sincronizada resolvem problemas parecidos (melhorar a qualidade do sinal), mas por “mecanismos” bem diferentes, e isso muda totalmente quando cada um é a melhor escolha. O notch é a ferramenta certa quando você conhece uma frequência indesejada bem definida e relativamente estável e quer arrancá-la do sinal com o mínimo de impacto no restante do espectro. Em firmware, isso costuma ser “hum” de 50/60 Hz, tons de chaveamento, ou uma ressonância estreita que aparece como pico bem localizado. O ponto crítico é que o notch é tão bom quanto a precisão do seu (f_0) e a escolha de (Q): se a interferência varia de frequência, um notch muito estreito deixa passar; se você alarga demais, começa a “machucar” conteúdo útil perto de (f_0). Além disso, como é um IIR, você precisa cuidar de estabilidade numérica e do formato de implementação (a forma direta II transposta tende a ser mais robusta em ponto flutuante e também costuma ser a melhor porta de entrada para depois migrar para ponto fixo).</p>



<p class="wp-block-paragraph">Já a média sincronizada não é “um filtro de frequência” no sentido clássico; ela é uma técnica de extração por coerência: tudo que está alinhado com o período de referência fica mais forte, e o que não está alinhado tende a desaparecer. Por isso ela é superior quando o sinal útil é repetitivo e você tem um marcador de fase confiável, como encoder em máquina rotativa, o próprio PWM em conversores/inversores, ou zero-cross da rede. O ganho prático é enorme porque ela aumenta SNR sem precisar “inventar” um modelo espectral do ruído, mas ela também tem uma fragilidade: se o sincronismo for ruim (jitter, período variável, marcador inconsistente) a média “borrará” a forma de onda e pode até criar artefatos que parecem sinal real. Em projetos de rede elétrica, por exemplo, se você fixa (N) como “amostras por ciclo” sem acompanhar a variação real da frequência, a média começa a perder fase ao longo dos ciclos; nesse caso, ou você mede o período e ajusta (N) dinamicamente, ou você reamostra o ciclo para um grid fixo antes de acumular.</p>



<p class="wp-block-paragraph">Na prática, em pipeline embarcado, uma combinação muito comum é usar notch primeiro para remover uma interferência tonal forte e depois usar média sincronizada para revelar a forma repetitiva de interesse com ruído bem mais baixo. Isso funciona especialmente bem quando a interferência não é coerente com o período que você está usando para sincronizar; se for coerente, a média pode reforçar a interferência, e aí o notch vira praticamente obrigatório antes. Se o seu sistema estiver no limite de CPU, o notch custa um número fixo e pequeno de multiplicações por amostra, enquanto a média sincronizada pode custar pouco por amostra mas “cobra” um custo por período quando você atualiza a forma média; dá para manter determinismo atualizando médias de forma incremental, ou reduzindo taxa, ou usando buffers e processamento em tarefa de menor prioridade.</p><p>The post <a href="https://mcu.tec.br/algoritimos/filstros/filtro-notch-discreto-notch-iir-e-media-sincronizada-sync-averaging/">Filtro notch discreto (notch IIR) e média sincronizada (sync averaging)</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1356</post-id>	</item>
		<item>
		<title>Comparativo Técnico de Microcontroladores: ESP32, STM32, Arduino, RP2040 e nRF52</title>
		<link>https://mcu.tec.br/microcontroladores/comparativo-tecnico-de-microcontroladores-esp32-stm32-arduino-rp2040-e-nrf52/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comparativo-tecnico-de-microcontroladores-esp32-stm32-arduino-rp2040-e-nrf52</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Tue, 10 Feb 2026 10:59:31 +0000</pubDate>
				<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[Arduino AVR]]></category>
		<category><![CDATA[baixo consumo]]></category>
		<category><![CDATA[bluetooth low energy]]></category>
		<category><![CDATA[controle industrial]]></category>
		<category><![CDATA[engenharia eletrônica]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[firmware embarcado]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[nRF52]]></category>
		<category><![CDATA[RP2040]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[wi-fi embarcado]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1291</guid>

					<description><![CDATA[<p>Este artigo apresenta uma análise comparativa e didática entre os principais microcontroladores do mercado — ESP32, STM32, Arduino (AVR), RP2040 e nRF52. O texto explora arquitetura, desempenho, consumo energético, conectividade e contexto de uso de cada família, ajudando engenheiros, estudantes e desenvolvedores a escolherem a plataforma mais adequada para projetos de IoT, sistemas industriais, dispositivos embarcados de baixo consumo e aplicações educacionais. O conteúdo é técnico, claro e orientado à tomada de decisão consciente em engenharia de sistemas embarcado</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/comparativo-tecnico-de-microcontroladores-esp32-stm32-arduino-rp2040-e-nrf52/">Comparativo Técnico de Microcontroladores: ESP32, STM32, Arduino, RP2040 e nRF52</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="root-eb-toc-poauy wp-block-essential-blocks-table-of-contents"><div class="eb-parent-wrapper eb-parent-eb-toc-poauy "><div class="eb-toc-container eb-toc-poauy  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-1 list-style-none" data-scroll-top="false" data-scroll-top-icon="fas fa-angle-up" data-collapsible="false" data-sticky-hide-mobile="false" data-sticky="false" data-scroll-target="scroll_to_toc" data-copy-link="false" data-editor-type="" data-hide-desktop="false" data-hide-tab="false" data-hide-mobile="false" data-itemcollapsed="false" data-highlight-scroll="false"><div class="eb-toc-header"><h2 class="eb-toc-title">Table of Contents</h2></div><div class="eb-toc-wrapper " data-headers="[{&quot;level&quot;:2,&quot;content&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;text&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;link&quot;:&quot;eb-table-content-0&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;ESP32 \u2013 Conectividade Integrada e Foco em IoT&quot;,&quot;text&quot;:&quot;ESP32 \u2013 Conectividade Integrada e Foco em IoT&quot;,&quot;link&quot;:&quot;esp32-conectividade-integrada-e-foco-em-iot&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;STM32 \u2013 Desempenho, Escalabilidade e Foco Industrial&quot;,&quot;text&quot;:&quot;STM32 \u2013 Desempenho, Escalabilidade e Foco Industrial&quot;,&quot;link&quot;:&quot;stm32-desempenho-escalabilidade-e-foco-industrial&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Arduino (AVR) \u2013 Simplicidade, Acesso e Limita\u00e7\u00f5es Arquiteturais&quot;,&quot;text&quot;:&quot;Arduino (AVR) \u2013 Simplicidade, Acesso e Limita\u00e7\u00f5es Arquiteturais&quot;,&quot;link&quot;:&quot;eb-table-content-3&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;RP2040 \u2013 Arquitetura Moderna, PIO e Flexibilidade a Baixo Custo&quot;,&quot;text&quot;:&quot;RP2040 \u2013 Arquitetura Moderna, PIO e Flexibilidade a Baixo Custo&quot;,&quot;link&quot;:&quot;rp2040-arquitetura-moderna-pio-e-flexibilidade-a-baixo-custo&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;nRF52 \u2013 Ultra Baixo Consumo e Comunica\u00e7\u00e3o Bluetooth Low Energy&quot;,&quot;text&quot;:&quot;nRF52 \u2013 Ultra Baixo Consumo e Comunica\u00e7\u00e3o Bluetooth Low Energy&quot;,&quot;link&quot;:&quot;eb-table-content-5&quot;},{&quot;level&quot;:2,&quot;content&quot;:&quot;Tabela Comparativa T\u00e9cnica entre as Plataformas&quot;,&quot;text&quot;:&quot;Tabela Comparativa T\u00e9cnica entre as Plataformas&quot;,&quot;link&quot;:&quot;eb-table-content-6&quot;},{&quot;level&quot;:3,&quot;content&quot;:&quot;Leitura cr\u00edtica da tabela&quot;,&quot;text&quot;:&quot;Leitura cr\u00edtica da tabela&quot;,&quot;link&quot;:&quot;eb-table-content-7&quot;}]" data-visible="[true,true,true,true,true,true]" data-delete-headers="[{&quot;label&quot;:&quot;Introdu\u00e7\u00e3o&quot;,&quot;value&quot;:&quot;introdu\u00e7\u00e3o&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;ESP32 \u2013 Conectividade Integrada e Foco em IoT&quot;,&quot;value&quot;:&quot;esp32-conectividade-integrada-e-foco-em-iot&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;STM32 \u2013 Desempenho, Escalabilidade e Foco Industrial&quot;,&quot;value&quot;:&quot;stm32-desempenho-escalabilidade-e-foco-industrial&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Arduino (AVR) \u2013 Simplicidade, Acesso e Limita\u00e7\u00f5es Arquiteturais&quot;,&quot;value&quot;:&quot;arduino-avr-simplicidade-acesso-e-limita\u00e7\u00f5es-arquiteturais&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;RP2040 \u2013 Arquitetura Moderna, PIO e Flexibilidade a Baixo Custo&quot;,&quot;value&quot;:&quot;rp2040-arquitetura-moderna-pio-e-flexibilidade-a-baixo-custo&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;nRF52 \u2013 Ultra Baixo Consumo e Comunica\u00e7\u00e3o Bluetooth Low Energy&quot;,&quot;value&quot;:&quot;nrf52-ultra-baixo-consumo-e-comunica\u00e7\u00e3o-bluetooth-low-energy&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Tabela Comparativa T\u00e9cnica entre as Plataformas&quot;,&quot;value&quot;:&quot;tabela-comparativa-t\u00e9cnica-entre-as-plataformas&quot;,&quot;isDelete&quot;:false},{&quot;label&quot;:&quot;Leitura cr\u00edtica da tabela&quot;,&quot;value&quot;:&quot;leitura-cr\u00edtica-da-tabela&quot;,&quot;isDelete&quot;:false}]" data-smooth="true" data-top-offset=""><div class="eb-toc__list-wrap"><ul class="eb-toc__list"><li><a href="#eb-table-content-0">Introdução</a><li><a href="#esp32-conectividade-integrada-e-foco-em-iot">ESP32 – Conectividade Integrada e Foco em IoT</a><li><a href="#stm32-desempenho-escalabilidade-e-foco-industrial">STM32 – Desempenho, Escalabilidade e Foco Industrial</a><li><a href="#eb-table-content-3">Arduino (AVR) – Simplicidade, Acesso e Limitações Arquiteturais</a><li><a href="#rp2040-arquitetura-moderna-pio-e-flexibilidade-a-baixo-custo">RP2040 – Arquitetura Moderna, PIO e Flexibilidade a Baixo Custo</a><li><a href="#eb-table-content-5">nRF52 – Ultra Baixo Consumo e Comunicação Bluetooth Low Energy</a><li><a href="#eb-table-content-6">Tabela Comparativa Técnica entre as Plataformas</a><ul class="eb-toc__list"><li><a href="#eb-table-content-7">Leitura crítica da tabela</a></li></ul></ul></div></div></div></div></div>


<h2 class="wp-block-heading">Introdução</h2>



<p class="wp-block-paragraph">A escolha de um microcontrolador é uma das decisões mais críticas no desenvolvimento de sistemas embarcados, pois impacta diretamente o custo, o consumo de energia, a complexidade do firmware, a conectividade disponível e até mesmo a viabilidade do produto final. Nos últimos anos, o mercado passou a oferecer famílias extremamente distintas, que atendem desde projetos educacionais e protótipos rápidos até aplicações industriais, IoT em larga escala e dispositivos vestíveis de ultra-baixo consumo.</p>



<p class="wp-block-paragraph">Neste artigo comparativo, analisamos cinco plataformas amplamente utilizadas — <strong>ESP32</strong>, <strong>STM32</strong>, <strong>Arduino (AVR)</strong>, <strong>RP2040</strong> e <strong>nRF52</strong> — destacando suas arquiteturas, capacidades de processamento, conectividade, consumo energético e contextos de uso. O objetivo não é eleger um “melhor” microcontrolador, mas fornecer critérios técnicos claros para que o engenheiro ou desenvolvedor escolha a solução mais adequada ao seu projeto.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/microcontroladores/comparativo-tecnico-de-microcontroladores-esp32-stm32-arduino-rp2040-e-nrf52/">Comparativo Técnico de Microcontroladores: ESP32, STM32, Arduino, RP2040 e nRF52</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1291</post-id>	</item>
		<item>
		<title>Os Melhores Sites sobre Microcontroladores, Sistemas Embarcados e IoT em 2026</title>
		<link>https://mcu.tec.br/geral/os-melhores-sites-sobre-microcontroladores-sistemas-embarcados-e-iot-em-2026/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=os-melhores-sites-sobre-microcontroladores-sistemas-embarcados-e-iot-em-2026</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 08 Feb 2026 00:07:52 +0000</pubDate>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[ARM Cortex]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[datasheets]]></category>
		<category><![CDATA[desenvolvimento embarcado]]></category>
		<category><![CDATA[documentação técnica]]></category>
		<category><![CDATA[eletrônica embarcada]]></category>
		<category><![CDATA[engenharia eletrônica]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[firmware]]></category>
		<category><![CDATA[FPGA]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[kits de desenvolvimento]]></category>
		<category><![CDATA[MCU]]></category>
		<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[PIC]]></category>
		<category><![CDATA[portais de eletrônica]]></category>
		<category><![CDATA[RISC-V]]></category>
		<category><![CDATA[rtos]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[stm32]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1275</guid>

					<description><![CDATA[<p>Este artigo apresenta uma curadoria criteriosa e atualizada dos melhores sites sobre microcontroladores, sistemas embarcados e IoT, reunindo portais educacionais, fabricantes, distribuidores e plataformas técnicas amplamente reconhecidas no Brasil e no exterior. O conteúdo foi organizado para atender estudantes, makers, engenheiros de firmware e profissionais da indústria, oferecendo acesso direto a artigos técnicos, documentação oficial, cursos, kits de desenvolvimento e pesquisa de componentes. Entre os destaques estão portais especializados como Embarcados, MCU.TEC, Instituto Newton C. Braga, além de fabricantes como Microchip, STMicroelectronics, Renesas e Texas Instruments. O artigo também inclui lojas brasileiras de referência e plataformas globais como Octopart, Digi-Key e Mouser, facilitando desde o aprendizado até o desenvolvimento profissional e industrial de soluções embarcadas. Trata-se de um guia essencial para quem busca fontes confiáveis, técnicas e atualizadas no ecossistema de microcontroladores e eletrônica aplicada.</p>
<p>The post <a href="https://mcu.tec.br/geral/os-melhores-sites-sobre-microcontroladores-sistemas-embarcados-e-iot-em-2026/">Os Melhores Sites sobre Microcontroladores, Sistemas Embarcados e IoT em 2026</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Conteúdo Educacional e Técnico (Portais e Comunidades)</h2>



<ul class="wp-block-list">
<li><strong>Embarcados</strong><br><a href="https://www.embarcados.com.br/">https://www.embarcados.com.br</a><br>Principal portal brasileiro sobre sistemas embarcados, microcontroladores, RTOS, Linux embarcado e indústria. Excelente equilíbrio entre teoria, prática e mercado.</li>



<li><strong>MCU.TEC</strong><br><a href="https://mcu.tec.br/">https://mcu.tec.br</a><br>Conteúdo técnico aprofundado sobre microcontroladores, FPGA, RTOS, protocolos, eletrônica aplicada e integração com IA. Forte foco em didática e engenharia real.</li>



<li><strong>Microgenios</strong><br><a href="https://www.microgenios.com.br/">https://www.microgenios.com.br</a><br>Cursos, treinamentos e artigos focados em PIC, Arduino, ESP32 e IoT, com abordagem prática para iniciantes e intermediários.</li>



<li><strong>Instituto Newton C. Braga</strong><br><a href="https://www.newtoncbraga.com.br/">https://www.newtoncbraga.com.br</a><br>Acervo clássico e extremamente vasto de eletrônica, incluindo microcontroladores, sensores, fontes e RF. Um verdadeiro repositório histórico-técnico.</li>



<li><strong>Vichinsky</strong><br><a href="https://www.vichinsky.com/">https://www.vichinsky.com</a><br>Conteúdo técnico voltado a PIC (especialmente PIC18F2550), 8051 e Arduino, com exemplos diretos e foco em firmware bare-metal.</li>



<li><strong>All About Circuits</strong><br><a href="https://www.allaboutcircuits.com/">https://www.allaboutcircuits.com</a><br>Um dos melhores sites internacionais para eletrônica e microcontroladores, com artigos técnicos, fóruns e análises profundas.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3ed.png" alt="🏭" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Fabricantes e Documentação Oficial</h2>



<ul class="wp-block-list">
<li><strong>Microchip Technology</strong><br><a href="https://www.microchip.com/">https://www.microchip.com</a><br>Documentação oficial de PIC, AVR (Atmel), SAM e ferramentas como MPLAB X. Fonte primária obrigatória para quem trabalha com PIC e AVR.</li>



<li><strong>STMicroelectronics</strong><br><a href="https://www.st.com/">https://www.st.com</a><br>Referência absoluta para STM32, HAL, LL, CubeMX e ecossistema ARM Cortex-M e Cortex-A.</li>



<li><strong>NXP Semiconductors</strong><br><a href="https://www.nxp.com/">https://www.nxp.com</a><br>Forte em microcontroladores industriais, automotivos, i.MX, LPC e segurança embarcada.</li>



<li><strong>Renesas Electronics</strong><br><a href="https://www.renesas.com/">https://www.renesas.com</a><br>Destaque para famílias RA, RX e RZ, muito usadas em aplicações industriais e IoT avançado.</li>



<li><strong>Texas Instruments</strong><br><a href="https://www.ti.com/">https://www.ti.com</a><br>MSP430, Sitara, documentação exemplar e application notes de alto nível.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6d2.png" alt="🛒" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Lojas e Kits de Desenvolvimento (Brasil)</h2>



<ul class="wp-block-list">
<li><strong>AutoCore Robótica</strong><br><a href="https://www.autocorerobotica.com.br/">https://www.autocorerobotica.com.br</a><br>Venda de microcontroladores, módulos ESP, sensores e kits educacionais.</li>



<li><strong>Baú da Eletrônica</strong><br><a href="https://www.baudaeletronica.com.br/">https://www.baudaeletronica.com.br</a><br>Grande variedade de CIs, microcontroladores, ferramentas e componentes.</li>



<li><strong>ACEPIC Tecnologia</strong><br><a href="https://www.acepic.com.br/">https://www.acepic.com.br</a><br>Especializada em kits, treinamentos e soluções educacionais para PIC, ESP32 e sistemas embarcados.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Plataformas de Pesquisa e Datasheets</h2>



<ul class="wp-block-list">
<li><strong>Octopart</strong><br><a href="https://octopart.com/">https://octopart.com</a><br>Essencial para pesquisa de microcontroladores, comparação de preços, estoque global e acesso rápido a datasheets oficiais.</li>



<li><strong>Digi-Key</strong><br><a href="https://www.digikey.com/">https://www.digikey.com</a><br>Além da loja, possui uma biblioteca técnica riquíssima (TechForum, artigos, vídeos).</li>



<li><strong>Mouser Electronics</strong><br><a href="https://www.mouser.com/">https://www.mouser.com</a><br>Excelente para lançamentos recentes, application notes e kits de desenvolvimento.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/geral/os-melhores-sites-sobre-microcontroladores-sistemas-embarcados-e-iot-em-2026/">Os Melhores Sites sobre Microcontroladores, Sistemas Embarcados e IoT em 2026</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1275</post-id>	</item>
		<item>
		<title>Por que sensores industriais usam 0–10 V e 4–20 mA? Fundamentos, fórmulas e aplicações práticas</title>
		<link>https://mcu.tec.br/infraestrutura/por-que-sensores-industriais-usam-0-10-v-e-4-20-ma-fundamentos-formulas-e-aplicacoes-praticas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=por-que-sensores-industriais-usam-0-10-v-e-4-20-ma-fundamentos-formulas-e-aplicacoes-praticas</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sat, 13 Dec 2025 19:05:21 +0000</pubDate>
				<category><![CDATA[Infraestrutura]]></category>
		<category><![CDATA[0-10V]]></category>
		<category><![CDATA[4-20mA]]></category>
		<category><![CDATA[ADC]]></category>
		<category><![CDATA[automação industrial]]></category>
		<category><![CDATA[entrada analógica]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[instrumentação industrial]]></category>
		<category><![CDATA[loop de corrente]]></category>
		<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[ruído eletromagnético]]></category>
		<category><![CDATA[sensores industriais]]></category>
		<category><![CDATA[sinais analógicos]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[zero vivo]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1003</guid>

					<description><![CDATA[<p>Entenda por que sensores industriais utilizam os padrões 0–10 V e 4–20 mA. Este artigo explica os fundamentos elétricos, a matemática do escalonamento, imunidade a ruído, zero vivo, integração com microcontroladores e critérios técnicos de escolha. Um guia didático e minucioso para engenheiros, estudantes e profissionais de automação industrial que desejam projetar sistemas embarcados mais confiáveis e robustos.</p>
<p>The post <a href="https://mcu.tec.br/infraestrutura/por-que-sensores-industriais-usam-0-10-v-e-4-20-ma-fundamentos-formulas-e-aplicacoes-praticas/">Por que sensores industriais usam 0–10 V e 4–20 mA? Fundamentos, fórmulas e aplicações práticas</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Visão geral: por que a indústria padronizou 0–10 V e 4–20 mA</h2>



<p class="wp-block-paragraph">Em automação industrial, o “problema real” não é só medir uma grandeza (pressão, nível, vazão, temperatura), e sim <strong>transportar essa informação com confiabilidade</strong> por cabos longos, passando perto de motores, inversores de frequência, contatores e ambientes com aterramento imperfeito. Por isso, o setor convergiu para <strong>dois padrões analógicos</strong> simples, baratos e robustos: <strong>tensão (tipicamente 0–10 V)</strong> e <strong>corrente (tipicamente 4–20 mA)</strong>. Ambos representam a mesma ideia: um sensor transforma uma variável física em um sinal elétrico proporcional; a diferença está em <em>como</em> esse sinal “sobrevive” ao mundo industrial.</p>



<p class="wp-block-paragraph">O padrão <strong>0–10 V</strong> é muito comum quando as distâncias são moderadas, o cabeamento é bem controlado e o custo/complexidade precisa ser mínimo. Ele é intuitivo: a variável medida vira uma tensão proporcional na entrada analógica do CLP/DAQ. A relação básica de escalonamento (linear) é:</p>



<p class="wp-block-paragraph">\[<br>y = y_{\min} + \frac{(V &#8211; V_{\min})}{(V_{\max}-V_{\min})},(y_{\max}-y_{\min})<br>\]



<p class="wp-block-paragraph">Para 0–10 V, fica:</p>



<p class="wp-block-paragraph">\[<br>y = y_{\min} + \frac{V}{10},(y_{\max}-y_{\min})<br>\]



<p class="wp-block-paragraph">Já o padrão <strong>4–20 mA</strong> nasceu para vencer o que “mata” sinais de tensão no campo: <strong>queda de tensão no cabo, variações de resistência de contato, ruído acoplado e diferenças de referência de terra</strong>. Em um loop de corrente, o receptor não “confia” tanto em uma tensão absoluta; ele mede a corrente, e a corrente é <strong>a mesma ao longo de todo o circuito em série</strong> (pela própria natureza do loop), desde que o transmissor tenha tensão de alimentação suficiente para manter a conformidade. O escalonamento típico é:</p>



<p class="wp-block-paragraph">\[<br>y = y_{\min} + \frac{(I-4,\text{mA})}{16,\text{mA}},(y_{\max}-y_{\min})<br>\]



<p class="wp-block-paragraph">O “4 mA” (e não 0 mA) é intencional: é o chamado <strong>zero vivo</strong>. Assim, <strong>0 mA pode significar falha</strong> (fio rompido, transmissor sem alimentação), enquanto 4 mA significa “medindo zero da grandeza, mas o circuito está vivo”. Esse detalhe sozinho reduz diagnósticos ambíguos e melhora manutenção.</p>



<p class="wp-block-paragraph">Na prática, a escolha vira um trade-off objetivo:</p>



<ul class="wp-block-list">
<li><strong>0–10 V</strong> tende a ser simples, barato, fácil de interfacear, porém mais sensível a ruído e a problemas de referência/aterramento em longas distâncias.</li>



<li><strong>4–20 mA</strong> tende a ser mais robusto para cabos longos e ambientes agressivos, e ainda oferece diagnóstico de falha via “zero vivo”, ao custo de exigir loop, alimentação e resistor de carga (burden) adequados.</li>
</ul>



<p class="wp-block-paragraph">Observação importante (para conectar com arquitetura de sistemas reais): a indústria adota esses padrões porque eles reduzem risco sistêmico e tornam o comportamento mais previsível em campo — uma lógica muito alinhada à mentalidade de projeto de sistemas embarcados/tempo real, onde decisões de arquitetura existem para otimizar confiabilidade sob restrições práticas.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="474" height="237" src="https://mcu.tec.br/wp-content/uploads/2025/12/image-31.png" alt="" class="wp-image-1006" srcset="https://mcu.tec.br/wp-content/uploads/2025/12/image-31.png 474w, https://mcu.tec.br/wp-content/uploads/2025/12/image-31-300x150.png 300w" sizes="(max-width: 474px) 100vw, 474px" /></figure>



<h2 class="wp-block-heading">Padrão 0–10 V em detalhe técnico (vantagens, limites e matemática do erro)</h2>



<p class="wp-block-paragraph">O padrão <strong>0–10 V</strong> representa a variável medida como uma <strong>tensão proporcional</strong> aplicada à entrada analógica do sistema de aquisição (CLP, módulo de I/O, microcontrolador). Do ponto de vista elétrico, isso significa que o sensor funciona como uma <strong>fonte de tensão</strong> (idealmente) e o equipamento de leitura como uma <strong>carga de alta impedância</strong>. Quanto maior a impedância de entrada, menor a corrente drenada do sensor e menor o erro introduzido.</p>



<h3 class="wp-block-heading">Modelo elétrico simplificado</h3>



<p class="wp-block-paragraph">Na prática, o sensor não é uma fonte ideal: ele pode ser modelado como uma fonte de tensão \(V_s\) em série com uma resistência interna \(R_s\). O cabo adiciona uma resistência \(R_c\) e a entrada do conversor A/D (ADC) possui uma impedância \(R_{in}\).</p>



<p class="wp-block-paragraph">\[<br>V_{med} = V_s \cdot \frac{R_{in}}{R_s + R_c + R_{in}}<br>\]



<p class="wp-block-paragraph">Se \(R_{in} \gg (R_s + R_c)\), o termo tende a 1 e o erro é desprezível. Em ambientes industriais, módulos analógicos costumam ter <strong>impedâncias de entrada entre 100 kΩ e 1 MΩ</strong>, justamente para minimizar esse efeito. Já cabos longos, com seções pequenas, aumentam \(R_c\) e tornam o sistema mais sensível a erro.</p>



<h3 class="wp-block-heading">Influência do ruído eletromagnético</h3>



<p class="wp-block-paragraph">Outro ponto crítico do 0–10 V é o <strong>acoplamento de ruído</strong>. Um campo eletromagnético variável (por exemplo, próximo a motores ou inversores de frequência) pode induzir uma tensão espúria no cabo. Como o sinal é uma tensão absoluta, qualquer interferência somada ao sinal aparece diretamente na medição:</p>



<p class="wp-block-paragraph">\[<br>V_{ADC} = V_{sinal} + V_{ruído}<br>\]



<p class="wp-block-paragraph">Mesmo alguns poucos milivolts podem ser relevantes. Em um sensor escalado de 0–10 V para 0–100 bar, por exemplo, <strong>10 mV equivalem a 0,1 bar</strong>. Em aplicações de precisão, isso não é desprezível.</p>



<p class="wp-block-paragraph">Por isso, boas práticas são praticamente obrigatórias:</p>



<ul class="wp-block-list">
<li>uso de <strong>cabos blindados</strong>;</li>



<li>referência de <strong>terra bem definida</strong> (sensor e receptor compartilham o mesmo GND);</li>



<li>filtragem analógica simples, como um <strong>filtro RC passa-baixa</strong> antes do ADC.</li>
</ul>



<p class="wp-block-paragraph">O corte de um filtro RC típico é dado por:</p>



<p class="wp-block-paragraph">\[<br>f_c = \frac{1}{2\pi RC}<br>\]



<p class="wp-block-paragraph">Esse filtro reduz ruído de alta frequência, mas introduz atraso de fase, algo que precisa ser considerado em sistemas de controle em malha fechada.</p>



<h3 class="wp-block-heading">Resolução e relação com o ADC</h3>



<p class="wp-block-paragraph">Quando o sinal 0–10 V entra em um ADC de \(N\) bits, a menor variação detectável (LSB – <em>Least Significant Bit</em>) é:</p>



<p class="wp-block-paragraph">\[<br>\Delta V = \frac{10\ \text{V}}{2^N}<br>\]



<p class="wp-block-paragraph">Por exemplo:</p>



<ul class="wp-block-list">
<li>ADC de 10 bits: \(\Delta V \approx 9{,}77\ \text{mV}\)</li>



<li>ADC de 12 bits: \(\Delta V \approx 2{,}44\ \text{mV}\)</li>
</ul>



<p class="wp-block-paragraph">Esse valor define o limite teórico de resolução do sistema. Na prática, ruído, offset e erro de ganho costumam dominar antes mesmo do limite do ADC.</p>



<h3 class="wp-block-heading">Quando 0–10 V faz sentido</h3>



<p class="wp-block-paragraph">O padrão 0–10 V é muito usado quando:</p>



<ul class="wp-block-list">
<li>as <strong>distâncias são curtas</strong> (painel ou máquina compacta);</li>



<li>o ambiente eletromagnético é relativamente controlado;</li>



<li>há necessidade de <strong>baixo custo</strong> e simplicidade;</li>



<li>o sistema já possui entradas analógicas de alta impedância e boa referência de terra.</li>
</ul>



<p class="wp-block-paragraph">É exatamente nesses limites — ruído, referência de terra e distância — que o padrão 0–10 V começa a perder espaço para o <strong>4–20 mA</strong>, que trata esses problemas de forma estrutural, e não apenas mitigativa.</p>



<h2 class="wp-block-heading">Padrão 4–20 mA: robustez elétrica, “zero vivo” e imunidade a ruído</h2>



<p class="wp-block-paragraph">O padrão <strong>4–20 mA</strong> foi adotado em larga escala porque resolve, de forma estrutural, problemas que no 0–10 V exigem cuidados adicionais. Aqui, a variável física não é representada por uma tensão absoluta, mas por uma <strong>corrente proporcional</strong>, que circula em um <strong>loop em série</strong> envolvendo transmissor, cabo, carga (burden) e fonte de alimentação. A grande vantagem é simples e poderosa: <strong>a corrente é a mesma em todos os pontos do loop</strong>, independentemente da resistência do cabo, desde que o transmissor tenha tensão suficiente para manter o regime.</p>



<h3 class="wp-block-heading">Modelo elétrico do loop de corrente</h3>



<p class="wp-block-paragraph">Um loop típico pode ser modelado como:</p>



<ul class="wp-block-list">
<li>fonte de alimentação \(V_{loop}\),</li>



<li>transmissor de corrente (sensor),</li>



<li>resistência do cabo \(R_c\),</li>



<li>resistência de carga \(R_b\) (burden resistor, onde a corrente é convertida em tensão),</li>



<li>eventualmente dispositivos intermediários (isoladores, barreiras).</li>
</ul>



<p class="wp-block-paragraph">A tensão total necessária para o loop funcionar corretamente é:</p>



<p class="wp-block-paragraph">\[<br>V_{loop} \ge V_{tx} + I \cdot (R_c + R_b)<br>\]



<p class="wp-block-paragraph">onde:</p>



<ul class="wp-block-list">
<li>\(V_{tx}\) é a tensão mínima de conformidade do transmissor,</li>



<li>\(I\) é a corrente do loop (entre 4 e 20 mA).</li>
</ul>



<p class="wp-block-paragraph">Se essa condição for satisfeita, <strong>a corrente permanece correta</strong>, mesmo com variações de resistência do cabo, oxidação de contatos ou distâncias longas.</p>



<h3 class="wp-block-heading">O conceito de “zero vivo” (4 mA)</h3>



<p class="wp-block-paragraph">Diferentemente de um sistema 0–20 mA, o uso de <strong>4 mA como zero</strong> não é arbitrário. Ele resolve dois problemas fundamentais:</p>



<ol class="wp-block-list">
<li><strong>Detecção de falhas</strong>
<ul class="wp-block-list">
<li>0 mA → fio rompido, transmissor sem alimentação ou falha grave.</li>



<li>4 mA → zero físico medido, sistema operando normalmente.</li>
</ul>
</li>



<li><strong>Alimentação do próprio sensor</strong><br>Em muitos casos, o transmissor é <strong>alimentado pelo próprio loop</strong> (<em>loop-powered</em>). Os 4 mA mínimos garantem energia suficiente para a eletrônica interna.</li>
</ol>



<p class="wp-block-paragraph">O escalonamento linear clássico é:</p>



<p class="wp-block-paragraph">\[<br>y = y_{\min} + \frac{(I &#8211; 4,\text{mA})}{16,\text{mA}} \cdot (y_{\max} &#8211; y_{\min})<br>\]



<p class="wp-block-paragraph">Por exemplo, em um sensor de pressão de 0–100 bar:</p>



<ul class="wp-block-list">
<li>4 mA → 0 bar</li>



<li>12 mA → 50 bar</li>



<li>20 mA → 100 bar</li>
</ul>



<h3 class="wp-block-heading">Conversão corrente → tensão (burden resistor)</h3>



<p class="wp-block-paragraph">Na maioria dos sistemas embarcados e CLPs, o ADC mede <strong>tensão</strong>, não corrente. Por isso, usa-se um resistor de carga \(R_b\) para converter corrente em tensão:</p>



<p class="wp-block-paragraph">\[<br>V = I \cdot R_b<br>\]



<p class="wp-block-paragraph">Valores típicos:</p>



<ul class="wp-block-list">
<li>\(R_b = 250,\Omega\) → 4–20 mA vira <strong>1–5 V</strong></li>



<li>\(R_b = 100,\Omega\) → 0,4–2 V</li>
</ul>



<p class="wp-block-paragraph">A escolha de \(R_b\) é crítica:</p>



<ul class="wp-block-list">
<li>valores altos aumentam a tensão disponível para o ADC,</li>



<li>valores altos também aumentam a tensão exigida do loop (impactando a conformidade).</li>
</ul>



<h3 class="wp-block-heading">Imunidade a ruído: por que funciona melhor</h3>



<p class="wp-block-paragraph">Ruídos eletromagnéticos tendem a se manifestar como <strong>tensões induzidas</strong> no cabo. Em um sistema de corrente:</p>



<ul class="wp-block-list">
<li>pequenas tensões parasitas <strong>não alteram significativamente a corrente</strong> do loop;</li>



<li>o transmissor “força” a corrente correta dentro de sua faixa de conformidade.</li>
</ul>



<p class="wp-block-paragraph">Matematicamente, um ruído de tensão \(V_n\) somado ao loop gera uma variação de corrente:</p>



<p class="wp-block-paragraph">\[<br>\Delta I = \frac{V_n}{R_{total}}<br>\]



<p class="wp-block-paragraph">Como \(R_{total}\) costuma ser relativamente alto (centenas de ohms), \(\Delta I\) é pequeno, tornando o sistema naturalmente mais imune.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="520" height="346" src="https://mcu.tec.br/wp-content/uploads/2025/12/image-30.png" alt="" class="wp-image-1004" srcset="https://mcu.tec.br/wp-content/uploads/2025/12/image-30.png 520w, https://mcu.tec.br/wp-content/uploads/2025/12/image-30-300x200.png 300w" sizes="(max-width: 520px) 100vw, 520px" /><figcaption class="wp-element-caption">Obtido em: https://www.newtoncbraga.com.br/projetos/7578-conversor-4-20-ma-para-0-5-v-art1082.html</figcaption></figure>
</div>


<h3 class="wp-block-heading">Quando 4–20 mA é a melhor escolha</h3>



<p class="wp-block-paragraph">O padrão 4–20 mA é preferido quando:</p>



<ul class="wp-block-list">
<li>há <strong>longas distâncias</strong> (dezenas ou centenas de metros);</li>



<li>o ambiente é <strong>eletricamente agressivo</strong>;</li>



<li>é necessário <strong>diagnóstico simples de falhas</strong>;</li>



<li>sensores precisam ser alimentados pelo próprio sinal;</li>



<li>confiabilidade é mais importante que simplicidade.</li>
</ul>



<p class="wp-block-paragraph">Essa robustez explica por que, mesmo com fieldbuses modernos e Ethernet industrial, <strong>4–20 mA continua extremamente atual</strong>.</p>



<h2 class="wp-block-heading">Comparação direta: 0–10 V vs 4–20 mA e impactos no projeto de hardware e firmware</h2>



<p class="wp-block-paragraph">Depois de entender cada padrão isoladamente, a decisão de engenharia passa a ser <strong>comparativa e contextual</strong>. Não existe “melhor padrão absoluto”; existe o <strong>mais adequado ao cenário físico, elétrico e ao nível de confiabilidade exigido</strong>. Aqui vale olhar não só o sensor, mas o <em>sistema completo</em>: cabeamento, entradas analógicas, ADC, referência, firmware e manutenção.</p>



<h3 class="wp-block-heading">Comparação elétrica fundamental</h3>



<p class="wp-block-paragraph">No <strong>0–10 V</strong>, o sistema depende fortemente de uma <strong>referência comum de terra</strong> entre sensor e receptor. Qualquer diferença de potencial entre GNDs aparece diretamente como erro de medição. Em ambientes industriais, isso é frequente devido a:</p>



<ul class="wp-block-list">
<li>correntes de retorno pelo terra,</li>



<li>malhas de aterramento,</li>



<li>equipamentos de potência próximos.</li>
</ul>



<p class="wp-block-paragraph">Já no <strong>4–20 mA</strong>, o loop é essencialmente <strong>diferencial em corrente</strong>. A referência de terra perde importância relativa, porque a variável medida é a corrente no circuito em série. Isso reduz drasticamente problemas de <em>ground loop</em>.</p>



<h3 class="wp-block-heading">Comparação matemática do erro</h3>



<p class="wp-block-paragraph"><strong>Erro por resistência de cabo</strong></p>



<ul class="wp-block-list">
<li>0–10 V:<br>\[<br>\varepsilon_V \approx I_{in} \cdot R_c<br>\]<br>Onde \(I_{in}\) é a corrente drenada pela entrada. Se a impedância de entrada não for suficientemente alta, o erro cresce com o comprimento do cabo.</li>



<li>4–20 mA:<br>\[<br>\varepsilon_I \approx 0 \quad (\text{desde que haja conformidade})<br>\]<br>A resistência do cabo só “consome” tensão, não altera a corrente medida.</li>
</ul>



<p class="wp-block-paragraph"><strong>Erro por ruído</strong></p>



<ul class="wp-block-list">
<li>0–10 V:<br>\[<br>V_{med} = V_{sinal} + V_{ruído}<br>\]</li>



<li>4–20 mA:<br>\[<br>\Delta I = \frac{V_{ruído}}{R_{loop}}<br>\]<br>Com \(R_{loop}\) elevado, a variação de corrente é pequena.</li>
</ul>



<h3 class="wp-block-heading">Impacto no projeto de hardware embarcado</h3>



<p class="wp-block-paragraph"><strong>Entradas analógicas (ADC)</strong></p>



<ul class="wp-block-list">
<li>0–10 V: geralmente exige <strong>divisor resistivo</strong> ou amplificador para adaptar ao range típico do ADC (0–3,3 V ou 0–5 V). Isso adiciona erro de ganho e offset.</li>



<li>4–20 mA: basta um <strong>resistor de precisão</strong> (ex.: 250 Ω, 0,1%) e, opcionalmente, um filtro RC simples. A conversão corrente→tensão é extremamente previsível.</li>
</ul>



<p class="wp-block-paragraph"><strong>Proteção elétrica</strong></p>



<ul class="wp-block-list">
<li>0–10 V: mais sensível a surtos e ESD, pois a entrada “vê” diretamente a tensão do campo.</li>



<li>4–20 mA: o loop naturalmente limita corrente; ainda assim, proteção contra sobretensão é aplicada, mas o sistema tende a ser mais tolerante.</li>
</ul>



<h3 class="wp-block-heading">Impacto no firmware</h3>



<p class="wp-block-paragraph">No firmware, ambos acabam convergindo para a mesma lógica: <strong>ler um ADC e aplicar um escalonamento linear</strong>. A diferença está na confiabilidade do dado bruto.</p>



<p class="wp-block-paragraph">Exemplo conceitual comum:</p>



<p class="wp-block-paragraph">\[<br>y = y_{\min} + \frac{(x &#8211; x_{\min})}{(x_{\max} &#8211; x_{\min})}(y_{\max} &#8211; y_{\min})<br>\]



<p class="wp-block-paragraph">Onde:</p>



<ul class="wp-block-list">
<li>em 0–10 V, (x) é a tensão medida,</li>



<li>em 4–20 mA, (x) é a corrente (ou a tensão no burden resistor).</li>
</ul>



<p class="wp-block-paragraph">No entanto, no <strong>4–20 mA</strong>, o firmware ganha uma vantagem adicional:</p>



<ul class="wp-block-list">
<li>leituras <strong>abaixo de 3,8 mA</strong> podem ser tratadas como <strong>falha de campo</strong>, e não apenas “valor baixo”.<br>Isso simplifica diagnóstico, alarmes e estratégias de <em>fail-safe</em>.</li>
</ul>



<h3 class="wp-block-heading">Critérios práticos de escolha</h3>



<p class="wp-block-paragraph"><strong>Escolha 0–10 V quando:</strong></p>



<ul class="wp-block-list">
<li>o sensor está próximo ao controlador;</li>



<li>o ambiente é pouco ruidoso;</li>



<li>custo e simplicidade são prioritários;</li>



<li>o sistema é mais “máquina local” do que “planta industrial”.</li>
</ul>



<p class="wp-block-paragraph"><strong>Escolha 4–20 mA quando:</strong></p>



<ul class="wp-block-list">
<li>há longas distâncias de cabo;</li>



<li>existe forte interferência eletromagnética;</li>



<li>confiabilidade e diagnóstico são críticos;</li>



<li>sensores precisam ser alimentados pelo próprio sinal;</li>



<li>o sistema faz parte de uma planta industrial maior.</li>
</ul>



<p class="wp-block-paragraph">Essa análise explica por que, mesmo em projetos modernos com microcontroladores avançados e Ethernet industrial, <strong>o front-end analógico 4–20 mA continua sendo padrão de ouro</strong> no chão de fábrica.</p>



<h2 class="wp-block-heading">Integração prática com microcontroladores (STM32, ESP32): cálculo, front-end analógico e firmware</h2>



<p class="wp-block-paragraph">Ao integrar sensores <strong>0–10 V</strong> ou <strong>4–20 mA</strong> a microcontroladores, o desafio deixa de ser conceitual e passa a ser <strong>engenharia de interface</strong>: adaptar níveis elétricos ao ADC, preservar precisão, filtrar ruído e transformar a leitura bruta em uma variável física confiável no firmware.</p>



<h3 class="wp-block-heading">Integração de sensores 0–10 V</h3>



<p class="wp-block-paragraph">A maioria dos microcontroladores (STM32, ESP32, RP2040) possui ADCs com faixa máxima de <strong>3,3 V</strong> (alguns STM32 permitem 5 V externamente, mas o ADC interno continua limitado). Portanto, é necessário <strong>rebaixar a tensão</strong>.</p>



<p class="wp-block-paragraph"><strong>Divisor resistivo</strong><br>A solução mais simples é um divisor:</p>



<p class="wp-block-paragraph">\[<br>V_{ADC} = V_{in} \cdot \frac{R_2}{R_1 + R_2}<br>\]



<p class="wp-block-paragraph">Para mapear 0–10 V em 0–3,3 V:</p>



<p class="wp-block-paragraph">\[<br>\frac{R_2}{R_1 + R_2} = 0{,}33<br>\]



<p class="wp-block-paragraph">Um exemplo prático:</p>



<ul class="wp-block-list">
<li>\(R_1 = 20,k\Omega\)</li>



<li>\(R_2 = 10,k\Omega\)</li>
</ul>



<p class="wp-block-paragraph">Cuidados importantes:</p>



<ul class="wp-block-list">
<li>resistores de <strong>1% ou melhor</strong> (idealmente 0,1%);</li>



<li>impedância equivalente não muito alta, para não prejudicar o <em>sample-and-hold</em> do ADC;</li>



<li>uso de <strong>buffer com amplificador operacional</strong> se o cabo for longo ou a fonte tiver alta impedância.</li>
</ul>



<p class="wp-block-paragraph"><strong>Filtragem</strong><br>Um filtro RC simples antes do ADC ajuda muito:</p>



<p class="wp-block-paragraph">\[<br>f_c = \frac{1}{2\pi RC}<br>\]



<p class="wp-block-paragraph">Para sinais lentos (temperatura, nível), cortes entre <strong>5 Hz e 20 Hz</strong> são comuns.</p>



<h3 class="wp-block-heading">Integração de sensores 4–20 mA</h3>



<p class="wp-block-paragraph">Aqui o caminho é mais elegante e previsível.</p>



<p class="wp-block-paragraph"><strong>Resistor de carga (burden)</strong><br>Escolhendo \(R_b = 250,\Omega\):</p>



<p class="wp-block-paragraph">\[<br>V = I \cdot R_b<br>\]



<ul class="wp-block-list">
<li>4 mA → 1,0 V</li>



<li>20 mA → 5,0 V</li>
</ul>



<p class="wp-block-paragraph">Se o ADC for de 3,3 V, duas opções surgem:</p>



<ol class="wp-block-list">
<li>usar \(R_b = 165,\Omega\) → 0,66–3,3 V</li>



<li>manter 250 Ω e usar divisor/buffer.</li>
</ol>



<p class="wp-block-paragraph">A primeira opção costuma ser preferida pela simplicidade.</p>



<p class="wp-block-paragraph"><strong>Potência do resistor</strong><br>A potência dissipada é:</p>



<p class="wp-block-paragraph">\[<br>P = I^2 \cdot R<br>\]



<p class="wp-block-paragraph">No pior caso (20 mA, 250 Ω):</p>



<p class="wp-block-paragraph">\[<br>P = (0{,}02)^2 \cdot 250 = 0{,}1,W<br>\]



<p class="wp-block-paragraph">Logo, usa-se resistor de <strong>0,25 W ou maior</strong>, com baixa deriva térmica.</p>



<h3 class="wp-block-heading">Conversão no firmware</h3>



<p class="wp-block-paragraph">No firmware, a leitura do ADC ((N) bits) gera um valor digital (D):</p>



<p class="wp-block-paragraph">\[<br>V_{ADC} = \frac{D}{2^N &#8211; 1} \cdot V_{ref}<br>\]



<p class="wp-block-paragraph">Para 4–20 mA:</p>



<p class="wp-block-paragraph">\[<br>I = \frac{V_{ADC}}{R_b}<br>\]



<p class="wp-block-paragraph">E o escalonamento final:</p>



<p class="wp-block-paragraph">\[<br>y = y_{\min} + \frac{(I &#8211; 4,\text{mA})}{16,\text{mA}}(y_{\max} &#8211; y_{\min})<br>\]



<p class="wp-block-paragraph">Boas práticas de firmware:</p>



<ul class="wp-block-list">
<li>rejeitar leituras abaixo de <strong>3,8 mA</strong> (falha);</li>



<li>filtrar por média móvel ou filtro IIR simples;</li>



<li>separar claramente <strong>aquisição</strong>, <strong>conversão</strong> e <strong>lógica de controle</strong>.</li>
</ul>



<h3 class="wp-block-heading">Layout e EMC</h3>



<p class="wp-block-paragraph">Independentemente do padrão:</p>



<ul class="wp-block-list">
<li>mantenha trilhas analógicas longe de PWM, clocks e barramentos rápidos;</li>



<li>use <strong>plano de terra contínuo</strong>;</li>



<li>aterramento da blindagem do cabo em <strong>um único ponto</strong>;</li>



<li>considere isolamento galvânico em ambientes severos.</li>
</ul>



<p class="wp-block-paragraph">Esses cuidados fazem mais diferença do que aumentar bits de ADC.</p>



<h2 class="wp-block-heading">Seção 6 — Conclusão técnica: por que 0–10 V e 4–20 mA continuam dominantes na indústria</h2>



<p class="wp-block-paragraph">Mesmo com a evolução de barramentos digitais industriais, Ethernet determinística e sensores inteligentes, os padrões <strong>0–10 V</strong> e <strong>4–20 mA</strong> permanecem amplamente utilizados porque resolvem, de forma simples e comprovada, um problema central da automação: <strong>transportar informação analógica com previsibilidade em ambientes hostis</strong>. Eles não dependem de pilhas de protocolo, não exigem sincronismo complexo e falham de maneira compreensível para técnicos e engenheiros de campo.</p>



<p class="wp-block-paragraph">O <strong>0–10 V</strong> sobrevive pela simplicidade. Ele é direto, fácil de depurar com um multímetro comum e suficiente para aplicações locais, máquinas compactas e painéis onde o controle de aterramento e ruído é viável. Em termos de engenharia, é um padrão que funciona bem quando o sistema é tratado como um todo — sensor, cabo, referência e ADC — e quando as limitações são conscientemente aceitas.</p>



<p class="wp-block-paragraph">Já o <strong>4–20 mA</strong> permanece como referência em confiabilidade porque sua robustez é estrutural, não circunstancial. A imunidade a ruído, a tolerância a longas distâncias, a independência de referência de terra e o conceito de <strong>zero vivo</strong> fazem dele um padrão naturalmente alinhado com requisitos de segurança, manutenção e diagnóstico. Em projetos industriais reais, isso se traduz em menos paradas, menos ambiguidades e decisões mais claras no firmware e na operação.</p>



<p class="wp-block-paragraph">Do ponto de vista de sistemas embarcados, esses padrões também ensinam uma lição importante: <strong>engenharia de sinal vem antes de sofisticação de processamento</strong>. Um ADC de alta resolução ou um algoritmo avançado não compensam um front-end mal escolhido. É por isso que, mesmo em arquiteturas modernas com STM32, ESP32 ou SoCs industriais, o caminho analógico clássico continua sendo a fundação.</p>



<p class="wp-block-paragraph">Em resumo:</p>



<ul class="wp-block-list">
<li>0–10 V é uma solução eficiente quando simplicidade e proximidade física são garantidas.</li>



<li>4–20 mA é a escolha natural quando confiabilidade, diagnóstico e ambiente industrial severo entram em jogo.</li>



<li>a escolha correta reduz complexidade no hardware, no firmware e na manutenção ao longo de toda a vida útil do sistema.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Materiais para SEO</h2>



<h3 class="wp-block-heading">Título do artigo</h3>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">Frase chave foco</h3>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://mcu.tec.br/infraestrutura/por-que-sensores-industriais-usam-0-10-v-e-4-20-ma-fundamentos-formulas-e-aplicacoes-praticas/">Por que sensores industriais usam 0–10 V e 4–20 mA? Fundamentos, fórmulas e aplicações práticas</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1003</post-id>	</item>
		<item>
		<title>Comparação das Séries do Microcontrolador ESP32</title>
		<link>https://mcu.tec.br/microcontroladores/comparacao-das-series-do-microcontrolador-esp32/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comparacao-das-series-do-microcontrolador-esp32</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 31 Aug 2025 21:26:51 +0000</pubDate>
				<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[esp]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[espressif]]></category>
		<category><![CDATA[RISC]]></category>
		<category><![CDATA[RISC-V]]></category>
		<category><![CDATA[SoCs]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=794</guid>

					<description><![CDATA[<p>Comparação das Séries do Microcontrolador ESP32</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/comparacao-das-series-do-microcontrolador-esp32/">Comparação das Séries do Microcontrolador ESP32</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image alignfull size-large"><img decoding="async" width="1024" height="492" src="https://mcu.tec.br/wp-content/uploads/2025/08/Comparacao-das-Series-do-Microcontrolador-ESP32-1024x492.png" alt="Comparação das Séries do Microcontrolador ESP32" class="wp-image-795" srcset="https://mcu.tec.br/wp-content/uploads/2025/08/Comparacao-das-Series-do-Microcontrolador-ESP32-1024x492.png 1024w, https://mcu.tec.br/wp-content/uploads/2025/08/Comparacao-das-Series-do-Microcontrolador-ESP32-300x144.png 300w, https://mcu.tec.br/wp-content/uploads/2025/08/Comparacao-das-Series-do-Microcontrolador-ESP32-768x369.png 768w, https://mcu.tec.br/wp-content/uploads/2025/08/Comparacao-das-Series-do-Microcontrolador-ESP32-1536x738.png 1536w, https://mcu.tec.br/wp-content/uploads/2025/08/Comparacao-das-Series-do-Microcontrolador-ESP32.png 2000w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Comparação das Séries do Microcontrolador ESP32</figcaption></figure><p>The post <a href="https://mcu.tec.br/microcontroladores/comparacao-das-series-do-microcontrolador-esp32/">Comparação das Séries do Microcontrolador ESP32</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">794</post-id>	</item>
		<item>
		<title>Espressif SoC Portfolio</title>
		<link>https://mcu.tec.br/microcontroladores/espressif-soc-portfolio/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=espressif-soc-portfolio</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Sun, 31 Aug 2025 21:21:58 +0000</pubDate>
				<category><![CDATA[microcontroladores]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[espressif]]></category>
		<category><![CDATA[Portfolio]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=791</guid>

					<description><![CDATA[<p>Espressif SoC Portfolio</p>
<p>The post <a href="https://mcu.tec.br/microcontroladores/espressif-soc-portfolio/">Espressif SoC Portfolio</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image alignfull size-large"><img loading="lazy" decoding="async" width="757" height="1024" src="https://mcu.tec.br/wp-content/uploads/2025/08/Espressif-SoC-Portfolio-757x1024.jpg" alt="Espressif SoC Portfolio.jpg" class="wp-image-792" srcset="https://mcu.tec.br/wp-content/uploads/2025/08/Espressif-SoC-Portfolio-757x1024.jpg 757w, https://mcu.tec.br/wp-content/uploads/2025/08/Espressif-SoC-Portfolio-222x300.jpg 222w, https://mcu.tec.br/wp-content/uploads/2025/08/Espressif-SoC-Portfolio-768x1038.jpg 768w, https://mcu.tec.br/wp-content/uploads/2025/08/Espressif-SoC-Portfolio.jpg 892w" sizes="(max-width: 757px) 100vw, 757px" /><figcaption class="wp-element-caption">Espressif SoC Portfolio</figcaption></figure><p>The post <a href="https://mcu.tec.br/microcontroladores/espressif-soc-portfolio/">Espressif SoC Portfolio</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">791</post-id>	</item>
		<item>
		<title>Detecção de Humanos e Obstáculos com HMMD: Comparando Tecnologias FMCW e LiDAR</title>
		<link>https://mcu.tec.br/geral/deteccao-de-humanos-e-obstaculos-com-hmmd-comparando-tecnologias-fmcw-e-lidar/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deteccao-de-humanos-e-obstaculos-com-hmmd-comparando-tecnologias-fmcw-e-lidar</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 11 Apr 2025 15:29:01 +0000</pubDate>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[Sensores]]></category>
		<category><![CDATA[detecção de humanos com HMMD]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[inteligência embarcada]]></category>
		<category><![CDATA[LiDAR]]></category>
		<category><![CDATA[micro movimentação]]></category>
		<category><![CDATA[obstáculos estáticos]]></category>
		<category><![CDATA[ondas contínuas]]></category>
		<category><![CDATA[presença humana]]></category>
		<category><![CDATA[radar fmcw]]></category>
		<category><![CDATA[radar para IoT]]></category>
		<category><![CDATA[radar vs lidar]]></category>
		<category><![CDATA[respiração]]></category>
		<category><![CDATA[sensores 24GHz]]></category>
		<category><![CDATA[sistema embarcado]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[transformada de fourier]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=350</guid>

					<description><![CDATA[<div class="members-access-error">Faça o login e <strong>solicite acesso</strong> ao artigo conforme os grupos privados que faz parte.</div>
<p>The post <a href="https://mcu.tec.br/geral/deteccao-de-humanos-e-obstaculos-com-hmmd-comparando-tecnologias-fmcw-e-lidar/">Detecção de Humanos e Obstáculos com HMMD: Comparando Tecnologias FMCW e LiDAR</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="members-access-error">Faça o login e <strong>solicite acesso</strong> ao artigo conforme os grupos privados que faz parte.</div>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">350</post-id>	</item>
		<item>
		<title>Introdução ao Linker em Sistemas Embarcados</title>
		<link>https://mcu.tec.br/geral/introducao-ao-linker-em-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introducao-ao-linker-em-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Mon, 31 Mar 2025 18:12:23 +0000</pubDate>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[arquivo ld]]></category>
		<category><![CDATA[esp-idf]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[firmware embarcado]]></category>
		<category><![CDATA[ld file]]></category>
		<category><![CDATA[linker]]></category>
		<category><![CDATA[linker ESP32]]></category>
		<category><![CDATA[linker map]]></category>
		<category><![CDATA[linker script]]></category>
		<category><![CDATA[linker STM32]]></category>
		<category><![CDATA[mapeamento de memória]]></category>
		<category><![CDATA[memória flash]]></category>
		<category><![CDATA[memória RAM]]></category>
		<category><![CDATA[memória ROM]]></category>
		<category><![CDATA[partitions.csv]]></category>
		<category><![CDATA[script de linker]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[stm32]]></category>
		<category><![CDATA[stm32cubeide]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=295</guid>

					<description><![CDATA[<p>Entenda como funciona o linker e os arquivos .ld em sistemas embarcados como STM32 e ESP32. Veja exemplos práticos, o uso do arquivo partitions.csv e aprenda a customizar o mapeamento de memória do seu firmware.</p>
<p>The post <a href="https://mcu.tec.br/geral/introducao-ao-linker-em-sistemas-embarcados/">Introdução ao Linker em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">O Linker é uma das etapas mais críticas no processo de construção de um firmware para sistemas embarcados. Sua função é consolidar diversos arquivos de código objeto em um único arquivo executável, organizando como os dados e instruções serão posicionados na memória do microcontrolador. Em arquiteturas como a do <strong>STM32</strong> (baseada em ARM Cortex-M) e do <strong>ESP32</strong> (baseada em Tensilica Xtensa), o controle de onde e como os segmentos de código e dados são alocados é fundamental para o correto funcionamento do sistema. Esse controle é feito por meio de <strong>scripts de Linker (.ld)</strong> e, no caso do ESP32, também com o <strong>arquivo <code>partitions.csv</code></strong>, que define o particionamento da memória Flash.</p>



<h3 class="wp-block-heading"><strong>Objetivo da Seção</strong></h3>



<p class="wp-block-paragraph">Apresentar uma visão geral do papel do Linker no processo de construção de firmware, destacando:</p>



<ul class="wp-block-list">
<li>O que é o Linker e qual sua função;</li>



<li>Como ele é usado para posicionar variáveis e trechos de código em regiões específicas da memória;</li>



<li>A diferença entre seu uso em plataformas STM32 e ESP32;</li>



<li>A importância dos arquivos <code>.ld</code> e <code>partitions.csv</code> no projeto embarcado.</li>
</ul>



<h3 class="wp-block-heading"><strong>Conceito Básico</strong></h3>



<p class="wp-block-paragraph">Durante a compilação, o código-fonte (em C ou C++) é transformado em arquivos objeto <code>.o</code>. O Linker pega esses arquivos e os combina, resolvendo endereços de funções, referências cruzadas entre variáveis globais e posicionando tudo de acordo com o layout de memória definido pelo script <code>.ld</code>. Esse script age como um <strong>mapa da memória</strong>, especificando as regiões onde devem ser colocados:</p>



<ul class="wp-block-list">
<li>Código (<code>.text</code>);</li>



<li>Dados inicializados (<code>.data</code>);</li>



<li>Dados não inicializados (<code>.bss</code>);</li>



<li>Pilha e heap;</li>



<li>Tabelas de vetores de interrupção e memória de inicialização.</li>
</ul>



<h3 class="wp-block-heading"><strong>Plataformas em Destaque</strong></h3>



<ul class="wp-block-list">
<li><strong>STM32</strong>: Usa arquivos <code>.ld</code> customizados que refletem a memória RAM e Flash, com seções bem definidas para bootloaders, vetores de interrupção, código principal, etc.</li>



<li><strong>ESP32</strong>: Usa também arquivos <code>.ld</code>, mas sua complexidade aumenta com a presença de múltiplas CPUs, caches e particionamento de memória Flash definido pelo <code>partitions.csv</code>.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Estrutura de um Arquivo LD: seções e símbolos</strong></h2>



<p class="wp-block-paragraph">O script do Linker, geralmente com extensão <code>.ld</code>, descreve como o firmware será disposto na memória do dispositivo. Ele segue a sintaxe da linguagem de scripts do GNU Linker (<code>ld</code>) e define <strong>regiões de memória física</strong> e a <strong>atribuição de seções do programa</strong> nessas regiões. Essa estrutura garante que o código e os dados sejam colocados em áreas apropriadas da RAM e Flash.</p>



<h3 class="wp-block-heading"><strong>Definindo a Memória</strong></h3>



<p class="wp-block-paragraph">No início do arquivo <code>.ld</code>, define-se o <strong>layout físico da memória</strong> com a diretiva <code>MEMORY</code>. Essa seção especifica os nomes, tamanhos e endereços base da RAM, Flash e outras regiões, como SRAM2 ou CCM no STM32, ou RTC_SLOW na RAM do ESP32.</p>



<p class="wp-block-paragraph"><strong>Exemplo – STM32:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="MEMORY
{
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 128K
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">MEMORY</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">FLASH</span><span style="color: #D8DEE9FF"> (rx) </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> ORIGIN = 0x08000000, LENGTH = 512K</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">RAM</span><span style="color: #D8DEE9FF"> (xrw)  </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> ORIGIN = 0x20000000, LENGTH = 128K</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Exemplo – ESP32:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="MEMORY
{
  iram0_0_seg (RX) : org = 0x40080000, len = 0x20000
  dram0_0_seg (RW) : org = 0x3FFAE000, len = 0x20000
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">MEMORY</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">iram0_0_seg</span><span style="color: #D8DEE9FF"> (RX) </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> org = 0x40080000, len = 0x20000</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">dram0_0_seg</span><span style="color: #D8DEE9FF"> (RW) </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> org = 0x3FFAE000, len = 0x20000</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><strong>Seções Padrão</strong></h3>



<p class="wp-block-paragraph">A diretiva <code>SECTIONS</code> define como as seções do código objeto (geradas pelo compilador) são mapeadas nas regiões de memória definidas anteriormente.</p>



<h4 class="wp-block-heading">Principais seções:</h4>



<ul class="wp-block-list">
<li><code>.isr_vector</code>: Vetor de interrupções (normalmente colocado no início da Flash).</li>



<li><code>.text</code>: Código do programa.</li>



<li><code>.rodata</code>: Dados somente leitura (constantes).</li>



<li><code>.data</code>: Dados inicializados na RAM.</li>



<li><code>.bss</code>: Variáveis globais não inicializadas (zeradas na inicialização).</li>



<li><code>.heap</code> / <code>.stack</code>: Reservas para alocação dinâmica e pilha de execução.</li>
</ul>



<p class="wp-block-paragraph"><strong>Trecho típico:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SECTIONS
{
  .text :
  {
    KEEP(*(.isr_vector))
    *(.text*)
    *(.rodata*)
  } &gt; FLASH

  .data : AT (ADDR(.text) + SIZEOF(.text))
  {
    *(.data*)
  } &gt; RAM

  .bss :
  {
    *(.bss*)
    *(COMMON)
  } &gt; RAM
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">SECTIONS</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">.text</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">KEEP(*(.isr_vector</span><span style="color: #D8DEE9FF">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">*(.text*</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">*(.rodata*</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> FLASH</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">.data</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">AT</span><span style="color: #D8DEE9FF"> (ADDR(.text) + SIZEOF</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">.text</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">*(.data*</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> RAM</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">.bss</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">*(.bss*</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">*(COMMON</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> RAM</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><strong>Símbolos Especiais</strong></h3>



<p class="wp-block-paragraph">Os scripts <code>.ld</code> frequentemente definem símbolos que serão usados no código C para indicar, por exemplo, o início e fim da RAM, do stack, ou a posição de carga de dados:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="_end = .;
_estack = ORIGIN(RAM) + LENGTH(RAM);
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">_end</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #88C0D0">_estack</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ORIGIN</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">RAM</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">LENGTH</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">RAM</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">No código C, podem ser declarados como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="extern uint32_t _estack;
extern uint32_t _end;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">extern</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">_estack</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #88C0D0">extern</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">uint32_t</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">_end</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><strong>Observações Importantes</strong></h3>



<ul class="wp-block-list">
<li>A ordem das seções é essencial: o que estiver listado primeiro será posicionado primeiro na memória.</li>



<li>A diretiva <code>KEEP()</code> impede que o Linker remova seções não referenciadas, comum em vetores de interrupção.</li>



<li>A diretiva <code>AT()</code> é usada para indicar onde os dados residem na Flash antes de serem copiados para a RAM.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Diferenças entre os arquivos LD no STM32 e no ESP32</strong></h2>



<p class="wp-block-paragraph">Embora tanto o STM32 quanto o ESP32 utilizem scripts <code>.ld</code> para definir o mapeamento de memória, existem diferenças estruturais e conceituais importantes entre essas plataformas. Essas diferenças são motivadas pelas arquiteturas distintas de hardware, modelos de inicialização e tipos de memória disponíveis.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>STM32 – Arquitetura Simples e Direta</strong></h3>



<p class="wp-block-paragraph">O STM32, baseado na arquitetura ARM Cortex-M, segue uma abordagem linear e previsível no mapeamento de memória. A memória Flash normalmente começa em <code>0x08000000</code>, e a RAM em <code>0x20000000</code>. A posição do vetor de interrupções (reset vector) é crucial, pois a CPU começa a executar a partir desse ponto após o reset.</p>



<p class="wp-block-paragraph"><strong>Características:</strong></p>



<ul class="wp-block-list">
<li>O arquivo <code>.ld</code> do STM32 é quase sempre dividido em <strong>FLASH</strong> e <strong>RAM</strong>;</li>



<li>Contém o vetor de interrupções na primeira posição (<code>.isr_vector</code>);</li>



<li>Define símbolos como <code>_estack</code> para controle da pilha;</li>



<li>Permite personalizações simples para bootloaders ou seções específicas de RAM (como DTCM, SRAM2, CCMRAM, etc.);</li>



<li>Ferramentas como STM32CubeIDE geram <code>.ld</code> automaticamente com base no modelo selecionado.</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo típico de layout:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="MEMORY
{
  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 512K
  RAM   (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">MEMORY</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">FLASH</span><span style="color: #D8DEE9FF"> (rx)  </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> ORIGIN = 0x08000000, LENGTH = 512K</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">RAM</span><span style="color: #D8DEE9FF">   (xrw) </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> ORIGIN = 0x20000000, LENGTH = 128K</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>ESP32 – Arquitetura Multinível e Particionada</strong></h3>



<p class="wp-block-paragraph">O ESP32 é mais complexo: possui múltiplos tipos de RAM (DRAM, IRAM, RTC RAM), cache externa e bootloader configurável. A memória Flash é externa e <strong>compartilhada entre o bootloader, partições de aplicativo, sistema de arquivos (SPIFFS/FFat) e NVS</strong> (armazenamento não-volátil).</p>



<p class="wp-block-paragraph"><strong>Características:</strong></p>



<ul class="wp-block-list">
<li>Utiliza <strong>vários arquivos <code>.ld</code></strong> para diferentes segmentos (<code>esp32.ld</code>, <code>memory.ld</code>, <code>sections.ld</code>, etc.);</li>



<li>Define múltiplas regiões: <code>iram0</code>, <code>dram0</code>, <code>rtc_slow</code>, <code>rtc_fast</code>, etc.;</li>



<li>Utiliza a diretiva <code>INCLUDE</code> para modularizar o layout;</li>



<li>Integra o conceito de <strong>partições</strong>, definidas no arquivo <code>partitions.csv</code>;</li>



<li>O bootloader da Espressif localiza a partição de aplicação na Flash e carrega o código para a IRAM ou executa diretamente da Flash (via cache).</li>
</ul>



<p class="wp-block-paragraph"><strong>Trecho exemplo de <code>esp32.ld</code>:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="MEMORY
{
  iram0_0_seg : org = 0x40080000, len = 0x20000
  dram0_0_seg : org = 0x3FFAE000, len = 0x20000
  rtc_slow_seg : org = 0x50000000, len = 0x2000
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">MEMORY</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">iram0_0_seg</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">org</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x40080000</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">len</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x20000</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">dram0_0_seg</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">org</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x3FFAE000</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">len</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x20000</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">rtc_slow_seg</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">org</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x50000000</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">len</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x2000</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Principais Diferenças Resumidas</strong></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Aspecto</th><th>STM32</th><th>ESP32</th></tr></thead><tbody><tr><td>Arquitetura</td><td>Cortex-M (monocore ou dual core)</td><td>Tensilica Xtensa (dual core + co-processador)</td></tr><tr><td>Memória Flash</td><td>Interna</td><td>Externa via SPI</td></tr><tr><td>RAM</td><td>Linear e simples</td><td>Vários tipos: DRAM, IRAM, RTC RAM</td></tr><tr><td>Arquivo <code>.ld</code></td><td>Simples, único</td><td>Fragmentado, com includes</td></tr><tr><td>Particionamento</td><td>Manual (caso de bootloaders)</td><td>Definido via <code>partitions.csv</code></td></tr><tr><td>Bootloader</td><td>Opcional ou fixo</td><td>Obrigatório e configurável</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Entendendo o partitions.csv no ESP32</strong></h2>



<h3 class="wp-block-heading"><strong>Resumo</strong></h3>



<p class="wp-block-paragraph">O arquivo <code>partitions.csv</code> é um componente essencial nos projetos com ESP32. Ele define como a memória Flash externa será <strong>particionada</strong> para armazenar diferentes partes do firmware, como o bootloader, a aplicação principal, o sistema de arquivos (SPIFFS, FATFS, LittleFS), armazenamento de chaves criptográficas, dados de calibragem de RF, entre outros. É o que garante que o firmware saiba onde cada bloco de dados deve ser gravado e lido na memória externa.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>O que é o <code>partitions.csv</code>?</strong></h3>



<p class="wp-block-paragraph">É um arquivo de texto, em formato <strong>CSV (Comma-Separated Values)</strong>, que define as partições da Flash para uso pelo bootloader e sistema operacional (no caso do ESP-IDF). Ele é convertido em um binário de tabela de partições que o bootloader carrega durante a inicialização.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Formato do Arquivo</strong></h3>



<p class="wp-block-paragraph">Cada linha do <code>partitions.csv</code> define uma partição com os seguintes campos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="nome, tipo, subtipo, endereço, tamanho, flags
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">nome,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tipo,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">subtipo,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">endereço,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tamanho,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">flags</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Exemplo comum:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="# Nome      Tipo     Subtipo  Endereço   Tamanho    Flags
nvs         data     nvs      0x9000     0x5000
otadata     data     ota      0xe000     0x2000
app0        app      ota_0    0x10000    1M
app1        app      ota_1    0x110000   1M
spiffs      data     spiffs   0x210000   0xF0000
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Nome      Tipo     Subtipo  Endereço   Tamanho    Flags</span></span>
<span class="line"><span style="color: #88C0D0">nvs</span><span style="color: #D8DEE9FF">         </span><span style="color: #A3BE8C">data</span><span style="color: #D8DEE9FF">     </span><span style="color: #A3BE8C">nvs</span><span style="color: #D8DEE9FF">      </span><span style="color: #B48EAD">0x9000</span><span style="color: #D8DEE9FF">     </span><span style="color: #B48EAD">0x5000</span></span>
<span class="line"><span style="color: #88C0D0">otadata</span><span style="color: #D8DEE9FF">     </span><span style="color: #A3BE8C">data</span><span style="color: #D8DEE9FF">     </span><span style="color: #A3BE8C">ota</span><span style="color: #D8DEE9FF">      </span><span style="color: #B48EAD">0xe000</span><span style="color: #D8DEE9FF">     </span><span style="color: #B48EAD">0x2000</span></span>
<span class="line"><span style="color: #88C0D0">app0</span><span style="color: #D8DEE9FF">        </span><span style="color: #A3BE8C">app</span><span style="color: #D8DEE9FF">      </span><span style="color: #A3BE8C">ota_0</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">0x10000</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">M</span></span>
<span class="line"><span style="color: #88C0D0">app1</span><span style="color: #D8DEE9FF">        </span><span style="color: #A3BE8C">app</span><span style="color: #D8DEE9FF">      </span><span style="color: #A3BE8C">ota_1</span><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">0x110000</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">1</span><span style="color: #A3BE8C">M</span></span>
<span class="line"><span style="color: #88C0D0">spiffs</span><span style="color: #D8DEE9FF">      </span><span style="color: #A3BE8C">data</span><span style="color: #D8DEE9FF">     </span><span style="color: #A3BE8C">spiffs</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0x210000</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">0xF0000</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Campos Explicados</strong></h3>



<ul class="wp-block-list">
<li><strong>nome</strong>: Identificador da partição (pode ser usado no código C, por exemplo para montar SPIFFS).</li>



<li><strong>tipo</strong>:
<ul class="wp-block-list">
<li><code>app</code>: usado para partições de firmware.</li>



<li><code>data</code>: para armazenamento persistente (ex: NVS, SPIFFS).</li>
</ul>
</li>



<li><strong>subtipo</strong>:
<ul class="wp-block-list">
<li><code>factory</code>, <code>ota_0</code>, <code>ota_1</code>: partições de aplicação.</li>



<li><code>nvs</code>, <code>spiffs</code>, <code>fat</code>, <code>ota</code>, etc.: tipos específicos de dados.</li>
</ul>
</li>



<li><strong>endereço</strong>: onde na memória Flash essa partição começa (em hexadecimal).</li>



<li><strong>tamanho</strong>: em bytes ou usando sufixos (<code>K</code>, <code>M</code>).</li>



<li><strong>flags</strong>: parâmetros opcionais (ex: <code>encrypted</code> para criptografia).</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Como o partitions.csv é usado</strong></h3>



<ol class="wp-block-list">
<li>Durante a <strong>compilação</strong>, o arquivo é processado e gera um binário chamado <code>partition_table.bin</code>.</li>



<li>Durante a <strong>gravação (flash)</strong>, esse binário é gravado em um endereço fixo (tipicamente <code>0x8000</code>).</li>



<li>Durante o <strong>boot</strong>, o bootloader do ESP32 lê essa tabela para saber onde está cada partição.</li>



<li>No <strong>código</strong>, você pode montar sistemas de arquivos ou acessar partições diretamente com base nos nomes definidos no CSV.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Customização</strong></h3>



<p class="wp-block-paragraph">Você pode modificar o <code>partitions.csv</code> para incluir, por exemplo:</p>



<ul class="wp-block-list">
<li>Mais partições OTA para atualizações em lote;</li>



<li>Uma partição para armazenamento FAT montado via <code>esp_vfs_fat_mount</code>;</li>



<li>Uma partição para arquivos estáticos com LittleFS;</li>



<li>Tamanhos reduzidos para aplicações mínimas.</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo com FAT:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="storage     data     fat      0x300000   512K
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">storage</span><span style="color: #D8DEE9FF">     </span><span style="color: #A3BE8C">data</span><span style="color: #D8DEE9FF">     </span><span style="color: #A3BE8C">fat</span><span style="color: #D8DEE9FF">      </span><span style="color: #B48EAD">0x300000</span><span style="color: #D8DEE9FF">   </span><span style="color: #B48EAD">512</span><span style="color: #A3BE8C">K</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Estratégias de Construção de Arquivos LD: práticas e ferramentas</strong></h2>



<h3 class="wp-block-heading"><strong>Resumo</strong></h3>



<p class="wp-block-paragraph">A criação e manutenção de arquivos <code>.ld</code> pode ser feita manualmente ou gerenciada por ferramentas automáticas. Em sistemas embarcados, a escolha da estratégia depende da complexidade da aplicação, do ambiente de desenvolvimento e da necessidade de controle sobre o uso da memória. Nesta seção, exploramos como construir e adaptar arquivos de Linker para STM32 e ESP32, além das ferramentas que auxiliam no processo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Construção Manual de Arquivos <code>.ld</code></strong></h3>



<p class="wp-block-paragraph">A escrita manual é útil em projetos onde se deseja controle total sobre a organização de memória — especialmente para bootloaders, realocação de código crítico em RAM, ou para usar áreas especiais como DTCM, CCM ou RTC.</p>



<p class="wp-block-paragraph"><strong>Dicas práticas:</strong></p>



<ul class="wp-block-list">
<li>Sempre comece definindo corretamente as regiões com <code>MEMORY</code>.</li>



<li>Use <code>SECTIONS</code> para mapear precisamente o conteúdo dos binários.</li>



<li>Defina símbolos auxiliares (<code>_end</code>, <code>_stack_start</code>) para controle no código C.</li>



<li>Use <code>KEEP()</code> para evitar que o Linker remova trechos importantes como vetores de interrupção.</li>



<li>Comente abundantemente o arquivo <code>.ld</code> — erros silenciosos podem causar falhas difíceis de depurar.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Uso de Ferramentas:</strong></h3>



<h4 class="wp-block-heading"><strong>Para STM32:</strong></h4>



<ul class="wp-block-list">
<li><strong>STM32CubeIDE / STM32CubeMX</strong>:
<ul class="wp-block-list">
<li>Gera automaticamente arquivos <code>.ld</code> com base no modelo do microcontrolador selecionado.</li>



<li>Permite configuração de áreas específicas de memória (ex: RAM2, CCMRAM).</li>



<li>Reorganiza o linker script ao incluir bibliotecas HAL ou FreeRTOS.</li>
</ul>
</li>



<li><strong>GNU Arm Toolchain (<code>arm-none-eabi-ld</code>)</strong>:
<ul class="wp-block-list">
<li>O script <code>.ld</code> é passado na linha de comando usando <code>-T</code>.</li>



<li>Pode ser usado em Makefiles ou CMake para projetos personalizados.</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading"><strong>Para ESP32:</strong></h4>



<ul class="wp-block-list">
<li><strong>ESP-IDF</strong>:
<ul class="wp-block-list">
<li>Utiliza um conjunto modular de scripts <code>.ld</code> organizados em:
<ul class="wp-block-list">
<li><code>memory.ld</code>: define as regiões de memória disponíveis.</li>



<li><code>sections.ld</code>: organiza onde o código e dados são colocados.</li>



<li><code>esp32.ld</code>: script de entrada que inclui os anteriores.</li>
</ul>
</li>



<li>Permite criar <strong>fragmentos de linker (<code>ld</code> fragments)</strong> no diretório do componente para colocar variáveis em regiões específicas, como IRAM.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph"><strong>Exemplo de fragmento:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="myvar (noinit) : ALIGN(4)
{
  _myvar_start = .;
  KEEP(*(.myvar_section))
  _myvar_end = .;
} &gt; DRAM
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">myvar</span><span style="color: #D8DEE9FF"> (noinit) </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> ALIGN</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">4</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">_myvar_start</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">KEEP(*(.myvar_section</span><span style="color: #D8DEE9FF">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">_myvar_end</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> DRAM</span></span>
<span class="line"></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>idf.py linkmap</strong>:
<ul class="wp-block-list">
<li>Gera o mapa de ligação (<code>.map</code>) detalhado, útil para depuração de problemas de alocação de memória.</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Boas Práticas</strong></h3>



<ul class="wp-block-list">
<li>Sempre gere e revise o <strong>mapa de ligação (<code>.map</code>)</strong> após compilar. Ele mostra o endereço final de cada seção.</li>



<li>Valide o tamanho das regiões para evitar sobreposição.</li>



<li>Em projetos com <strong>OTA</strong>, certifique-se de que as partições app0/app1 não ultrapassem o tamanho máximo.</li>



<li>Use <code>ASSERT()</code> no script <code>.ld</code> para verificar restrições em tempo de link:</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ASSERT(SIZEOF(.data) < 0x2000, &quot;Data section too big!&quot;)
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">ASSERT(SIZEOF(.data</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> 0x2000, </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Data section too big!</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Casos Práticos: Customizando o Linker para necessidades reais</strong></h2>



<h3 class="wp-block-heading"><strong>Resumo</strong></h3>



<p class="wp-block-paragraph">Customizar o script de Linker permite criar soluções otimizadas para aplicações embarcadas que demandam desempenho, economia de energia ou acesso rápido à memória. A seguir, são apresentados exemplos reais de customizações em projetos com STM32 e ESP32, incluindo alocação de variáveis em regiões específicas, execução de código diretamente na RAM, buffers persistentes e uso de seções noinit.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Executar código diretamente na RAM (STM32)</strong></h3>



<p class="wp-block-paragraph">Para funções críticas em tempo real — como interrupções com baixa latência — pode ser necessário colocá-las na RAM, onde a execução é mais rápida que na Flash.</p>



<p class="wp-block-paragraph"><strong>Etapas:</strong></p>



<ol class="wp-block-list">
<li>Criar uma seção <code>.ramfunc</code> no script:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=".ramfunc :
{
  *(.ramfunc*)
} &gt; RAM
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">.ramfunc</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">*(.ramfunc*</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> RAM</span></span>
<span class="line"></span></code></pre></div>



<ol start="2" class="wp-block-list">
<li>Declarar a função no código com atributo:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="__attribute__((section(&quot;.ramfunc&quot;))) void critical_ISR(void) {
  // Código de alta prioridade
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">__attribute__((section(</span><span style="color: #88C0D0">&quot;.ramfunc&quot;</span><span style="color: #D8DEE9FF">))) void critical_ISR</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">void</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Código</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">alta</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">prioridade</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<ol start="3" class="wp-block-list">
<li>(Opcional) Garantir cópia da Flash para RAM durante a inicialização usando <code>AT()</code> e símbolos auxiliares para copiar os dados.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>2Criar buffers fixos em local específico da RAM (ESP32 e STM32)</strong></h3>



<p class="wp-block-paragraph">Se você precisa garantir que um buffer de DMA fique em uma região não cacheada da memória (ou alinhada), é possível forçar sua posição.</p>



<p class="wp-block-paragraph"><strong>ESP32 – usando fragmento de linker:</strong></p>



<ol class="wp-block-list">
<li>Crie um arquivo <code>linker_fragment.ld</code> no componente:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="__dma_buffer_start = .;
.dma_buffer (NOLOAD):
{
  . = ALIGN(32);
  KEEP(*(.dma_buffer))
  . = ALIGN(32);
} &gt; DRAM
__dma_buffer_end = .;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">__dma_buffer_start</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #88C0D0">.dma_buffer</span><span style="color: #D8DEE9FF"> (NOLOAD):</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ALIGN</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">32</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">KEEP(*(.dma_buffer</span><span style="color: #D8DEE9FF">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ALIGN</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">32</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> DRAM</span></span>
<span class="line"><span style="color: #88C0D0">__dma_buffer_end</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<ol start="2" class="wp-block-list">
<li>No código:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="__attribute__((section(&quot;.dma_buffer&quot;))) uint8_t dma_rx[256];
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">__attribute__((section(</span><span style="color: #88C0D0">&quot;.dma_buffer&quot;</span><span style="color: #D8DEE9FF">))) uint8_t dma_rx</span><span style="color: #ECEFF4">[</span><span style="color: #B48EAD">256</span><span style="color: #ECEFF4">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>3. Buffer persistente entre resets (seção <code>.noinit</code>)</strong></h3>



<p class="wp-block-paragraph">A seção <code>.noinit</code> impede que variáveis sejam zeradas na inicialização. Isso é útil para armazenar dados temporários entre resets, watchdogs ou soft reboots.</p>



<p class="wp-block-paragraph"><strong>Script LD:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=".noinit (NOLOAD):
{
  *(.noinit*)
} &gt; RAM
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">.noinit</span><span style="color: #D8DEE9FF"> (NOLOAD):</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">*(.noinit*</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> RAM</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><strong>Código C:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="__attribute__((section(&quot;.noinit&quot;))) uint32_t retained_counter;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">__attribute__((section(</span><span style="color: #88C0D0">&quot;.noinit&quot;</span><span style="color: #D8DEE9FF">))) uint32_t retained_counter</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Importante: você é responsável por inicializar essa variável, pois o C startup não o fará.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>4. Espaço reservado para bootloader ou firmware OTA</strong></h3>



<p class="wp-block-paragraph">Em projetos com bootloaders, você pode reservar o início da Flash para ele e mover o início da aplicação:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="MEMORY
{
  BOOTLOADER (rx) : ORIGIN = 0x08000000, LENGTH = 16K
  APP_FLASH  (rx) : ORIGIN = 0x08004000, LENGTH = 496K
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">MEMORY</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">BOOTLOADER</span><span style="color: #D8DEE9FF"> (rx) </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> ORIGIN = 0x08000000, LENGTH = 16K</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">APP_FLASH</span><span style="color: #D8DEE9FF">  (rx) </span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> ORIGIN = 0x08004000, LENGTH = 496K</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">E ajustar o início da seção <code>.text</code> para a nova região <code>APP_FLASH</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>5. Dividindo a RAM em blocos com finalidades distintas</strong></h3>



<p class="wp-block-paragraph">No STM32 com RAMs separadas (SRAM1, SRAM2), você pode mover buffers grandes para a RAM auxiliar:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="MEMORY
{
  RAM1 (xrw): ORIGIN = 0x20000000, LENGTH = 96K
  RAM2 (xrw): ORIGIN = 0x20018000, LENGTH = 32K
}

.bigbuffers (NOLOAD):
{
  *(.bigbuffer*)
} &gt; RAM2
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">MEMORY</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">RAM1</span><span style="color: #D8DEE9FF"> (xrw): ORIGIN = 0x20000000, LENGTH = 96K</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">RAM2</span><span style="color: #D8DEE9FF"> (xrw): ORIGIN = 0x20018000, LENGTH = 32K</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">.bigbuffers</span><span style="color: #D8DEE9FF"> (NOLOAD):</span></span>
<span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">*(.bigbuffer*</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> RAM2</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Esses exemplos ilustram o poder e a flexibilidade dos scripts de Linker quando bem utilizados. Customizá-los pode ser a chave para alcançar desempenho, estabilidade e segurança em sistemas embarcados críticos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><strong>Considerações Finais e Dicas de Diagnóstico</strong></h2>



<p class="wp-block-paragraph">A compreensão e personalização de scripts de Linker são habilidades essenciais para engenheiros de sistemas embarcados. Erros nesse estágio podem resultar em falhas silenciosas, corrupção de dados, mau uso de memória e comportamento imprevisível do firmware. Esta seção final destaca boas práticas, armadilhas comuns e ferramentas úteis para diagnóstico e validação do layout de memória.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Boas Práticas ao Trabalhar com <code>.ld</code></strong></h3>



<ul class="wp-block-list">
<li><strong>Comente extensivamente</strong> cada bloco do script para documentar a intenção de uso de cada região.</li>



<li><strong>Use símbolos nomeados</strong> (_start, _end, <em>stack_top</em>) para facilitar o acesso no código C.</li>



<li><strong>Divida responsabilidades</strong> em arquivos menores com <code>INCLUDE</code> (usado amplamente no ESP-IDF).</li>



<li><strong>Crie seções específicas</strong> para dados críticos, buffers, código de interrupção ou dados de boot.</li>



<li><strong>Teste variações de layout</strong> com segurança em projetos de bootloader + aplicação OTA.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Validação com o Arquivo <code>.map</code></strong></h3>



<p class="wp-block-paragraph">Após a compilação, o GCC gera um arquivo de <strong>mapa de ligação (<code>.map</code>)</strong>, contendo o endereço real de cada símbolo, função e variável alocada.</p>



<p class="wp-block-paragraph"><strong>Dicas para leitura do <code>.map</code>:</strong></p>



<ul class="wp-block-list">
<li>Verifique se há sobreposição entre seções;</li>



<li>Confirme se buffers grandes foram realmente colocados em RAM auxiliar;</li>



<li>Localize variáveis em <code>.bss</code> que estão ocupando muito espaço;</li>



<li>Confirme se a tabela de interrupções foi posicionada corretamente (ex: início da Flash).</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Uso de ASSERTs no Linker</strong></h3>



<p class="wp-block-paragraph">Para evitar erros silenciosos, você pode usar <code>ASSERT()</code> no script <code>.ld</code> para impor limites:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ASSERT(SIZEOF(.data) <= 0x2000, &quot;Erro: a seção .data ultrapassou o limite da RAM!&quot;)
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">ASSERT(SIZEOF(.data</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF">= 0x2000, </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erro: a seção .data ultrapassou o limite da RAM!</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Isso impede que a compilação gere um firmware que vá ultrapassar o espaço físico disponível.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Ferramentas de Apoio</strong></h3>



<ul class="wp-block-list">
<li><strong>objdump (<code>arm-none-eabi-objdump -h</code>)</strong>: mostra as seções e onde foram colocadas.</li>



<li><strong>nm (<code>arm-none-eabi-nm</code>)</strong>: lista símbolos com endereços — útil para variáveis específicas.</li>



<li><strong>size (<code>arm-none-eabi-size</code>)</strong>: resume o tamanho das seções <code>.text</code>, <code>.data</code> e <code>.bss</code>.</li>



<li><strong>idf.py size-components</strong> (ESP32): mostra quanto cada componente ocupa na Flash/RAM.</li>



<li><strong>STM32CubeIDE</strong>: gera visualizações gráficas do uso de memória, além de adaptar o linker automaticamente.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Armadilhas Comuns</strong></h3>



<ul class="wp-block-list">
<li>Esquecer de alinhar buffers de DMA (pode causar falha silenciosa).</li>



<li>Colocar código na IRAM sem definir corretamente as seções no ESP32.</li>



<li>Deixar variáveis grandes na <code>.data</code> (copiadas da Flash para a RAM, consumindo tempo e espaço).</li>



<li>Não usar <code>NOLOAD</code> em seções como <code>.noinit</code>, resultando em perda de dados após o reset.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Conclusão</strong></h3>



<p class="wp-block-paragraph">Scripts de Linker não são apenas “detalhes técnicos”, mas componentes essenciais que controlam como o firmware funciona na prática. Dominar sua estrutura, lógica e sintaxe permite que você construa sistemas mais rápidos, estáveis e confiáveis — explorando ao máximo o hardware disponível, seja no robusto STM32 ou no versátil ESP32.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/geral/introducao-ao-linker-em-sistemas-embarcados/">Introdução ao Linker em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">295</post-id>	</item>
		<item>
		<title>Gateways que Integram Dados Ontológicos de Dispositivos Embarcados</title>
		<link>https://mcu.tec.br/algoritimos/gateways-que-integram-dados-ontologicos-de-dispositivos-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gateways-que-integram-dados-ontologicos-de-dispositivos-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 27 Mar 2025 21:20:00 +0000</pubDate>
				<category><![CDATA[Algoritimos]]></category>
		<category><![CDATA[ontologia]]></category>
		<category><![CDATA[dados ontológicos]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[gateway inteligente]]></category>
		<category><![CDATA[integração semântica]]></category>
		<category><![CDATA[interoperabilidade IoT]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[mini ontologia]]></category>
		<category><![CDATA[MQTT semântico]]></category>
		<category><![CDATA[OWL]]></category>
		<category><![CDATA[OWL Sensor]]></category>
		<category><![CDATA[Python para IoT]]></category>
		<category><![CDATA[RDF]]></category>
		<category><![CDATA[RDF em Python]]></category>
		<category><![CDATA[RDF Turtle]]></category>
		<category><![CDATA[RDFLib]]></category>
		<category><![CDATA[semântica em dispositivos]]></category>
		<category><![CDATA[sensores semânticos]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[triplestore]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=273</guid>

					<description><![CDATA[<p>Gateways inteligentes com suporte a ontologias permitem que dispositivos embarcados interpretem e integrem dados semânticos de forma eficiente e interoperável. Saiba como isso funciona com exemplos práticos em C e Python.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/gateways-que-integram-dados-ontologicos-de-dispositivos-embarcados/">Gateways que Integram Dados Ontológicos de Dispositivos Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">No universo da Internet das Coisas (IoT) e dos sistemas embarcados, a troca de dados entre dispositivos heterogêneos é uma necessidade constante. Porém, essa integração muitas vezes esbarra em problemas de semântica: como garantir que diferentes dispositivos compreendam os dados da mesma forma? A resposta moderna para essa questão é o uso de <em>ontologias</em> — modelos formais que descrevem o significado dos dados. Neste artigo, vamos explorar como <em>gateways inteligentes</em> podem usar ontologias para integrar dispositivos embarcados de forma mais eficiente, interoperável e semântica.</p>



<h2 class="wp-block-heading">O Que São Ontologias?</h2>



<p class="wp-block-paragraph">Ontologias são estruturas formais que definem conceitos, categorias e as relações entre eles em um determinado domínio. Elas funcionam como um &#8220;dicionário inteligente&#8221;, permitindo que sistemas diferentes compartilhem uma compreensão comum dos dados. Por exemplo, dois sensores de temperatura diferentes podem enviar dados em formatos distintos, mas uma ontologia permite que ambos sejam compreendidos como representações da mesma informação semântica: a temperatura ambiente.</p>



<h2 class="wp-block-heading">O Papel do Gateway Ontológico</h2>



<p class="wp-block-paragraph">Gateways são dispositivos intermediários que conectam sensores, atuadores e sistemas maiores, como servidores em nuvem. Quando dotados de capacidade ontológica, esses gateways não apenas transmitem dados, mas também interpretam, traduzem e contextualizam as informações de acordo com uma ontologia comum.</p>



<p class="wp-block-paragraph">Imagine o seguinte cenário:</p>



<ul class="wp-block-list">
<li>Um sensor envia <code>{ "tmp": 25 }</code></li>



<li>Outro envia <code>{ "temperature": { "value": 25, "unit": "C" } }</code></li>
</ul>



<p class="wp-block-paragraph">Ambos indicam temperatura, mas de formas distintas. O gateway com suporte ontológico é capaz de interpretar que <code>tmp</code> e <code>temperature.value</code> representam o mesmo conceito, e traduzi-los para uma ontologia comum como OWL (Web Ontology Language), mapeando os dados para, por exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="<Temperature rdf:about=&quot;#sensor1&quot;&gt;
  <hasValue rdf:datatype=&quot;xsd:float&quot;&gt;25.0</hasValue&gt;
  <hasUnit rdf:datatype=&quot;xsd:string&quot;&gt;Celsius</hasUnit&gt;
</Temperature&gt;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">Temperature</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">rdf</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB">about</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">#sensor1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">hasValue</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">rdf</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB">datatype</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xsd:float</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">25.0</span><span style="color: #81A1C1">&lt;/</span><span style="color: #8FBCBB">hasValue</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">hasUnit</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">rdf</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB">datatype</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">xsd:string</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF">Celsius</span><span style="color: #81A1C1">&lt;/</span><span style="color: #8FBCBB">hasUnit</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #81A1C1">&lt;/</span><span style="color: #8FBCBB">Temperature</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading">Exemplo de Implementação em C com ESP32</h2>



<p class="wp-block-paragraph">Para ilustrar, vamos criar uma estrutura básica para um gateway que recebe dados de sensores via UART e traduz essas informações para um modelo RDF simplificado, ainda em C.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="typedef struct {
    float value;
    char unit[10];
    char semantic_id[32]; // Ligação com ontologia
} SensorData;

void parse_uart_message(const char* raw, SensorData* data) {
    // Exemplo bruto: &quot;tmp=25.5;unit=C&quot;
    sscanf(raw, &quot;tmp=%f;unit=%s&quot;, &amp;data-&gt;value, data-&gt;unit);
    strcpy(data-&gt;semantic_id, &quot;http://example.org/ontology#Temperature&quot;);
}

void print_rdf(SensorData* data) {
    printf(&quot;<Temperature rdf:about=\&quot;#sensor1\&quot;&gt;\n&quot;);
    printf(&quot;  <hasValue rdf:datatype=\&quot;xsd:float\&quot;&gt;%.2f</hasValue&gt;\n&quot;, data-&gt;value);
    printf(&quot;  <hasUnit rdf:datatype=\&quot;xsd:string\&quot;&gt;%s</hasUnit&gt;\n&quot;, data-&gt;unit);
    printf(&quot;</Temperature&gt;\n&quot;);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">value</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unit</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">10</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">semantic_id</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">32</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">// Ligação com ontologia</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SensorData</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">parse_uart_message</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">char</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">raw</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">SensorData</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Exemplo bruto: &quot;tmp=25.5;unit=C&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">sscanf</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">raw</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">tmp=%f;unit=%s</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;</span><span style="color: #D8DEE9">data</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">value</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">unit</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">strcpy</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">data</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">semantic_id</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http://example.org/ontology#Temperature</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">print_rdf</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">SensorData</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">&lt;Temperature rdf:about=</span><span style="color: #EBCB8B">\&quot;</span><span style="color: #A3BE8C">#sensor1</span><span style="color: #EBCB8B">\&quot;</span><span style="color: #A3BE8C">&gt;</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">  &lt;hasValue rdf:datatype=</span><span style="color: #EBCB8B">\&quot;</span><span style="color: #A3BE8C">xsd:float</span><span style="color: #EBCB8B">\&quot;</span><span style="color: #A3BE8C">&gt;%.2f&lt;/hasValue&gt;</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">value</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">  &lt;hasUnit rdf:datatype=</span><span style="color: #EBCB8B">\&quot;</span><span style="color: #A3BE8C">xsd:string</span><span style="color: #EBCB8B">\&quot;</span><span style="color: #A3BE8C">&gt;%s&lt;/hasUnit&gt;</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data</span><span style="color: #81A1C1">-&gt;</span><span style="color: #D8DEE9">unit</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">&lt;/Temperature&gt;</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Este exemplo mostra como uma mensagem recebida pode ser traduzida para uma estrutura semântica compreensível por serviços externos.</p>



<h2 class="wp-block-heading">Benefícios da Integração Ontológica</h2>



<ul class="wp-block-list">
<li><strong>Interoperabilidade:</strong> dispositivos de diferentes fabricantes e protocolos podem ser integrados sem ajustes manuais.</li>



<li><strong>Descoberta automática:</strong> novos dispositivos podem ser automaticamente identificados e compreendidos.</li>



<li><strong>Integração com IA:</strong> sistemas de inteligência artificial podem raciocinar sobre os dados com base em seus significados e não apenas em seus valores.</li>
</ul>



<h2 class="wp-block-heading">Tecnologias Complementares</h2>



<p class="wp-block-paragraph">Para gateways mais avançados, bibliotecas como <a href="https://owlcs.github.io/owlapi/">OWL API</a> (Java) ou <a href="https://librdf.org/">RDF4C</a> (C) podem ser incorporadas ao sistema. Em dispositivos embarcados como ESP32, devido às limitações de memória, uma alternativa é converter os dados para formatos semânticos leves (como JSON-LD ou RDFa) e enviá-los para processamento posterior em um servidor.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Gateways ontológicos são peças-chave para tornar a IoT verdadeiramente inteligente. Eles não apenas conectam dispositivos, mas traduzem dados brutos em conhecimento compreensível e compartilhável. A adoção de ontologias nos gateways eleva o patamar da integração de sistemas embarcados, tornando possível a construção de aplicações robustas, escaláveis e orientadas ao significado.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">A integração semântica de dispositivos embarcados por meio de gateways ontológicos representa um salto qualitativo na construção de sistemas IoT e automação inteligente. Em vez de apenas trafegar dados, esses gateways <strong>entendem e contextualizam</strong> as informações que circulam na rede, favorecendo a <strong>interoperabilidade</strong>, a <strong>escalabilidade</strong> e a <strong>tomada de decisão automatizada</strong>.</p>



<p class="wp-block-paragraph">A <strong>mini-ontologia</strong> apresentada aqui oferece uma base para representar sensores de ambiente com consistência semântica, enquanto o exemplo em <strong>Python com RDFLib</strong> mostra como esse modelo pode ser aplicado facilmente em servidores de borda ou aplicações em nuvem.</p>



<h3 class="wp-block-heading">Benefícios em Destaque</h3>



<ul class="wp-block-list">
<li><strong>Interoperabilidade total</strong>: Dispositivos de diferentes fabricantes e protocolos convergem para uma linguagem comum baseada em ontologia.</li>



<li><strong>Rastreamento e auditoria</strong>: Cada medição é armazenada com significado explícito, facilitando auditorias e diagnósticos.</li>



<li><strong>Base para inteligência artificial</strong>: A semântica dos dados permite raciocínio automatizado, inferências e respostas proativas.</li>



<li><strong>Escalabilidade</strong>: Novos sensores podem ser adicionados com mínima ou nenhuma reconfiguração.</li>
</ul>



<h3 class="wp-block-heading">Desafios</h3>



<ul class="wp-block-list">
<li><strong>Capacidade computacional dos gateways</strong>: Processamento ontológico exige memória e poder de CPU, o que pode ser limitado em dispositivos embarcados.</li>



<li><strong>Curva de aprendizado</strong>: Tecnologias como OWL, RDF, SPARQL e ferramentas como RDFLib ou Protégé podem exigir treinamento específico.</li>



<li><strong>Padrões em evolução</strong>: O ecossistema semântico ainda está amadurecendo no contexto de sistemas embarcados.</li>
</ul>



<h3 class="wp-block-heading">Caminhos Futuros</h3>



<ul class="wp-block-list">
<li>Uso de <strong>ontologias padronizadas</strong>, como SSN (Semantic Sensor Network) da W3C;</li>



<li>Integração com <strong>bancos de dados triplestore</strong> como GraphDB, Jena Fuseki ou Blazegraph;</li>



<li>Visualização semântica com dashboards interativos baseados em <em>React</em> ou <em>Grafana</em>;</li>



<li>Extensão da ontologia para <strong>atuadores</strong>, <strong>eventos temporais</strong> e <strong>alertas automatizados</strong>.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Em um mundo cada vez mais conectado, onde sensores e dispositivos proliferam em ritmo exponencial, os gateways com suporte ontológico surgem como peças-chave para transformar dados dispersos em <strong>conhecimento útil e acionável</strong>.</p>
</blockquote><p>The post <a href="https://mcu.tec.br/algoritimos/gateways-que-integram-dados-ontologicos-de-dispositivos-embarcados/">Gateways que Integram Dados Ontológicos de Dispositivos Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">273</post-id>	</item>
		<item>
		<title>Ontologias Aplicadas a Sistemas Embarcados e IoT</title>
		<link>https://mcu.tec.br/algoritimos/ontologias-aplicadas-a-sistemas-embarcados-e-iot/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ontologias-aplicadas-a-sistemas-embarcados-e-iot</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 26 Mar 2025 15:11:04 +0000</pubDate>
				<category><![CDATA[Algoritimos]]></category>
		<category><![CDATA[ontologia]]></category>
		<category><![CDATA[ArduinoJson]]></category>
		<category><![CDATA[C para ESP32]]></category>
		<category><![CDATA[dados semânticos]]></category>
		<category><![CDATA[esp32]]></category>
		<category><![CDATA[inferência em IoT]]></category>
		<category><![CDATA[Internet das Coisas]]></category>
		<category><![CDATA[interoperabilidade]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[MQTT]]></category>
		<category><![CDATA[ontologias em tempo real]]></category>
		<category><![CDATA[PubSubClient]]></category>
		<category><![CDATA[sensores inteligentes]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[Web Semântica]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=245</guid>

					<description><![CDATA[<p>Descubra como aplicar ontologia em sistemas embarcados e IoT com exemplos em C para ESP32, melhorando interoperabilidade e inteligência dos dispositivos.</p>
<p>The post <a href="https://mcu.tec.br/algoritimos/ontologias-aplicadas-a-sistemas-embarcados-e-iot/">Ontologias Aplicadas a Sistemas Embarcados e IoT</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Uma abordagem prática com exemplos em C para ESP32</h2>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">O uso de ontologias, tradicionalmente vinculado às ciências cognitivas e à web semântica, vem ganhando espaço em contextos mais técnicos como a Internet das Coisas (IoT) e os Sistemas Embarcados. Neste artigo, exploramos como ontologias podem organizar o conhecimento de sensores, dispositivos e contextos de forma padronizada e interoperável, facilitando o desenvolvimento, a escalabilidade e a manutenção de sistemas inteligentes. Também apresentamos exemplos práticos de aplicação em C no ESP32.</p>


<a class="wp-block-read-more" href="https://mcu.tec.br/algoritimos/ontologias-aplicadas-a-sistemas-embarcados-e-iot/" target="_self">Leia mais<span class="screen-reader-text">: Ontologias Aplicadas a Sistemas Embarcados e IoT</span></a>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> O que é Ontologia em Computação?</h2>



<p class="wp-block-paragraph">Na ciência da computação, uma <strong>ontologia</strong> é uma representação estruturada de conhecimento de um domínio específico, composta por:</p>



<ul class="wp-block-list">
<li><strong>Conceitos (classes)</strong> — como &#8220;Temperatura&#8221;, &#8220;Sensor&#8221;, &#8220;Dispositivo&#8221;</li>



<li><strong>Propriedades (atributos)</strong> — como &#8220;valor&#8221;, &#8220;unidade&#8221;, &#8220;timestamp&#8221;</li>



<li><strong>Relações</strong> — como &#8220;um Sensor mede uma Temperatura&#8221;</li>



<li><strong>Regras de inferência e restrições</strong> — como &#8220;um valor de temperatura em °C deve estar entre -40 e 125&#8221;.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Aplicações de Ontologia em IoT e Sistemas Embarcados</h2>



<h3 class="wp-block-heading">1. <strong>Interoperabilidade Semântica</strong></h3>



<p class="wp-block-paragraph">Permite que sensores de diferentes fabricantes &#8220;falem a mesma língua&#8221; em gateways, hubs ou sistemas centralizados.</p>



<h3 class="wp-block-heading">2. <strong>Autodescrição de Dispositivos</strong></h3>



<p class="wp-block-paragraph">Usando ontologias, um sensor pode anunciar seu tipo, unidade de medida, intervalo de operação, e método de leitura, facilitando <strong>configuração automática</strong>.</p>



<h3 class="wp-block-heading">3. <strong>Raciocínio Baseado em Regras</strong></h3>



<p class="wp-block-paragraph">Um sistema pode inferir que &#8220;o ambiente está em risco de incêndio&#8221; se <code>Temperatura &gt; 60°C</code> e <code>Sensor de Fumaça = Ativado</code>.</p>



<h3 class="wp-block-heading">4. <strong>Diagnóstico e Autoconfiguração</strong></h3>



<p class="wp-block-paragraph">Ontologias permitem definir causas e efeitos, como &#8220;se umidade estiver zero e temperatura estiver alta, o sensor pode estar desconectado&#8221;.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estrutura Ontológica Simples para Sensores</h2>



<p class="wp-block-paragraph">Vamos criar uma mini ontologia em C para o ESP32, simulando algo como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Sensor → Temperatura
        → Umidade

Sensor tem:
  - nome
  - unidade
  - valor
  - função de leitura
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Sensor</span><span style="color: #D8DEE9FF"> → </span><span style="color: #D8DEE9">Temperatura</span></span>
<span class="line"><span style="color: #D8DEE9FF">        → </span><span style="color: #D8DEE9">Umidade</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">Sensor</span><span style="color: #D8DEE9FF"> tem</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nome</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unidade</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">valor</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">função</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">leitura</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4bb.png" alt="💻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Exemplo em C para ESP32</h2>



<h3 class="wp-block-heading">Estrutura Base</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="typedef struct {
    char nome[20];
    char unidade[10];
    float valor;
    float (*lerValor)(void);  // ponteiro para função de leitura
} Sensor;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">typedef</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">struct</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nome</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">20</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unidade</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">10</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">valor</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">float</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9">lerValor</span><span style="color: #D8DEE9FF">)(</span><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// ponteiro para função de leitura</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Sensor</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Funções de Leitura Simuladas</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="float lerTemperatura() {
    // Simula leitura de sensor
    return 25.0 + (rand() % 1000) / 100.0;
}

float lerUmidade() {
    return 40.0 + (rand() % 1000) / 100.0;
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">lerTemperatura</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">    </span><span style="color: #616E88">// Simula leitura de sensor</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">25.0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> (</span><span style="color: #88C0D0">rand</span><span style="color: #D8DEE9FF">() </span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1000</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100.0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">lerUmidade</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">40.0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> (</span><span style="color: #88C0D0">rand</span><span style="color: #D8DEE9FF">() </span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1000</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100.0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Criando os Sensores</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Sensor sensorTemp = {
    .nome = &quot;Temperatura&quot;,
    .unidade = &quot;C&quot;,
    .lerValor = lerTemperatura
};

Sensor sensorUmi = {
    .nome = &quot;Umidade&quot;,
    .unidade = &quot;%&quot;,
    .lerValor = lerUmidade
};
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">Sensor</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">nome</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperatura</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">unidade</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">lerValor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lerTemperatura</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">Sensor</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">nome</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Umidade</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">unidade</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">%</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    .</span><span style="color: #D8DEE9">lerValor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">lerUmidade</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Leitura em Loop</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void loopSensores() {
    sensorTemp.valor = sensorTemp.lerValor();
    sensorUmi.valor = sensorUmi.lerValor();

    printf(&quot;Sensor: %s = %.2f %s\n&quot;, sensorTemp.nome, sensorTemp.valor, sensorTemp.unidade);
    printf(&quot;Sensor: %s = %.2f %s\n&quot;, sensorUmi.nome, sensorUmi.valor, sensorUmi.unidade);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">loopSensores</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">lerValor</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">lerValor</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Sensor: %s = %.2f %s</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">nome</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">unidade</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Sensor: %s = %.2f %s</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">nome</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">unidade</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Expandindo com Inferência Simples</h2>



<p class="wp-block-paragraph">Vamos fazer uma &#8220;regra ontológica&#8221; hardcoded:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void verificarCondicoes() {
    if (sensorTemp.valor &gt; 60.0 &amp;&amp; sensorUmi.valor < 10.0) {
        printf(&quot;&#x26a0; Risco de superaquecimento e ar seco!\n&quot;);
    }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">verificarCondicoes</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">60.0</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10.0</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">printf</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">&#x26a0; Risco de superaquecimento e ar seco!</span><span style="color: #EBCB8B">\n</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Benefícios Concretos</h2>



<ul class="wp-block-list">
<li><strong>Reuso de código com base em tipos semânticos</strong></li>



<li><strong>Padronização do comportamento de sensores</strong></li>



<li><strong>Capacidade de diagnóstico automatizado</strong></li>



<li><strong>Facilidade para integração com sistemas semânticos (ex: OWL + MQTT + RDF)</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f310.png" alt="🌐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ontologia em Comunicação Semântica: Integrando ESP32 com MQTT</h2>



<p class="wp-block-paragraph">Além da modelagem local de sensores no firmware, as ontologias brilham quando utilizadas em sistemas <strong>distribuídos</strong>, permitindo que um sensor transmita dados <strong>já semânticos</strong>, ou seja, com significado explícito.</p>



<p class="wp-block-paragraph">Vamos ver como isso funciona na prática, criando uma camada que transmite dados com <strong>metadados semânticos</strong> usando MQTT — um dos protocolos mais populares em IoT.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estrutura da Mensagem Ontológica</h3>



<p class="wp-block-paragraph">Em vez de apenas transmitir <code>25.3</code>, transmitimos algo como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="{
  &quot;sensor&quot;: &quot;Temperatura&quot;,
  &quot;valor&quot;: 25.3,
  &quot;unidade&quot;: &quot;C&quot;,
  &quot;contexto&quot;: &quot;ambiente_interno&quot;,
  &quot;tipo&quot;: &quot;observação&quot;,
  &quot;timestamp&quot;: 1711459200
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">sensor</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Temperatura</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">valor</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #B48EAD">25.3</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">unidade</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">C</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">contexto</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ambiente_interno</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">tipo</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">observação</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">timestamp</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #B48EAD">1711459200</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Essa estrutura, ainda que JSON simples, <strong>representa uma mini-ontologia em ação</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6f0.png" alt="🛰" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Enviando via MQTT com ESP32 (usando PubSubClient)</h2>



<h3 class="wp-block-heading">Instalação das dependências (no PlatformIO ou Arduino IDE)</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="lib_deps =
  knolleary/PubSubClient
  bblanchon/ArduinoJson
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">lib_deps</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">knolleary</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">PubSubClient</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">bblanchon</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ArduinoJson</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Código para Envio com Ontologia JSON</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#include <WiFi.h&gt;
#include <PubSubClient.h&gt;
#include <ArduinoJson.h&gt;

WiFiClient espClient;
PubSubClient mqtt(espClient);

const char* ssid = &quot;SuaRedeWiFi&quot;;
const char* password = &quot;SenhaDaRede&quot;;
const char* mqttServer = &quot;broker.hivemq.com&quot;;

void conectarWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void conectarMQTT() {
  mqtt.setServer(mqttServer, 1883);
  while (!mqtt.connected()) {
    mqtt.connect(&quot;esp32_ontologia&quot;);
  }
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">WiFi</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">PubSubClient</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">#</span><span style="color: #D8DEE9">include</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9">ArduinoJson</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">h</span><span style="color: #81A1C1">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">WiFiClient</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">espClient</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9">PubSubClient</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mqtt</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">espClient</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF">* ssid </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SuaRedeWiFi</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF">* password </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SenhaDaRede</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF">* mqttServer </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">broker.hivemq.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">conectarWiFi</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">WiFi</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">begin</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">ssid</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">password</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">WiFi</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">status</span><span style="color: #D8DEE9FF">() </span><span style="color: #81A1C1">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">WL_CONNECTED</span><span style="color: #D8DEE9FF">) </span><span style="color: #88C0D0">delay</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">500</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">conectarMQTT</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">mqtt</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">setServer</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">mqttServer</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1883</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">while</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #D8DEE9">mqtt</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">connected</span><span style="color: #D8DEE9FF">()) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">mqtt</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">connect</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">esp32_ontologia</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Função para Enviar um Dado Semântico</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void enviarDadoOntologico(Sensor sensor, const char* contexto) {
  StaticJsonDocument<256&gt; doc;
  doc[&quot;sensor&quot;] = sensor.nome;
  doc[&quot;valor&quot;] = sensor.valor;
  doc[&quot;unidade&quot;] = sensor.unidade;
  doc[&quot;contexto&quot;] = contexto;
  doc[&quot;tipo&quot;] = &quot;observação&quot;;
  doc[&quot;timestamp&quot;] = millis();  // em produção use RTC ou NTP

  char mensagem[256];
  serializeJson(doc, mensagem);
  mqtt.publish(&quot;iot/esp32/sensores&quot;, mensagem);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">enviarDadoOntologico</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">Sensor</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensor</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">char</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">contexto</span><span style="color: #D8DEE9FF">) </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">StaticJsonDocument</span><span style="color: #81A1C1">&lt;</span><span style="color: #B48EAD">256</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">doc</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">doc</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">sensor</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensor</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">nome</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">doc</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">valor</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensor</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">doc</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">unidade</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensor</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">unidade</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">doc</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">contexto</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">contexto</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">doc</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">tipo</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">observação</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">doc</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">timestamp</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">] </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">millis</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// em produção use RTC ou NTP</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">char</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mensagem</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">256</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">serializeJson</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">doc</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mensagem</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">mqtt</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">publish</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">iot/esp32/sensores</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">mensagem</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Uso no Loop</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void loop() {
  if (!mqtt.connected()) conectarMQTT();
  mqtt.loop();

  sensorTemp.valor = sensorTemp.lerValor();
  sensorUmi.valor = sensorUmi.lerValor();

  enviarDadoOntologico(sensorTemp, &quot;ambiente_interno&quot;);
  enviarDadoOntologico(sensorUmi, &quot;ambiente_interno&quot;);

  delay(5000);
}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">void</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">loop</span><span style="color: #D8DEE9FF">() </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">!</span><span style="color: #D8DEE9">mqtt</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">connected</span><span style="color: #D8DEE9FF">()) </span><span style="color: #88C0D0">conectarMQTT</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">mqtt</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">loop</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">lerValor</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">valor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">lerValor</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">enviarDadoOntologico</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">sensorTemp</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ambiente_interno</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">enviarDadoOntologico</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">sensorUmi</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ambiente_interno</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">delay</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">5000</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f30d.png" alt="🌍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Compatibilidade com Ontologias OWL/RDF</h2>



<p class="wp-block-paragraph">Esses dados, ao serem coletados no broker, podem ser <strong>convertidos para RDF</strong> ou consultados com <strong>SPARQL</strong>, caso estejam armazenados em uma base semântica (como o <a href="https://jena.apache.org/">Apache Jena</a>).</p>



<p class="wp-block-paragraph">Você pode criar um <strong>mapeamento semântico entre o JSON e uma ontologia OWL</strong>, como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=":Sensor rdf:type owl:Class .
:valor rdf:type owl:DatatypeProperty ; rdfs:domain :Sensor ; rdfs:range xsd:float .
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">:</span><span style="color: #D8DEE9">Sensor</span><span style="color: #D8DEE9FF"> rdf</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">type</span><span style="color: #D8DEE9FF"> owl:Class .</span></span>
<span class="line"><span style="color: #D8DEE9FF">:valor rdf:type owl:DatatypeProperty </span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> rdfs</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">domain </span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">Sensor</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> rdfs</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">range</span><span style="color: #D8DEE9FF"> xsd</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">float</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ed.png" alt="🧭" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Benefícios de Integrar Ontologia com MQTT</h2>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f501.png" alt="🔁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Reuso e composição automática de dados</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Integração com Knowledge Graphs e inferência</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Consulta semântica unificada de dispositivos heterogêneos</strong></li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Facilidade de extensão: novos sensores, mesmos padrões</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Conclusão</h2>



<p class="wp-block-paragraph">A introdução de ontologias no desenvolvimento de sistemas embarcados e IoT não é apenas uma questão teórica — é uma <strong>abordagem pragmática para lidar com complexidade, interoperabilidade e evolução dos sistemas</strong>. Mesmo em plataformas como o ESP32, com recursos limitados, é possível aplicar os princípios semânticos para criar sistemas mais inteligentes, autodescritivos e expansíveis.</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://mcu.tec.br/algoritimos/ontologias-aplicadas-a-sistemas-embarcados-e-iot/">Ontologias Aplicadas a Sistemas Embarcados e IoT</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">245</post-id>	</item>
	</channel>
</rss>
