#include <LiquidCrystal.h> // LCD
#include <DacESP32.h> // Conversor Digital - Analogico
#define BOTAO1 14 // Pino do botao que aumenta a freq
#define BOTAO2 12 // Pino do botao que diminui a freq
#define DAC GPIO_NUM_25 // Saida analogica
#define ARRAY 6 // Quantidade de frequencias salvas
#define PINO_A0 34 // Entrada analogica
// Ajuste de da leitura para aparecer no LCD com os numeros corretos
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
int freq = 0; // Indice do vetor de frequencias
int lista_freq[ARRAY] = {25, 50, 100, 200, 500, 1000}; // Todas as frequencias que o sistema ira gerar
int display_freq = 1; // Seleciona qual frequencia sera mostrada no LCD
int leitura = 0; // Valor lido na entrada analogica
LiquidCrystal lcd(19, 23, 18, 17, 16, 15); // Pinos utilizados para o LCD
DacESP32 dac1(DAC); // Biblioteca do conversor Digital Analogico
float pico = 0; // Tensao maxima do sistema
float tensao = 0; // Tensao atual do sistema
int leitura_pico = 0; // Tensao maxima do sistema (sem calcular, ainda em valor digital)
int reset_picos = 0; // Quantidade de leituras ate atualizar no LCD
void setup()
{
pinMode(BOTAO1, INPUT_PULLUP); // Pull UP interno do botao, ATIVO EM GND
pinMode(BOTAO2, INPUT_PULLUP);
lcd.begin(16, 2); // Inicializa o LCD, no padrao de 16 colunas e 2 linhas
Serial.begin(115200); // Inicia a serial para mostrar dados
dac1.disable(); // Desativa o conversor Digital analogico
}
void loop()
{
int btn_1 = digitalRead(BOTAO1); // Le o botao de aumentar freq
int btn_2 = digitalRead(BOTAO2); // Le o botao de diminuir freq
if (btn_1 == 0) // Se estiver ativo
{
freq++; // Aumenta a freq
if(freq > ARRAY - 1) // Se for a ultima frequencia listada
{
freq = ARRAY - 1; // Nao aumenta
}
delay(200); // Evita multiplos cliques
}
if (btn_2 == 0) // Se estiver ativo
{
freq--; // Diminui a freq
if(freq < 0) // Se for a primeira frequencia listada
{
freq = 0; // Nao diminui
}
delay(200); // Evita multiplos cliques
}
// Limpa os caracteres que ficam sobrando quando re-escreve a frequencia
if(display_freq < 10) // Limpa todas as posicoes
{
lcd.setCursor(1, 0);
lcd.print(" ");
lcd.setCursor(2, 0);
lcd.print(" ");
lcd.setCursor(3, 0);
lcd.print(" ");
}
else if(display_freq < 100)
{ // Nao precisa limpar a primeira
lcd.setCursor(2, 0);
lcd.print(" ");
lcd.setCursor(3, 0);
lcd.print(" ");
}
else if(display_freq < 1000)
{ // Limpa apenas a ultima
lcd.setCursor(3, 0);
lcd.print(" ");
}
display_freq = lista_freq[freq]; // Seleciona a frequencia pela variavel "freq"
lcd.setCursor(0, 0); // Coloca para escrever no inicio do LCD
lcd.print(display_freq); // Printa no LCD a frequencia escolhida
lcd.setCursor(10, 0); // Coloca para escrever no fim do LCV
lcd.print("Hz"); // Da a legenda do dado
dac1.enable(); // Inicia o conversor Digital analogico
dac1.outputCW(display_freq); // Escreve na saida do ESP a frequencia escolhida para ser amplificada
// Leitura da tensao
leitura = analogRead(PINO_A0); // Le o divisor de tensao que ajusta a tensao amplificada para niveis seguros
if(leitura_pico < leitura) // Para manter a maior temperatura
{
leitura_pico = leitura; // Salva a maior leitura
pico = leitura * 0.0008056640625; // Converte de valores INTEIROS para float
tensao = 19.2 * pico / 2.86; // Calcula o equivalente em tensao da leitura (eleva para a tensao original antes do divisor)
tensao = mapfloat(tensao, 2.0, 18.8, 3.0, 19.2); // Mapeia fazendo uma "regra de tres" dar um ajuste fino
}
if(reset_picos < 100) // Devo fazer o refresh no LCD?
{
reset_picos++; // Nao, entao conto o "frame"
}
else // Sim!
{
reset_picos = 0; // Da o refresh no LCD para garantir que sempre a tensao maxima vai ser mostrada
leitura_pico = 0;
}
if(tensao < 10) // Limpa os caracteres que estao sobrando
{
lcd.setCursor(4, 1); // Apenas para a posicao final
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(tensao);
}
else
{
lcd.setCursor(0, 1); // Nao precisa de limpesa, apenas escreve o dado
lcd.print(tensao);
}
lcd.setCursor(10, 1); // Escreve a legenda do dado
lcd.print("Volts");
}