• SWR&PWR METER  - IPS  JC3248W535 TFT ESPP32S3 3.5" PROJECT BY PY3UF     [email protected]

  • O modulo de desenvolvimento  JC3248W535  LCD IPS de 3,5 polegadas de toque capacitivo, possui o  chip ESP32 WiFi de última geração dos produtos Espressif. Possui um processador dual-core MCU de 32 bits ,alto desempenho com 8M PSRAM e 16M FLASH Equipado com 8M PSRAM e 16M FLASH, mais recursos GPIO ,este módulo suporta aplicações complexas e armazenamento eficiente de dados e código e compivel com Arduino e LVGL ,perfeito para  desenvolvimento de interfaces gráficas dinâmicas. O cara  vem com uma  um firmware de demonstração do fabricante (Guition) focado em funções básicas ou suporte para a biblioteca LVGL clássica no Arduino IDE .Então,considerando que já dominem a plataforma Arduino , Vamos pular a introdução básica e ir direto ao que interessa.
  • Este projeto foi feito com a  combinação da  biblioteca Arduino_GFX (1.4.0) , que interage diretamente com as APIs de baixo nível do ESP32 Core (2.1.7) (da Espressif). Alterações nessas versões costumam quebrar a compilação por conta de mudanças no gerenciamento de DMA, SPI ou alocação de memória (PSRAM)
  • 1. Sobre o JC3248W535
  • Encontrado facilmente  no Ali express  por cerca de U$20
  •  

  •  

  • O sistema mede duas tensões analógicas:

  • FWD → potência direta

  • REF → potência refletida

A partir dessas duas medições ele calcula:

FWD em watts

REF em watts

SWR/ROE

dBm

barra gráfica de FWD

barra gráfica de SWR

escala gráfica

