-
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 kΩ
-
R2 = 10 kΩ
-
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/PFWD1+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