range manual ou automático

  • A tela é organizada assim:

  • ┌──────────────────────────────────────────────────────┐

  •        FWD 250.0 W               REF 12.5 W        

  • ──────────────────────────────────────────────────────

  •   |------ escala FWD ------|                          

  •   ████████████████████░░░░░░░░░░░░░░░░               

  • ──────────────────────────────────────────────────────

  •   |--1--1.5--2---3---4---5---6---7---8---9--|       

  •   █████████████████░░░░░░░░░░░░░░░░░░░░░░            

  • ────────────────────────────────────────────────────

  •     SWR              dBm              RANGE        

  •     1.5             54.0              250 W       

  • └────────────────────────────────────────────────────┘


  • 2. Relação entre tensão da sonda e potência

  • O programa está configurado para uma sonda em que:

  • #define PROBE_MAX_VOLTAGE    5.00f

  • #define PROBE_MAX_POWER      1000.0f

  • Ou seja, o conceito adotado é:

  • 0 V       → 0 W

  • 5 V       → 1000 W

  • Portanto:

  • 1 V → 200 W

  • 2 V → 400 W

  • 3 V → 600 W

  • 4 V → 800 W

  • 5 V → 1000 W

  • O programa, porém, não recebe diretamente 0–5 V no ADC.

  • O ADC do ESP32 trabalha aproximadamente em:

  • 0 → 3,3 V

  • Então a sonda precisa estar adequada ao ADC, normalmente através de um divisor/amplificador/condicionamento.


  • 3. Entradas utilizadas

  •  

  • const int fwdInPin = 15;

  • const int refInPin = 16;

  • Portanto:

  • Função

    GPIO

    FWD

    GPIO 15

    REF

    GPIO 16

  • O programa lê:

  • int fwdRaw = analogRead(fwdInPin);

  • int refRaw = analogRead(refInPin);

  • Como foi configurado:

  • analogReadResolution(12);

  • o ADC trabalha com:

  • 0 → 4095

  • Assim:

  • 0 ADC    = 0 V

  • 4095 ADC = aproximadamente 3,3 V


  • 4. Como o ADC vira watts

  • A parte principal é:

  • float fwd =

  • (

  •   (float)fwdRaw /

  •   ADC_MAX_READING

  • )

  • *

  • PROBE_MAX_POWER;

  • Com:

  • #define ADC_MAX_READING 4095.0f

  • #define PROBE_MAX_POWER 1000.0f

  • Matematicamente:

  • Potência = ADC / 4095 × 1000

  • Exemplo:

  • ADC = 2048

  • 2048 / 4095 × 1000

  • ≈ 500 W

  • ADC = 1024

  • 1024 / 4095 × 1000

  • ≈ 250 W

  • ADC = 4095

  • 4095 / 4095 × 1000

  • = 1000 W


  • 5. O diagnóstico pelo Serial

  • A cada aproximadamente 500 ms o programa envia informações para o monitor serial.

  • Ele mostra:

  • FWD ADC

  • FWD ADC V

  • FWD SONDA V

  • REF ADC

  • REF SONDA V

  • Por exemplo:

  • FWD ADC=2048

  • FWD ADC V=1.650

  • FWD SONDA V=2.500

  • Isso é muito útil para calibrar a sonda.

  • A conversão da tensão é:

  • float fwdADCVoltage =

  • (

  •   (float)fwdRaw /

  •   ADC_MAX_READING

  • )

  • *

  • ADC_MAX_VOLTAGE;

  • Depois:

  • float fwdProbeVoltage =

  • (

  •   fwdADCVoltage /

  •   ADC_MAX_VOLTAGE

  • )

  • *

  • PROBE_MAX_VOLTAGE;


  • 6. OFFSET

  • Você possui:

  • #define FWD_OFFSET_WATT 0.0f

  • #define REF_OFFSET_WATT 0.0f

  • Isso permite compensar uma leitura residual.

  • Por exemplo, se sem RF o aparelho mostrar:

  • FWD = 3 W

  • você poderia usar:

  • #define FWD_OFFSET_WATT 3.0f

  • Então:

  • leitura = 3 W

  • offset = 3 W

  •  

  • resultado = 0 W

  • Isso é muito útil para eliminar pequenos erros de zero.


  • 7. Suavização da leitura

  • Uma parte importante do programa é:

  • float alphaSubida = 0.30f;

  • float alphaDescida = 0.30f;

  • A função:

  • smoothValue()

  • evita que os números e as barras fiquem tremendo.

  • Ela faz uma média ponderada:

  • return

  • (

  •   alpha * currentValue

  • )

  • +

  • (

  •   (1.0f - alpha) * previousValue

  • );

  • Com:

  • alpha = 0,30

  • a leitura nova influencia 30% e a anterior 70%.

  • Se quiser mais rápido

  • Por exemplo:

  • float alphaSubida = 0.60f;

  • float alphaDescida = 0.60f;

  • A indicação acompanha mais rapidamente.

  • Se quiser mais estável

  • float alphaSubida = 0.15f;

  • float alphaDescida = 0.15f;

  • Fica mais suave, mas mais lenta.


  • 8. Cálculo do SWR

  • Esta é uma das partes mais importantes.

  • O programa mede:

  • FWD = potência direta

  • REF = potência refletida

  • Depois calcula:

  • float ratio =

  • refWatt /

  • fwdWatt;

  • Ou seja:

  • REF/FWD

  • Depois:

  • float ro =

  • sqrt(ratio);

  • E finalmente:

  • swr =

  • (

  •   1.0f + ro

  • )

  • /

  • (

  •   1.0f - ro

  • );

  • Essa é a fórmula tradicional de SWR:

  • SWR=1−Γ1+Γ

  • onde:

  • Γ=PFWDPREF​​​

  • Portanto o seu programa está calculando o SWR a partir da relação entre potência refletida e potência direta.


  • 9. Exemplo de cálculo do SWR

  • Suponha:

  • FWD = 100 W

  • REF = 1 W

  • Então:

  • REF/FWD = 1/100

  •         = 0,01

  • Raiz:

  • √0,01 = 0,1

  • SWR:

  • (1 + 0,1) / (1 - 0,1)

  •  

  • = 1,1 / 0,9

  •  

  • ≈ 1,22

  • Portanto:

  • 100 W FWD

  • 1 W REF

  •  

  • SWR ≈ 1,22


  • 10. Quando não existe potência refletida

  • O código faz:

  • if (

  •   refWatt <= 0.01f

  • )

  • {

  •   swr = 1.0f;

  •   return;

  • }

  • Então, se REF for praticamente zero:

  • SWR = 1,0

  • Isso representa uma carga perfeitamente casada.


  • 11. Quando REF chega a FWD

  • Existe esta proteção:

  • if (

  •   ratio >= 1.0f

  • )

  • {

  •   swr = 99.9f;

  •   return;

  • }

  • Isso evita divisão por zero.

  • Na prática:

  • REF >= FWD

  • é uma situação extrema, e o programa apresenta:

  • SWR = 99,9


  • 12. Barra FWD

  • A primeira barra representa a potência direta.

  • A escala é configurável pelo:

  • int powerRange = 1000;

  • Os ranges disponíveis são:

  • int manualRanges[] =

  • {

  •   10,

  •   25,

  •   50,

  •   100,

  •   250,

  •   500,

  •   1000

  • };

  • Portanto você pode selecionar:

  • 10 W

  • 25 W

  • 50 W

  • 100 W

  • 250 W

  • 500 W

  • 1000 W

  • AUTO


  • 13. Como funciona o RANGE

  • O botão está aqui:

  • int btnX = 325;

  • int btnY = 240;

  • int btnW = 150;

  • int btnH = 75;

  • Quando você toca nele, o programa muda o range.

  • A sequência manual é:

  • 10

  • 25

  • 50

  • 100

  • 250

  • 500

  • 1000

  • Quando volta ao índice zero:

  • if (powerRangeIndex == 0)

  • {

  •   autoRange = true;

  • }

  • entra em:

  • AUTO

  • Depois, outro toque retorna para:

  • 10 W

  • Então a sequência é:

  • 10

  • 25

  • 50

  • 100

  • 250

  • 500

  • 1000

  • AUTO

  • 10

  • 25

  • ...


  • 14. Como funciona o AUTO RANGE

  • Quando:

  • autoRange = true;

  • o programa escolhe automaticamente:

  • if (fwdSmooth < 10)

  •   powerRange = 10;

  •  

  • else if (fwdSmooth < 25)

  •   powerRange = 25;

  •  

  • else if (fwdSmooth < 50)

  •   powerRange = 50;

  •  

  • else if (fwdSmooth < 100)

  •   powerRange = 100;

  •  

  • else if (fwdSmooth < 250)

  •   powerRange = 250;

  •  

  • else if (fwdSmooth < 500)

  •   powerRange = 500;

  •  

  • else

  •   powerRange = 1000;

  • Exemplo:

  • FWD = 7 W    → range 10 W

  • FWD = 20 W   → range 25 W

  • FWD = 40 W   → range 50 W

  • FWD = 80 W   → range 100 W

  • FWD = 200 W  range 250 W

  • FWD = 400 W  range 500 W

  • FWD = 800 W  range 1000 W


  • 15. Escala FWD

  • A escala superior é criada em:

  • void drawScale()

  • Ela possui:

  • int mainDivisions = 10;

  • int subDivisions = 5;

  • Portanto existem 10 divisões principais e 5 subdivisões entre elas.

  • Se o range for:

  • 1000 W

  • a escala será:

  • 0

  • 100

  • 200

  • 300

  • 400

  • 500

  • 600

  • 700

  • 800

  • 900

  • 1000

  • Se for:

  • 100 W

  • fica:

  • 0

  • 10

  • 20

  • 30

  • 40

  • 50

  • 60

  • 70

  • 80

  • 90

  • 100

  • Isso é calculado aqui:

  • int label =

  • (

  •   powerRange * i

  • )

  • /

  • mainDivisions;


  • 16. Cores da barra FWD

  • A barra FWD possui uma transição de cores.

  • O código divide a barra em quatro regiões:

  • 0–30%

  • CIANO → VERDE

  • 30–60%

  • VERDE → AMARELO

  • 60–80%

  • AMARELO → LARANJA

  • 80–100%

  • LARANJA → VERMELHO

  • Isso é feito aqui:

  • if (t < 0.3f)

  • depois:

  • else if (t < 0.6f)

  • depois:

  • else if (t < 0.8f)

  • e finalmente:

  • else


  • 17. Barra REF/SWR

  • A segunda barra não representa diretamente REF em watts.

  • Ela representa:

  • SWR

  • Isso é importante.

  • Você inclusive deixou corretamente comentado:

  • // AQUI É SWR, NÃO refSmooth.

  • Então:

  • drawBarsREF(swr);

  • é quem controla a segunda barra.


  • 18. A escala do SWR é diferente

  • O SWR não está sendo distribuído linearmente na tela.

  • A escala definida é:

  • 1

  • 1.5

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • E cada valor possui uma posição específica:

  • const int xPos[] =

  • {

  •   15,

  •   88,

  •   148,

  •   229,

  •   267,

  •   300,

  •   330,

  •   360,

  •   390,

  •   421

  • };

  • Isso significa:

  • SWR     PIXEL

  • 1.0     15

  • 1.5     88

  • 2.0     148

  • 3.0     229

  • 4.0     267

  • 5.0     300

  • 6.0     330

  • 7.0     360

  • 8.0     390

  • 9.0     421


  • 19. Por que a escala SWR é "não linear"?

  • Porque SWR não precisa ocupar o mesmo espaço visual entre os valores.

  • Veja:

  • 1 → 1,5

  • ocupa:

  • 88 - 15 = 73 pixels

  • Enquanto:

  • 3 → 4

  • ocupa:

  • 267 - 229 = 38 pixels

  • E:

  • 8 → 9

  • ocupa:

  • 421 - 390 = 31 pixels

  • Portanto a escala foi desenhada especificamente para ficar visualmente parecida com uma escala de medidor de ROE.


  • 20. Cores da barra SWR

  • Essa parte está muito bem definida.

  • O programa usa:

  • 1,00 → 1,25

  • CIANO → VERDE

  • Depois:

  • 1,25 → 1,50

  • VERDE → LARANJA

  • Depois:

  • 1,50 → 1,90

  • LARANJA

  • Depois:

  • 1,90 → 2,00

  • LARANJA → VERMELHO ESCURO

  • Depois:

  • 2,00 → 3,00

  • VERMELHO ESCURO → VERMELHO

  • E:

  • acima de 3,00

  • VERMELHO

  • Visualmente:

  • SWR

  •  

  • 1.0       1.25    1.5       1.9  2.0       3

  • │----------│-------│----------│----│---------│

  • CIANO      VERDE   LARANJA        VERMELHO


  • 21. dBm

  • O programa também calcula dBm a partir da potência FWD.

  • A fórmula usada é:

  • dbm =

  • 10.0f *

  • log10(

  •   fwdSmooth *

  •   1000.0f

  • );

  • Isso equivale a:

  • dBm=10log10(PmW)

  • Como:

  • 1 W = 1000 mW

  • Exemplos

  • 1 W   → 30 dBm

  • 10 W  40 dBm

  • 100 W → 50 dBm

  • 1000 W → 60 dBm

  • Portanto, para 1000 W:

  • 1000 W = 1.000.000 mW

  •  

  • 10 log10(1.000.000)

  • = 60 dBm


  • 22. Touchscreen

  • O touch usa:

  • #define TOUCH_ADDR 0x3B

  • e:

  • #define TOUCH_SDA 4

  • #define TOUCH_SCL 8

  • Portanto:

  • Touch SDA → GPIO 4

  • Touch SCL → GPIO 8

  • Reset:

  • GPIO 12

  • Interrupt:

  • GPIO 11

  • O programa consulta o controlador do touch através de I²C.


  • 23. Display

  • O display utiliza:

  • Arduino_GFX_Library

  • e:

  • Arduino_AXS15231

  • A resolução física definida é:

  • 480 × 480

  • mas o canvas utilizado é:

  • Arduino_Canvas(

  •   320,

  •   480,

  •   ...

  • );

  • Ou seja, a área gráfica utilizada pelo programa é:

  • 480 × 320

  • Isso explica por que todas as coordenadas da interface estão dentro de:

  • X = 0 → 479

  • Y = 0 → 319


  • 24. Por que existe gfx->flush()?

  • O programa utiliza um:

  • Arduino_Canvas

  • O desenho é feito primeiro na memória.

  • Depois:

  • gfx->flush();

  • manda a imagem para o display.

  • Isso é importante para evitar que a tela fique piscando durante o desenho.


  • 25. Uma otimização interessante do programa

  • Você criou variáveis como:

  • lastFilledBars

  • lastFilledBarsREF

  • A função da primeira é evitar redesenhar a barra inteira quando a quantidade de barras preenchidas não mudou.

  • Por exemplo:

  • 100 W

  • 100,1 W

  • 100,2 W

  • 100,3 W

  • pode continuar tendo exatamente o mesmo número de barras.

  • Então não precisa redesenhar tudo.

  • Isso reduz o trabalho do ESP32 e ajuda na fluidez da tela.


  • 26. O fluxo completo do programa

  • O funcionamento pode ser entendido assim:

  •                 ┌──────────────┐

  •                 │ SONDA FWD   

  •                 └─────────────┘

  •                       

  •                       

  •                   GPIO 15 ADC

  •                       

  •                       

  •                  ADC 0–4095

  •                       

  •                       

  •                  Conversão W

  •                       

  •                       

  •                    FWD W

  •                       

  •                        ─────────────── Barra FWD

  •                       

  •                        └─────────────── dBm

  •  

  •  

  •                 ┌──────────────┐

  •                 │ SONDA REF   

  •                 └─────────────┘

  •                       

  •                       

  •                   GPIO 16 ADC

  •                       

  •                       

  •                  ADC 0–4095

  •                       

  •                       

  •                  Conversão W

  •                       

  •                        

  •                    REF W

  •                       

  •                       

  •                       

  •                 REF / FWD

  •                       

  •                       

  •                    √(REF/FWD)

  •                       

  •                       

  •                     SWR

  •                       

  •                       

  •                   Barra SWR


  • 27. Tutorial de montagem

  • Etapa 1 — Alimentação

  • O ESP32-S3 deve ser alimentado conforme a placa utilizada.

  • O TFT também deve estar com alimentação adequada.

  • Atenção especial às entradas:

  • GPIO 15

  • GPIO 16

  • Elas não devem receber tensão acima do limite permitido pelo ESP32.

  • Se a sua sonda realmente fornece até:

  • 5 V

  • não ligue esses 5 V diretamente ao ADC.

  • É necessário um circuito de adaptação.


  • 28. Exemplo de divisor para a entrada ADC

  • Se a sonda puder fornecer 5 V e você quiser aproximadamente 3,3 V no ADC, pode usar um divisor resistivo.

  • Por exemplo:

  • SONDA

  •  

  •   R1

  •  

  •   ──────── GPIO ADC

  •  

  •   R2

  •  

  •  GND

  • A fórmula é:

  • VADC=VinR1+R2R2

  • Para:

  • Vin = 5 V

  • VADC ≈ 3,3 V

  • uma combinação aproximada seria:

  • R1 = 5,1

  • R2 = 10

  • porque:

  • 5×5,1+1010≈3,31V

  • Mas a escolha final dos resistores deve considerar a impedância de saída da sua sonda e a proteção do ADC.


  • 29. Etapa 2 — Testar somente o ADC

  • Antes de ligar RF, use o monitor serial.

  • Abra:

  • Serial Monitor

  • 115200 baud

  • Você verá algo semelhante a:

  • FWD ADC=2048 FWD ADC V=1.650 FWD SONDA V=2.500

  • Faça o teste aplicando tensões conhecidas à entrada do circuito ADC.

  • Por exemplo:

  • 0 V

  • 0,5 V

  • 1,0 V

  • 1,5 V

  • 2,0 V

  • 2,5 V

  • 3,0 V

  • 3,3 V

  • Veja se o ADC acompanha corretamente.


  • 30. Etapa 3 — Calibrar a potência

  • Aqui está uma observação muito importante sobre o código atual.

  • A conversão efetiva de watts está baseada diretamente em:

  • ADC / 4095 × 1000

  • Portanto o código assume que:

  • ADC máximo = 1000 W

  • Se sua sonda estiver condicionada para:

  • 0 W  0 V ADC

  • 1000 W → 3,3 V ADC

  • está perfeito.

  • Mas se a sua sonda tiver outra relação, precisamos alterar a equação.


  • 31. Exemplo de calibração

  • Suponha que você coloque:

  • Potência real = 100 W

  • e o ESP32 indique:

  • 80 W

  • Então o fator de correção aproximado seria:

  • Fator=80100=1,25

  • Você poderia aplicar:

  • fwd *= 1.25f;

  • Mas o ideal é fazer a calibração usando vários pontos, por exemplo:

  • 50 W

  • 100 W

  • 250 W

  • 500 W

  • 750 W

  • 1000 W

  • Assim podemos descobrir se a sonda é realmente linear.


  • 32. Etapa 4 — Calibrar REF

  • Faça exatamente o mesmo procedimento na entrada:

  • refInPin = 16

  • A leitura de REF é usada depois no cálculo do SWR.

  • Essa parte é particularmente importante porque qualquer erro de REF altera bastante o SWR, principalmente em SWR baixo.


  • 33. Etapa 5 — Testar SWR

  • Depois de calibrar FWD e REF, teste com cargas conhecidas.

  • Por exemplo, uma carga perfeitamente casada:

  • REF ≈ 0

  • FWD > 0

  • deve resultar em:

  • SWR ≈ 1,0

  • Depois, usando uma condição conhecida de ROE, confira o resultado.


  • 34. Onde alterar o range

  • Se quiser mudar os ranges, altere somente:

  • int manualRanges[] =

  • {

  •   10,

  •   25,

  •   50,

  •   100,

  •   250,

  •   500,

  •   1000

  • };

  • Por exemplo, para:

  • 10

  • 50

  • 100

  • 250

  • 500

  • 1000

  • 1500

  • use:

  • int manualRanges[] =

  • {

  •   10,

  •   50,

  •   100,

  •   250,

  •   500,

  •   1000,

  •   1500

  • };

  • Mas nesse caso também será necessário alterar o limite máximo da conversão se você realmente quiser medir 1500 W.


  • 35. Onde alterar o limite máximo

  • Atualmente:

  • #define PROBE_MAX_POWER 1000.0f

  • Se a sonda for configurada para 1500 W:

  • #define PROBE_MAX_POWER 1500.0f

  • E a equação passará a considerar:

  • ADC máximo = 1500 W


  • 36. Onde alterar a tensão máxima da sonda

  • Atualmente:

  • #define PROBE_MAX_VOLTAGE 5.00f

  • Se a sua sonda tiver, por exemplo:

  • 0–4 V

  • alteraria para:

  • #define PROBE_MAX_VOLTAGE 4.00f

  • Porém: essa constante atualmente é usada principalmente para o diagnóstico de tensão da sonda. A conversão principal de watts está sendo feita diretamente pelo valor ADC e PROBE_MAX_POWER.


  • 37. Onde alterar o zero

  • Para corrigir leitura residual:

  • #define FWD_OFFSET_WATT 0.0f

  • #define REF_OFFSET_WATT 0.0f

  • Exemplo:

  • #define FWD_OFFSET_WATT 2.0f

  • #define REF_OFFSET_WATT 0.5f


  • 38. Onde alterar a velocidade da leitura

  • Aqui:

  • float alphaSubida = 0.30f;

  • float alphaDescida = 0.30f;

  • Mais rápido:

  • 0.50

  • 0.60

  • 0.70

  • Mais suave:

  • 0.10

  • 0.15

  • 0.20


  • 39. Onde alterar as cores FWD

  • As cores estão no início:

  • #define MY_DARK_RED  0xF400

  • #define MY_RED       0xF800

  • #define MY_GREEN     0x07E0

  • #define MY_BLUE      0x001F

  • #define MY_YELLOW    0xFFE0

  • #define MY_ORANGE    0xFD20

  • #define MY_CYAN      0x07FF

  • #define MY_GREY      0x8410

  • A barra FWD usa:

  • CYAN

  • GREEN

  • YELLOW

  • ORANGE

  • RED


  • 40. Onde alterar o início do vermelho do FWD

  • Na função:

  • void drawBars(float powerFWD)

  • está:

  • if (t < 0.3f)

  • else if (t < 0.6f)

  • else if (t < 0.8f)

  • Portanto o vermelho começa nos últimos:

  • 20%

  • da escala.

  • Se quiser antecipar o vermelho, por exemplo para os últimos 30%, pode alterar:

  • else if (t < 0.7f)

  • e:

  • else

  • passaria a ocupar:

  • 70% → 100%


  • 41. Onde alterar o vermelho do SWR

  • Esta é a parte:

  • else if (swrPos < 1.90f)

  • {

  •     c = MY_ORANGE;

  • }

  • Depois:

  • else if (swrPos < 2.00f)

  • começa a transição para vermelho escuro.

  • E:

  • else if (swrPos < 3.00f)

  • faz a transição:

  • vermelho escuro → vermelho

  • Finalmente:

  • else

  • {

  •     c = MY_RED;

  • }

  • Então acima de 3:

  • VERMELHO


  • 42. Onde alterar a escala SWR

  • Se quiser mudar a posição física dos números:

  • const int xPos[] =

  • {

  •   15,

  •   88,

  •   148,

  •   229,

  •   267,

  •   300,

  •   330,

  •   360,

  •   390,

  •   421

  • };

  • Por exemplo:

  • 1,0 → X=15

  • 1,5 → X=88

  • 2,0 → X=148

  • Esses valores controlam a geometria da escala.


  • 43. Onde alterar os valores da escala SWR

  • Aqui:

  • const float swrScale[] =

  • {

  •   1.0f,

  •   1.5f,

  •   2.0f,

  •   3.0f,

  •   4.0f,

  •   5.0f,

  •   6.0f,

  •   7.0f,

  •   8.0f,

  •   9.0f

  • };

  • Você pode mudar os valores mostrados.

  • Mas existe um detalhe importante: não basta alterar somente swrScale[].

  • Como o programa usa posições fixas em:

  • swrToPixel()

  • e também em:

  • drawBarsREF()

  • as duas partes precisam permanecer sincronizadas.


  • 44. Arquitetura do programa

  • Podemos dividir seu código em 8 blocos:

  • 1. HARDWARE

  •    ── Display

  •    ── Touch

  •    └── ADC

  •  

  • 2. CONFIGURAÇÃO

  •    ── resolução ADC

  •    ── potência máxima

  •    ── offsets

  •    └── ranges

  •  

  • 3. LEITURA

  •    ── FWD ADC

  •    └── REF ADC

  •  

  • 4. TRATAMENTO

  •    ── conversão

  •    ── offset

  •    └── suavização

  •  

  • 5. CÁLCULOS

  •    ── SWR

  •    └── dBm

  •  

  • 6. GRÁFICOS

  •    ── escala FWD

  •    ── barra FWD

  •    ── escala SWR

  •    └── barra SWR

  •  

  • 7. INTERFACE

  •    ── caixas

  •    ── RANGE

  •    └── touch

  •  

  • 8. ATUALIZAÇÃO

  •    └── loop()


  • 45. Sequência de execução

  • Quando o ESP32 liga:

  • SETUP

  •  

  • Configura ADC

  •  

  • Configura Touch

  •  

  • Configura I²C

  •  

  • Inicializa TFT

  •  

  • Liga backlight

  •  

  • Mostra SPLASH

  •  

  • Configura RANGE inicial = 1000 W

  •  

  • Desenha interface

  •  

  • Lê FWD/REF

  •  

  • LOOP

  • Depois o loop() fica repetindo:

  • Ler Touch

  •     

  • Verificou RANGE?

  •     

  • Ler ADC

  •     

  • Converter para W

  •     

  • Suavizar

  •     

  • Calcular SWR

  •     

  • Calcular dBm

  •     

  • Atualizar números

  •     

  • Atualizar barras

  •     

  • flush()

  •     

  • 50 ms

  •     

  • recomeça


  • 46. Um ponto importante no código atual

  • Há uma característica que vale conhecer:

  • drawRangeButton();

  • é chamado a cada updateReadings().

  • Isso significa que, mesmo quando o range não mudou, o botão RANGE é redesenhado continuamente.

  • O mesmo ocorre com algumas caixas numéricas, que também são apagadas e redesenhadas.

  • O programa provavelmente funciona porque o ESP32-S3 é rápido, mas isso não é a estrutura mais eficiente.

  • Uma versão mais refinada poderia atualizar somente:

  • FWD quando mudou

  • REF quando mudou

  • SWR quando mudou

  • dBm quando mudou

  • RANGE quando mudou

  • barra quando mudou

  • Isso reduziria ainda mais o trabalho gráfico e poderia deixar a interface mais estável.


  • 47. Resumo dos principais parâmetros

  • Parâmetro

    Onde

    Função

    FWD

    GPIO 15

    Potência direta

    REF

    GPIO 16

    Potência refletida

    ADC

    12 bits

    0–4095

    ADC máximo

    3,3 V

    referência usada

    Potência máxima

    1000 W

    escala da sonda

    Offset FWD

    0 W

    correção de zero

    Offset REF

    0 W

    correção de zero

    Range

    10–1000 W

    escala FWD

    Auto range

    Sim

    seleção automática

    SWR

    1–99,9

    cálculo ROE

    dBm

    calculado

    potência FWD

    Filtro

    α=0,30

    suavização

    Touch SDA

    GPIO 4

    I²C

    Touch SCL

    GPIO 8

    I²C

    Touch RESET

    GPIO 12

    reset

    Touch INT

    GPIO 11

    interrupção

    Tela

    480×320 lógico

    interface


  • O ponto mais importante para usar esse projeto

  • A cadeia completa é:

  • SONDA RF → tensão analógica → divisor/condicionamento → ADC ESP32 → conversão para watts → filtro → FWD/REF → cálculo SWR → barras e números.

  • E a relação matemática central é:

  • P=4095ADC×1000

  • e:

  • SWR=1−PREF/PFWD​​1+PREF/PFWD​​​

  • Portanto, a precisão final do SWR depende principalmente da calibração das entradas FWD e REF, enquanto a aparência da escala, cores, ranges e barras é controlada separadamente pelo código gráfico.

  •  

  • JC3248W535_wattimetro__source_code.rar