ANALISADOR e GERADOR AF e RF com arduino e AD9850



Ola amigos, vamos descrever mais um equipamento simples.
Trata-se de um gerador de audio e de RF, como tambem um analisador de filtros de audio, de RF e um analisador de antenas.
Não é um equipamento profissional e nem tem esta pretenção, mas é muito util para o montador e para o experimentador que com um pouco de imaginação é possivel testar coisas diferentes de radio.
Como os aparelhos tem partes em comum, resolvemos juntar tudo em um só.
Esta montagem devera ainda ser ampliada (na maioria via software), como o que faço nunca acaba, eu resolvi descrever em partes e ir fazendo um update do que sera ampliado.
O material foi comprado na Asia (China, Singapura etc.) via Ebay.

CARACTERISTICAS :

 
Esquema :


O circuito foi montado em modulos e soldados e fixados em uma placa de plano terra.
O equipamento é operado com um controle remoto (TV, video etc.), com outros tipos de controle seriam necessarios encoders e varios botões, com isso usamos somente uma porta do Arduino e com o outro sistema teriamos que usar varias portas.
O equipamento funciona tambem com display de 128x128 sendo necessarios pequenos ajustes no software.
Para usar um novo tipo de controle remoto é necessario carregar um outro software no Arduino e acionar as teclas e ler os codigos hexadecimais no monitor serial (monitor do PC).
Na parte de ajustes descreveremos como fazer isto.
O programa esta configurado para usar um controle remoto de TV sony RM-Y180 da antiga Sony Vega (setado para SAT/CABLE).

Descrição do funcionamento :

Controle de operações : é feito pelo Arduino e ajustado via controle remoto.

Gerador de sinais : audio e RF são gerados pelo modulo DDS AD9850 com um controle de amplitude (modulo ALC). Na saida uso um LPF calculado para 45MHz (opcional).

Gerador de audio : usamos o AD9850 para gerar ondas senoidais, com amplitude estaveis, de 0 a 400kHz, sendo possivel obter sinais até 1MHz com perdas de amplitude.
O Sinal gerado pelo DDS é amplificado por um LM386. O sinal de saida do LM386 passa por umpotenciometro para controle manual de amplitude. Este mesmo gerador é usado no teste de filtros de audio.

Gerador de RF : usamos o AD9850 que vai até 45MHz com amplitude constante, controlada pelo circuito ALC. Como driver ou amplificador de Rf usamos um circuito com tres 2N3904, que prove uma saida de 50R de impedancia. Este circuito é usado tambem pelo analisador de filtros e pelo analisador de antenas.

Analisador de Filtros de RF : um circuito detetor simples com um diodo de germanio, o sinal retificado de saida é enviado diretamente ao Arduino. O sinal  do Gerador de RF deve ser passado pelo circuito em teste e a saida deste circuito entra no detetor de RF.

Analisador de antenas : Uma ponte resistiva de SWR (ou ROE) foi usada para medir a SWR, os sinais de RF direto e refletido são medidos pela ponte e amplificador por um CI operacional (amplificador de CC) a saida amplificada vai diretamente para o Arduino. O gerador de RF esta conectado internamente a ponde de ROE, somente é necessaria a conexão da antena a ser analisada.

Analisador de Filtros de Audio : identico ao de RF, o detetor tem pequena diferença, no restante o circuito e a operação são identicos ..exceto a frequencia.

A montagem

Placa principal : contem o processador arduino nano, o modulo DDS AD9850, o filtro passa baixas (LPF) e conexões externas feitas por plugs. A conexão de alimentação e de aterramento não foram plugadas e sim soldadas diretamente.


PCB padrão de 7x5cm (Ebay) lado solda, com soquetes do nano e do modulo DDS soldados.


Modulo e arduino colocados na PCB.


Modulo já montado da esquerda para direita embaixo alimentação e diodo 1N4007, entradas analogicas (A2 ...A6) e conexão para display (em duas partes com esmalte vermelho), soquete para circuito integrado de 30 pinos comum (nano), centro em baixo saida de RF (2 pinos), display (roxo) e conexão para sensor de ir (3 pinos), a direita soquete modulo DDS.



Vista lado de solda, o LPF foi montado com capacitores e indutores SMD (Ebay) a direita em cima.


Detalhe do filtro passa baixas LPF.

Modulo DRIVER
Montado em uma placa de 20x35mm, com toroides de lampadas economicas e transistores 2N2222.

Os circuitos atenuadores foram incorporados a estes modulos na entrada e na saida de sinal.
(esquerda em baixo e direita em cima).




Este tipo de montagem é ideal para RF, com conexões curtas e um otimo aterramento.

Modulo ALC


Este modulo foi montado com diodos 1N5711 (Ebay) .


A Placa de montagem tem 20x25mm.

Modulo de saida de audio (até 400kHz).

Usamos o LM386 que foi bem até 1MHz.





Circuitos detetores de RF


Usamos resitores e capacitores SMD, diodos de germanio e dois diodos zener de 5V1 que não aparecem na foto.

Detetor de RF logaritmico AD8307


O AD8307 e a placa adaptadora foram comprados no Ebay.
Apesar de estar funcionando perfeitamente o medidor logaritmico esta sem função definida pelo software, esta função será habilitada na proxima versão.

Montagem final

Montamos a placa de plano terra em uma tabua de madeira de MDF, na frente e na trazeira montamos um painel de aluminio, na frente temos os controles e as saidas e entradas de audio e RF, alem do potenciometro. Na parte trazeira temos a alimentação um rasgo para conexão da USB para programação do arduino e para uma eventual saida para o PC dos graficos. E tambem a entrada de antena. Usei varios conectores BNC painel que custam muito pouco na China.


A esquerda em cima temos a fonte de 5V, logo abaixo o amplificador do medidor de SWR e abaixo dele a ponte de SWR. No centro em cima e a direita a placa padrão onde montamos p arduino (a direita e o modulo AD9850 a esquerda.
A esquerda em baixo ponte de SWR, AD8307 e circuito detetor de AF e RF (embaixo a direita) embaixo e no centro amplificador de RF, embaixo a direita amplificador de audio LM386 e logo acima ALC.




Software
Lembramos que o autor (no caso eu py2ohh) não cursou escola de eletronica ou de computação (ou formação em linguas ingles ou portugues) ...os erros e bugs (que são muitos) podem ser apontados que estudaremos como acertar !
Parte deste trabalho foi baseado no artigo de um gerador de sinais deste site
http://www.vwlowen.co.uk/arduino/AD9833-waveform-generator/AD9833-waveform-generator.htm
Many thanks John !

Sketch do arquivo .ino
Arquivo .INO do analisador


#include <IRremote.h>
#include <TFT.h>  // Arduino LCD library
#include <SPI.h>
//modificações para o novo sweep
#define cs   10
#define dc   8
#define rst  9

#define W_CLK 7
#define FQ_UD 6
#define DATA 5
#define RESET 4

#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
volatile unsigned long frequency = 1000000;

String ero;
String xero = "";

long xeroxero = 0;

volatile unsigned long freqini = 6800000;

long freqfinal = 7500000;
float freqvelha = 0;
long passo = 1000;
long divi = 10000;
long f1;
long f2;
String sfreqini = "" ;
String sfreqfinal = "" ;
String spasso = "";
String sf1 = "";
String sf2 = "";
char fini [15];
char f1s [15];
char f2s [15];
char fnal [15];
char fpas [8];
String oqeh = "1";
String hz = "kHz";

int freq;
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results lido;
float valorlido;
float prglido;
int num = 0;

int x0 = 0;
int x1 = 0;
int y0 = 0;
int y1 = 0;
float ylido = 0;
int npasso = 0;
double mult1 = 1;

int gs = 0;
long frmax = 42000000;
long frmin = 10;

float Vinc, Vref, SWR, V1, V2;
String branco = " ";
TFT TFTscreen = TFT(cs, dc, rst);

int incr = 1;
int incrvelho = 1;

int alt;  //altura do diplay automatica
int larg; // largura do display automatica



void setup() {
  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  alt = TFTscreen.height();
  larg = TFTscreen.width();
  Serial.begin(9600);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Frequencia,Voltagem");

  pinMode(FQ_UD, OUTPUT);
  pinMode(W_CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(RESET, OUTPUT);
  pulseHigh(FQ_UD);
  irrecv.enableIRIn(); // Inicializa o receptor IR

}

void loop() {


  if (oqeh == "1") {

    TFTscreen.background(0, 0, 0);

    TFTscreen.stroke(255, 255, 255);

    TFTscreen.setTextSize(2);

    TFTscreen.text("MENU", 0, 0);
    TFTscreen.setTextSize(1);
    TFTscreen.text("Selecione o numero", 50, 5);

    TFTscreen.stroke(0, 255, 0);
    TFTscreen.text("1. GERADOR DE SINAIS", 0, 25);

    TFTscreen.text("2. GERADOR DE AUDIO", 0, 45);

    TFTscreen.text("3. ANALISADOR DE ANTENAS", 0, 65);

    TFTscreen.text("4. ANALISADOR DE FILTROS", 0, 85);



    TFTscreen.text("5. ANAL.FILTROS DE AUDIO", 0, 105);
    gs = 0;
    oqeh = " ";
  }
  if (irrecv.decode(&lido)) {
    prglido = (lido.value);

    if (prglido == 0xED) {
      oqeh = "1";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("GERADOR ", 0, 25);
      TFTscreen.text("  DE SINAIS ", 0, 60);
      irrecv.resume();
      delay(1000);
      freqini = 7000000;
      gersin();
      sendFrequency(0);
    }
    if (prglido == 0x40ED) {
      oqeh = "2";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("GERADOR ", 0, 25);
      TFTscreen.text("  DE AUDIO ", 0, 60);
      //irrecv.resume();
      delay(1000);
      //gs=0;
      freqini = 1000;
      gersin();
      sendFrequency(0);

      oqeh = "1";
    }
    if (prglido == 0x20ED) {
      oqeh = "3";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text(" ANALISADOR ", 0, 25);
      TFTscreen.text(" DE ANTENAS ", 0, 60);
      irrecv.resume();
      delay(1000);
      divi = 100000;
      anafiaud(3);
      sendFrequency(0);
      oqeh = "1";
    }
    if (prglido == 0x60ED) {
      oqeh = "4";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("ANALISADOR  ", 0, 25);
      TFTscreen.text("  DE FILTROS", 0, 60);
      irrecv.resume();
      delay(1000);
      gs = 0;
      divi = 100000;

      anafiaud(2);
      sendFrequency(0);
      oqeh = "1";
    }
    if (prglido == 0x10ED) {
      oqeh = "5";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("ANALISADOR ", 0, 25);
      TFTscreen.text("  DE FILTROS ", 0, 60);
      TFTscreen.text("  DE AUDUIO", 0, 90);
      irrecv.resume();
      delay(1000);
      divi = 100;
      anafiaud(1);
      sendFrequency(0);
      oqeh = "1";
    }
    irrecv.resume();
  }
}

void tfr_byte(byte data)
{
  for (int i = 0; i < 8; i++, data >>= 1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK);
  }
}

// Send frequency and command word to AD9850
void sendFrequency(double frequency) {
  int32_t freq = frequency * 4294967295 / (125000000 ); // note 125 MHz clock on 9850
  for (int b = 0; b < 4; b++, freq >>= 8) {
    tfr_byte(freq & 0xFF);
  }
  tfr_byte(0);
  pulseHigh(FQ_UD);
}
void gersin() {
  TFTscreen.background(0, 0, 0);
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text(" FREQUENCIA" , 0 , 10);
  TFTscreen.stroke(255, 0, 0);
  TFTscreen.setTextSize(1);
  TFTscreen.text("   MHz    kHz     Hz" , 0 , 65);
  while (gs == 0) {
    if ((freqini != freqvelha) || (incr != incrvelho)) {
      sendFrequency(freqini);
      TFTscreen.setTextSize(2);
      format(freqini);

      freqvelha = freqini;
      incrvelho = incr;
      delay(50);
    }
    if (irrecv.decode(&lido)) {
      float result = (lido.value);

      if (result) {
        delay(50);
        if (result == 0x57ED)  {
          if (incr <= 6) incr ++ ;
        }
        if (result == 0x17ED) {
          if (incr >= 1) (incr -- );
        }
        double valor = 0;
        switch (incr) {
          case 0:
            valor = 0;
            break;
          case 1:
            valor = 10;
            break;
          case 2:
            valor = 100;
            break;
          case 3:
            valor = 1000;
            break;
          case 4:
            valor = 10000;
            break;
          case 5:
            valor = 100000;
            break;
          case 6:
            valor = 1000000;
            break;
          case 7:
            valor = 10000000;
            break;
        }
        if (result == 0x27ED) {
          if (freqini <= 50000000) {
            freqini = (freqini + valor);

          }
        }
        if (freqini > 50000000) {
          (freqini = 50000000);
        }
        if (result == 0x67ED) {
          if (freqini > valor) {
            freqini = (freqini - valor);
          }
          else {
            freqini = 0;
          }

        }



        if ((freqini != freqvelha) || (incr != incrvelho)) {
          TFTscreen.fill(0, 0, 0);
          TFTscreen.stroke(0, 0, 0);
          TFTscreen.rect(0, 43, 160, 20);
        }

      }
      Serial.println(freqini);
      Serial.println(incr);
      Serial.println(pow(10, incr));
      if (result == 0x1BED) { //tecla JUMP
        gs = 1;
      }
      delay(50);
      irrecv.resume();
    }

  }
}



void anafiaud(int rere) {
  TFTscreen.background(0, 0, 0);
  if (rere == 1) {
    freqini = 100;
    freqfinal = 10000;
    passo = 50;
    hz = "Hz";
  }
  if ((rere == 2) || (rere == 3)) {
    freqini = 1000000;
    freqfinal = 30000000;
    passo = 50000;
    hz = "kHz";
  }

  while (gs == 0) {
    String sfreqfinal = String(freqfinal);
    String sfreqini = String(freqini);
    String spasso = String(passo);
    String sf1 = String(f1);
    String sf2 = String(f2);
    if (oqeh != "PARE") {
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.setTextSize(1);
      TFTscreen.text("FREQUENCIA INICIAL :", 0, 0);
      TFTscreen.stroke(0, 255, 255);
      TFTscreen.setTextSize(2);
      //sfreqini=sfreqini+ " kHz";
      sfreqini.toCharArray(fini, 15);
      TFTscreen.text(fini , 0, 11);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.setTextSize(1);
      TFTscreen.text("FREQUENCIA FINAL :", 0, 32);
      TFTscreen.stroke(0, 255, 255);
      TFTscreen.setTextSize(2);
      sfreqfinal.toCharArray(fnal, 15);
      TFTscreen.text(fnal , 0, 43);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.setTextSize(1);
      TFTscreen.text("PASSO :", 0, 65);
      TFTscreen.stroke(0, 255, 255);
      TFTscreen.setTextSize(2);
      spasso.toCharArray(fpas, 15);
      TFTscreen.text(fpas , 0, 76);
      TFTscreen.setTextSize(1);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("MARCA 1", 0, 98);
      TFTscreen.stroke(0, 255, 255);
      sf1.toCharArray(f1s, 15);
      TFTscreen.text(f1s, 50, 98);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("MARCA 2", 0, 112);
      TFTscreen.stroke(0, 255, 255);
      sf2.toCharArray(f2s, 15);
      TFTscreen.text(f2s, 50, 112);

    }
    if (irrecv.decode(&lido)) {
      valorlido = (lido.value);
      if (valorlido == 0xEED) {
        oqeh = " ";
        TFTscreen.background(0, 0, 0);
      }
      if (valorlido == 0x490) {
        oqeh = "F1";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == 0x4ED) {
        oqeh = "F2";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == 0x57ED) {
        oqeh = "inicio";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == 0x17ED) {
        oqeh = "fim";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == 0x27ED) {
        oqeh = "passo";
        num = 0;
        numerico();
        oqeh = " ";

        TFTscreen.background(0, 0, 0);
      }

      if (valorlido == 0x37ED) {
        frequency = freqini;


        TFTscreen.background(0, 0, 0);
        npasso = 0;
        x0 = 0;
        y0 = 0;
        while (frequency <= freqfinal)
        {


          oqeh = "PARE";

          TFTscreen.stroke(255, 255, 255);
          TFTscreen.setTextSize(1);
          String sfreqfinal = String(frequency);
          sfreqfinal.toCharArray(fnal, 15);
          TFTscreen.text(fnal , 0, 0);


          sendFrequency(frequency);

          TFTscreen.stroke(128, 128, 128);
          TFTscreen.line (0, 0, 0, alt);
          TFTscreen.line (31, 0, 31, alt);
          TFTscreen.line (63, 0, 63, alt);
          TFTscreen.line (95, 0, 95, alt);
          TFTscreen.line (127, 0, 127, alt);
          TFTscreen.line (159, 0, 159, alt);
          TFTscreen.line (0, alt - 1, larg, alt - 1);
          TFTscreen.line (0, alt - 24, larg, alt - 24);
          TFTscreen.line (0, alt - 48, larg, alt - 48);
          TFTscreen.line (0, alt - 72, larg, alt - 72);
          TFTscreen.line (0, alt - 96, larg, alt - 96);
          TFTscreen.line (0, alt - 128, larg, alt - 128);
          TFTscreen.stroke(0, 255, 0);


          if ((rere == 1) || (rere == 2)) {
            y1 = map(mult1 * ylido, 0, 1023, 1, alt);
          }
          if ((rere == 3)) {


            y1 = map(ylido, 0, 50, 1, alt);
            if (y1 > alt) {
              (y1 = alt);
            }
            TFTscreen.stroke(0, 255, 0);
            if (y1 < 39) {
              TFTscreen.stroke(0, 255, 255);
            }
          }
          int maxpasso = ((freqfinal - freqini) / passo);
          npasso++;
          x1 = map(npasso, 1, maxpasso, 1, 160);

          TFTscreen.line (x0, alt - y0, x1, alt - y1);
          x0 = x1;
          y0 = y1;

          if (x0 == 31) {
            int xlabel = ((freqini + ((freqfinal - freqini) / 5)) / divi);

            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 20, alt - 8);
          }
          if (x0 == 63) {
            int xlabel = ((freqini + (2 * (freqfinal - freqini) / 5)) / divi);

            //int xlabel = ((divi));
            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 52, alt - 8);
          }
          if (x0 == 95) {
            int xlabel = ((freqini + (3 * (freqfinal - freqini) / 5)) / divi);
            // int xlabel = ((divi));
            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 84, alt - 8);
          }
          if (x0 == 127) {
            int xlabel = ((freqini + (4 * (freqfinal - freqini) / 5)) / divi);
            //int xlabel = ((divi));
            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 116, alt - 8);
          }

          TFTscreen.text(fpas , 146, alt - 8);
          // }
          if (frequency == f1) {
            TFTscreen.stroke(0, 0, 255);
            TFTscreen.line (x1, 0, x1, alt);
          }
          if (frequency == f2) {
            TFTscreen.stroke(0, 0, 255);
            TFTscreen.line (x1, 0, x1, alt);
          }


          delay(5);
          if ((rere == 1) || (rere == 2))
          {
            mult1 = 1;
            V1 = (analogRead(2));

            ylido = V1;
            V1 = (V1 * 5.0) / 1024.0;
            V2 = analogRead(3);

            if (rere == 1) {
              ylido = V2;
            }
            V2 = (V2 * 5.0) / 1024.0;

            Serial.print("DATA, , , ,");
            Serial.print(frequency);
            Serial.print(",");
            Serial.print(V1);
            Serial.print(",");

            Serial.println("");

          }

          if (rere == 3)
          {
            Vinc = analogRead(4);

            Vinc = abs(Vinc);
            Vref = analogRead(5);

            if (Vref >= Vinc) {
              Vref = (Vinc - 0.01);
            }

            SWR = (Vinc + Vref) / (Vinc - Vref);
            if (SWR < 1) {
              SWR = 4 ;
            }
            ylido = 10 * SWR;
            mult1 = 1;
            Serial.print("DATA, , , ,");
            Serial.print(frequency);
            Serial.print(",");
            Serial.print(Vinc);
            Serial.print(",");
            Serial.print(Vref);
            Serial.print(",");
            Serial.println(SWR);
            Serial.println("");
          }
          TFTscreen.stroke(0, 0, 0);
          TFTscreen.text(fnal , 0, 0);
          frequency = (frequency + passo);

        }


      }


      if (valorlido == 0x1BED) { //tecla JUMP
        gs = 1;
        oqeh = "1";
      }
      irrecv.resume();
    }

  }
}


void numerico() {

  TFTscreen.background(0, 0, 0);

  while (num == 0) {
    if (irrecv.decode(&lido))

    {
      valorlido = (lido.value);


      if (valorlido == 0xED)
      {
        ero = "1";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x40ED)
      {
        ero = "2";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x20ED)
      {
        ero = "3";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x60ED)
      {
        ero = "4";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x10ED)
      {
        ero = "5";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x50ED)
      {
        ero = "6";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x30ED)
      {
        ero = "7";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x70ED)
      {
        ero = "8";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x8ED)
      {
        ero = "9";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == 0x48ED)
      {
        ero = "0";
        xero = xero + ero;
        delay (500);
      }

      TFTscreen.background(0, 0, 0);
      TFTscreen.stroke(0, 255, 255);//azul claro
      TFTscreen.setTextSize(2);
      TFTscreen.text("FREQUENCIA ", 0, 0);

      oqeh.toCharArray(fini, 15);
      TFTscreen.text(fini , 5, 22);
      // TFTscreen.stroke(0, 255, 255);//azul claro
      TFTscreen.text("  EM ", 0, 44);
      if (oqeh == "passo") {
        String pass = "Hz";
        pass.toCharArray(fini, 15);
        TFTscreen.text(fini, 75, 44);
      }
      else {
        hz.toCharArray(fini, 15);
        TFTscreen.text(fini, 75, 44);
      }
      TFTscreen.stroke(0, 255, 0); //verde

      xero.toCharArray(fnal, 25);
      TFTscreen.text(fnal , 0, 70);

      if (valorlido == 0xEED)
      {
        if (hz == "kHz")
        {
          xero = (xero + "000");
        }
        xeroxero = xero.toInt();


        if (hz == "kHz")
        {
          if (xeroxero > 50000001) {
            (xeroxero = 50000000);
          }
          if (xeroxero < 10) {
            (xeroxero = 10);
          }
        }

        if (oqeh == "passo")
        {
          passo = xeroxero;
          if (hz == "kHz") {
            passo = (xeroxero / 1000);
            if (passo > 50001)  {
              (passo = 50000);
            }
            if (passo < 1) {
              (passo = 1);
            }
          }
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("PASSO EM Hz", 0, 0);
          TFTscreen.stroke(0, 255, 0); //verde
          String spasso = String(passo);
          spasso.toCharArray(fpas, 15);
          TFTscreen.text(fpas , 0, 20);
          delay (3000);

        }
        if (oqeh == "F1")
        {
          f1 = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("MARCA  1", 0, 22);
          TFTscreen.stroke(0, 255, 0); //verde
          String sf1 = String(f1);
          sf1.toCharArray(fini, 15);
          TFTscreen.text(fini , 0, 48);
          delay (3000);

        }
        if (oqeh == "F2")
        {
          f2 = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("MARCA 2", 0, 22);
          TFTscreen.stroke(0, 255, 0); //verde
          String sf2 = String(f2);
          sf2.toCharArray(fini, 15);
          TFTscreen.text(fini , 0, 48);
          delay (3000);

        }
        if (oqeh == "inicio")
        {
          freqini = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("INICIAL Hz ", 0, 22);
          TFTscreen.stroke(0, 255, 0); //verde
          String sfreqini = String(freqini);
          sfreqini.toCharArray(fini, 15);
          TFTscreen.text(fini , 0, 48);
          delay (3000);

        }
        if (oqeh == "fim")
        {
          freqfinal = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("FINAL Hz ", 0, 22);

          TFTscreen.stroke(0, 255, 0); //verde
          String sfreqfinal = String(freqfinal);
          sfreqfinal.toCharArray(fnal, 15);
          TFTscreen.text(fnal , 0, 48);
          delay (3000);

        }

        xero = "";
        ero = "";
        xeroxero = 0;
        num = 1;

        TFTscreen.background(0, 0, 0);

      }

      irrecv.resume();
    }
  }
}
void format(unsigned long value) {
  unsigned long j = 10000000;
  for (int i = 0; i <= 7; i++) {
    int digit = (value / j) % 10;
    incr == (7 - i) ? TFTscreen.stroke(0, 255, 255) : TFTscreen.stroke(0, 255, 0);
    String sfreqini = String(digit);
    sfreqini.toCharArray(fnal, 15);
    TFTscreen.text(fnal , 17 * i + 10, 43);
    if ( (i == 4) || (i == 1)) {
      TFTscreen.stroke(255, 255, 0);
      TFTscreen.text("." , (17 * i + 17), 43);
    }
    j /= 10;
  }
  delay(30);
}


Ajustes

Ajuste do ALC ...conectar a saida de RF a entrada de RF linear ... ligar o analisador de filtros de RF ... frequencia inicial 1MHz ...frequencia final 32Mhz ou 45 MHz se preferir... passo 50kHz ...mande executar ...e cada grafico vá reajustando o potenciomentro do ALC até obter uma saida estavel do inicio ao final do grafico.

Video mostrando o DDS sem o ALC

Video mostrando o DDS com o ALC ajustado


Como usar este equipamento :

1. Gerador de sinais
Gera um sinal senoidal de 1Mhz a 45Mhz estavel, sendo possivel ajustar de 1 em 1Hz.
O ajuste sempre é feito com o controle remoto.
No menu iniciar selecione "1"

2. Gerador de audio
Gera um sinal senoidal de 0 a 1MHz sendo que até cerca de 400kHz o sinal é estavel.
O ajuste possivel é de 1Hz.
No menu iniciar selecione "2"

3. Analisador de antenas
Conecte a antena sob teste no plug correspondente.]
No menu iniciar selecione "3"

Entre com a frequencia de inicio ... tecle "seta a esquerda" no controle remoto
Digite a frequencia no teclado numerico ...
Apos digitar confirme tecla"MENU".

Repita para a frequencia final tecla "seta a direita" 
Repita para o passo tecla "seta para cima"

Caso deseje colocar marcadores temos dois , repita os passos para colocação do valor da frequencia, sempre confirmando apos a seleção.
Marcador 1 tecla "VOL+"
Marcador 2 tecla "CH+"

lembrando que todas as frequencias são em Khz somente o passo é em Hz (limitado a 50kHz maximo).

estando tudo ajustado conforme desejado acione a tecla central das setas, para gerar o grafico.

Ao final do grafico para retornar ao menu do analisador de antenas tecle "MENU" ... para reajustar os valores .. repita os item anteriores... para retornar ao menu principal tecle "JUMP"


4. Analisador de filtros
Ligue a saida de RF na entrada do filtro sob teste, lembre-se que a impedancia de saida do nosso gerador é de 50R.
Ligue a saida do filtro sob teste na entrada de RF do detetor.
Caso o filtro seja ativo, é necessario alimentar o filtro convenientemente e usar um capacitor de acoplamento caso aja tensão na saida.
Lembre-se que a entrada do detetor de RF é de alta impedancia, é conveniente ligar um resistor no valor da impedancia do filtro, caso não seja ligado um resistor de carga o grafico saira deformado não indicando a realidade.
A conexão terra (ground) é necessaria.
Para testar cristais é necessario montar uma giga de teste. Ver em
Como medir cristais

No menu iniciar selecione "4"

Entre com a frequencia de inicio ... tecle "seta a esquerda" no controle remoto
Digite a frequencia no teclado numerico ...
Apos digitar confirme tecla"MENU".

Repita para a frequencia final tecla "seta a direita" 
Repita para o passo tecla "seta para cima"

Caso deseje colocar marcadores temos dois , repita os passos para colocação do valor da frequencia, sempre confirmando apos a seleção.
Marcador 1 tecla "VOL+"
Marcador 2 tecla "CH+"

lembrando que todas as frequencias são em kHz somente o passo é em Hz (limitado a 50kHz maximo).

estando tudo ajustado conforme desejado acione a tecla central das setas, para gerar o grafico.

Ao final do grafico para retornar ao menu do analisador de filtros de RF tecle "MENU" ... para reajustar os valores .. repita os item anteriores... para retornar ao menu principal tecle "JUMP"


5. Analisador de filtros de audio

Ligue a saida de audio na entrada do filtro sob teste, lembre-se que a impedancia e a amplitude de saida do nosso gerador é ajustada por um potenciometro de 1k.
Ligue a saida do filtro sob teste na entrada de do detetor de audio.
Caso o filtro seja ativo, é necessario alimentar o filtro convenientemente e usar um capacitor de acoplamento caso aja tensão na saida.
Lembre-se que a entrada do detetor de RF é de alta impedancia, é conveniente ligar um resistor no valor da impedancia do filtro, caso não seja ligado um resistor de carga o grafico saira deformado não indicando a realidade.
A conexão terra (ground) é necessaria.

No menu iniciar selecione "5"

Entre com a frequencia de inicio ... tecle "seta a esquerda" no controle remoto
Digite a frequencia no teclado numerico ...
Apos digitar confirme tecla"MENU".

Repita para a frequencia final tecla "seta a direita" 
Repita para o passo tecla "seta para cima"

Caso deseje colocar marcadores temos dois , repita os passos para colocação do valor da frequencia, sempre confirmando apos a seleção.
Marcador 1 tecla "VOL+"
Marcador 2 tecla "CH+"

lembrando que todas as frequencias e o passo são em Hz.
Estando tudo ajustado conforme desejado acione a tecla central das setas, para gerar o grafico.

Ao final do grafico para retornar ao menu do analisador de filtros de audio tecle 'MENU" ... para reajustar os valores .. repita os item anteriores... para retornar ao menu principal tecle "JUMP"

Exemplos de alguns testes em video

1. Gerador de audio video

2. Analisador de antenas video 1
Teste da minha antena V invertido de 40m

3. Analisador de antenas video 2
Mesmo teste anterior com ampliação

4. Analisador de audio - filtro ativo
Filtro ativo montado com TL084 com passa alta acima de 400Hz (2 estagios) e passa baixas abaixo de 3khz
(2 estagios).

5. Analisador de filtros LPF de 80m
Filtro LPF montado para o ararinha corte em 4Mhz

6. Analisador de filtros de RF - BPF caseiro
Filtro BPF passa banda para 80m com capacittores fixos pré calculado e indutor toroidal com nucleo a ar ... resultado é preciso colocar mais capacitancia  a frequencia esta alta...

7. Analisador de RF BPF toko sem ajustar
Filtro BPF passa banda para 80m sem ajuste, feitos com bobinas toko.

8. Analisador de filtros de Rf BPF toko ajustado

9. Analisador de filtros de audio + gerador de RF teste do RX ararinha
Teste do RX do Ararinha .... ajustamos o ararinha para receber em 7005kHz ... com o gerador de sinais em 7005 e bit zero no audio... ajustamos a varredura de RF (no caso Audio) de 7000 a 7010kHz variando de 50 em 50 hertz (o arduino acerta o passo, automaticamente, em função do tamanho da tela 160 pontos de largura) ... ligamos um fio 10cm na saida de RF como antena... ligamos a sida de audio do ararinha a entrada do detetor de audio... ligamos alimentação do ararinha auto falante e antena de 40m ... o grafico representa a forma que o audio é detetado no conjunto do ararinha LSB ... este resultado devemos ao filtro ladder de cristais ...

10. Analisador de filtros de audio - filtro passivo CW
Como há algum tempo brincamos com filtros de CW passivos ...eu peguei um filtro destes na caixa de "montados" e liguei ao analisador de filtros para ver o resultado ... ficou bom !

++++++++++++++++++++++++++

Implementações a ser efetuadas ( se possivel) :
1. Aumento da escala vertical (amplificação) do grafico, com um fator multiplicador, via software, setado pelo controle remoto.
2. Tela de medição de SWR em uma frequencia unica (SWR meter).
3. Tela de ajuste de antenas com SWR em 3 ou 4 frequencias diferentes (inicio meio fim da banda) com display continuo das  leituras de SWR.
4. Escala log via AD8307 já montado e testado falta implementar via software.
5. Usar o AD8307 para escala Log em audio.
6. Watimetro e miliwatimetro medidor de potencia com o AD8307.
7. Medir a perda por inserção do filtro (dB) em media ou em uma determinada frequencia.
8. Gravar os dados medidos em arquivo, usando um Sd Card  (compartimento para Sd card do display).
Aceitamos novas sugestões !

Lista de material

fonte      
2 diodo 1N4007   
1 CI 7805  
1 eletrolitico 47µF 16V
1 eletrolitico 100µF 6V3
2 capacitor 100nF 50V
       
1 sensor de IR TL1838 VS1838
1 arduino  nano c/  USB  
1 AD9850  DDS module  
       
ALC      
1 CI  LM358  
1 CI  78L08  
6 capacitor 100nF 50V
3 diodo 1N4148  
1 resistor 1M 1/4W
2 resistor 10k 1/4W
3 resistor 1k 1/4W
1 trimpot 100k  
1 transistor  2N7000  
       
LPF opcional    
2 indutor 270nH smd
1 indutor 330nH smd
2 capacitor 56pF ceramico ou SMD
2 capacitor 130pF ceramico ou SMD
       
driver de RF e atenuadores  
3 transistor 2N3904  
6 capacitor 100nF 50V
1 capacitor 180pF ceramico
1 capacitor 4n2 (472) ceramico
2 toroide Ft37-43  
2 resistor 1k 1/4W
2 resistor 2k2 1/4W
3 resistor 100R 1/4W
1 resistor 47R 1/4W
2 resistor 4R7 1/4W
4 resistor 270R 1/4W
4 resistor 22R 1/4W
       
amplificador de audio  
1 CI LM386  
1 indutor 22µH  
1 indutor 100µH  
1 eletrolitico 10µF 16V
2 eletrolitico 47µF 16V
1 resistor  22R 1/4W
1 potenciometro 1k 1/4W
       
detetores      
2 resistor 10k 1/4W
2 resistor 100k 1/4W
2 resistor 100R 1/4W
2 diodo germanio  
2 diodo zener 5V1 1/4W
2 capacitor 100nF  
1 eletrolitico 10µF 16V
       
detetor log opcional  
1 CI AD8307  
2 resistor 100R 1/4W
1 resistor 22R 1/4W
5 capacitor 100nF  
       
medidor de SWR    
1 CI TL082  
2 diodo germanio  
2 diodo zener 5V1 1/4W
8 resistor 100R 1/4W
4 resistor 10k 1/4W
2 resistor 1k 1/4W
2 resistor 1k5 1/4W
2 indutor 22µH  
5 capacitor 100nF  
       
1 display spi tft 1/8" 128x160  
       
miscelanea    
Conectores BNC para RF e antena  
  placa PCB     
  soquetes    
  flat cable    
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

Sketch para auxiliar a troca de codigos pelo uso de um novo controle remoto.
Sketch to help the change of IR remote control codes.

IR remote Sony TV

#include <IRremote.h>
#include <TFT.h>  // Arduino LCD library
#include <SPI.h>
//modificações para o novo sweep
#define cs   10
#define dc   8
#define rst  9

#define W_CLK 7
#define FQ_UD 6
#define DATA 5
#define RESET 4

#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
volatile unsigned long frequency = 1000000;

String ero;
String xero = "";

long xeroxero = 0;

volatile unsigned long freqini = 6800000;

long freqfinal = 7500000;
float freqvelha = 0;
long passo = 1000;
long divi = 10000;
long f1;
long f2;
String sfreqini = "" ;
String sfreqfinal = "" ;
String spasso = "";
String sf1 = "";
String sf2 = "";
char fini [15];
char f1s [15];
char f2s [15];
char fnal [15];
char fpas [8];
String oqeh = "1";
String hz = "kHz";

int freq;
int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results lido;
float valorlido;
float prglido;
int num = 0;

int x0 = 0;
int x1 = 0;
int y0 = 0;
int y1 = 0;
float ylido = 0;
int npasso = 0;
double mult1 = 1;

int gs = 0;
long frmax = 42000000;
long frmin = 10;

float Vinc, Vref, SWR, V1, V2;
String branco = " ";
TFT TFTscreen = TFT(cs, dc, rst);

int incr = 1;
int incrvelho = 1;

int alt;  //altura do diplay automatica
int larg; // largura do display automatica

// teclas do controle remoto TV sony
float n0 = 0x910  ; //tecla 0 key
float n1 = 0x10  ; // tecla 1 key
float n2 = 0x810  ; //tecla 2 key
float n3 = 0x410  ; //tecla 3 key
float n4 = 0xC10  ; //tecla 4  key
float n5 = 0x210  ; //tecla 5 key
float n6 = 0xA10  ; //tecla 6 key
float n7 = 0x610  ; //tecla 7 key
float n8 = 0xE10  ; //tecla 8 key
float n9 = 0x110  ; //tecla 9 key
float rtrn = 0xDD0  ; //tecla jump retorna - key return to main menu
float nrcfm = 0xA70  ; //tecla centro setas confirma valor numerico--
// key center of the arrows = press after keyed number complete
float nce = 0x2D0  ; //tecla <<= seta cursor a esquerda = key to left arrow
//-- in signal generator
//change cursor decimal place -left - in analyzers input start sweep frequency kHz
float ncd = 0xCD0  ; //tecla =>> seta cursor a direita -- key to right arrow
//in signal generator
//change cursor decimal place -right- in analyzers input final sweep frequency kHz
float nsobe = 0x2F0  ; //tecla + sobe um valor na posição do cursor = key up arrow
//= in signal generator
//up value in cursor position --- in analyzers input step sweep frequency in Hz
float ndesce = 0xAF0  ; //tecla - abaixa um valor na posição do cursor = key down arrow
//= in signal generator
//down value in cursor position
float ngo = 0x70 ; //tecla menu = menu key  = menu key choose one
//- press after conclued frequency entry and //
//press to return at secundary menu after a displayed graphic
float nf1 = 0x490 ; //tecla  entra com valor de F1= key choose one press key to enter the mark1 graphic frequecy
float nf2 = 0x90 ; //tecla entra com valor de F2  =key choose one press key to enter the mark2 graphic frequecy




void setup() {
  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  alt = TFTscreen.height();
  larg = TFTscreen.width();
  Serial.begin(9600);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Frequencia,Voltagem");

  pinMode(FQ_UD, OUTPUT);
  pinMode(W_CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(RESET, OUTPUT);
  pulseHigh(FQ_UD);
  irrecv.enableIRIn(); // Inicializa o receptor IR

}

void loop() {


  if (oqeh == "1") {

    TFTscreen.background(0, 0, 0);

    TFTscreen.stroke(255, 255, 255);

    TFTscreen.setTextSize(2);

    TFTscreen.text("MENU", 0, 0);
    TFTscreen.setTextSize(1);
    TFTscreen.text("Selecione o numero", 50, 5);

    TFTscreen.stroke(0, 255, 0);
    TFTscreen.text("1. GERADOR DE SINAIS", 0, 25);

    TFTscreen.text("2. GERADOR DE AUDIO", 0, 45);

    TFTscreen.text("3. ANALISADOR DE ANTENAS", 0, 65);

    TFTscreen.text("4. ANALISADOR DE FILTROS", 0, 85);



    TFTscreen.text("5. ANAL.FILTROS DE AUDIO", 0, 105);
    gs = 0;
    oqeh = " ";
  }
  if (irrecv.decode(&lido)) {
    prglido = (lido.value);

    if (prglido == n1) {
      oqeh = "1";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("GERADOR ", 0, 25);
      TFTscreen.text("  DE SINAIS ", 0, 60);
      irrecv.resume();
      delay(1000);
      freqini = 7000000;
      gersin();
      sendFrequency(0);
    }
    if (prglido == n2) {
      oqeh = "2";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("GERADOR ", 0, 25);
      TFTscreen.text("  DE AUDIO ", 0, 60);
      //irrecv.resume();
      delay(1000);
      //gs=0;
      freqini = 1000;
      gersin();
      sendFrequency(0);

      oqeh = "1";
    }
    if (prglido == n3) {
      oqeh = "3";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text(" ANALISADOR ", 0, 25);
      TFTscreen.text(" DE ANTENAS ", 0, 60);
      irrecv.resume();
      delay(1000);
      divi = 100000;
      anafiaud(3);
      sendFrequency(0);
      oqeh = "1";
    }
    if (prglido == n4) {
      oqeh = "4";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("ANALISADOR  ", 0, 25);
      TFTscreen.text("  DE FILTROS", 0, 60);
      irrecv.resume();
      delay(1000);
      gs = 0;
      divi = 100000;

      anafiaud(2);
      sendFrequency(0);
      oqeh = "1";
    }
    if (prglido == n5) {
      oqeh = "5";
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("ANALISADOR ", 0, 25);
      TFTscreen.text("  DE FILTROS ", 0, 60);
      TFTscreen.text("  DE AUDUIO", 0, 90);
      irrecv.resume();
      delay(1000);
      divi = 100;
      anafiaud(1);
      sendFrequency(0);
      oqeh = "1";
    }
    irrecv.resume();
  }
}

void tfr_byte(byte data)
{
  for (int i = 0; i < 8; i++, data >>= 1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK);
  }
}

// Send frequency and command word to AD9850
void sendFrequency(double frequency) {
  int32_t freq = frequency * 4294967295 / (125000000 ); // note 125 MHz clock on 9850
  for (int b = 0; b < 4; b++, freq >>= 8) {
    tfr_byte(freq & 0xFF);
  }
  tfr_byte(0);
  pulseHigh(FQ_UD);
}
void gersin() {
  TFTscreen.background(0, 0, 0);
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text(" FREQUENCIA" , 0 , 10);
  TFTscreen.stroke(255, 0, 0);
  TFTscreen.setTextSize(1);
  TFTscreen.text("   MHz    kHz     Hz" , 0 , 65);
  while (gs == 0) {
    if ((freqini != freqvelha) || (incr != incrvelho)) {
      sendFrequency(freqini);
      TFTscreen.setTextSize(2);
      format(freqini);

      freqvelha = freqini;
      incrvelho = incr;
      delay(50);
    }
    if (irrecv.decode(&lido)) {
      float result = (lido.value);

      if (result) {
        delay(50);
        if (result == nce)  {
          if (incr <= 6) incr ++ ;
        }
        if (result == ncd) {
          if (incr >= 1) (incr -- );
        }
        double valor = 0;
        switch (incr) {
          case 0:
            valor = 0;
            break;
          case 1:
            valor = 10;
            break;
          case 2:
            valor = 100;
            break;
          case 3:
            valor = 1000;
            break;
          case 4:
            valor = 10000;
            break;
          case 5:
            valor = 100000;
            break;
          case 6:
            valor = 1000000;
            break;
          case 7:
            valor = 10000000;
            break;
        }
        if (result == nsobe) {
          if (freqini <= 50000000) {
            freqini = (freqini + valor);

          }
        }
        if (freqini > 50000000) {
          (freqini = 50000000);
        }
        if (result == ndesce) {
          if (freqini > valor) {
            freqini = (freqini - valor);
          }
          else {
            freqini = 0;
          }

        }



        if ((freqini != freqvelha) || (incr != incrvelho)) {
          TFTscreen.fill(0, 0, 0);
          TFTscreen.stroke(0, 0, 0);
          TFTscreen.rect(0, 43, 160, 20);
        }

      }
      Serial.println(freqini);
      Serial.println(incr);
      Serial.println(pow(10, incr));
      if (result == rtrn) { //tecla JUMP
        gs = 1;
      }
      delay(50);
      irrecv.resume();
    }

  }
}



void anafiaud(int rere) {
  TFTscreen.background(0, 0, 0);
  if (rere == 1) {
    freqini = 100;
    freqfinal = 10000;
    passo = 50;
    hz = "Hz";
  }
  if ((rere == 2) || (rere == 3)) {
    freqini = 1000000;
    freqfinal = 30000000;
    passo = 50000;
    hz = "kHz";
  }

  while (gs == 0) {
    String sfreqfinal = String(freqfinal);
    String sfreqini = String(freqini);
    String spasso = String(passo);
    String sf1 = String(f1);
    String sf2 = String(f2);
    if (oqeh != "PARE") {
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.setTextSize(1);
      TFTscreen.text("FREQUENCIA INICIAL :", 0, 0);
      TFTscreen.stroke(0, 255, 255);
      TFTscreen.setTextSize(2);
      //sfreqini=sfreqini+ " kHz";
      sfreqini.toCharArray(fini, 15);
      TFTscreen.text(fini , 0, 11);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.setTextSize(1);
      TFTscreen.text("FREQUENCIA FINAL :", 0, 32);
      TFTscreen.stroke(0, 255, 255);
      TFTscreen.setTextSize(2);
      sfreqfinal.toCharArray(fnal, 15);
      TFTscreen.text(fnal , 0, 43);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.setTextSize(1);
      TFTscreen.text("PASSO :", 0, 65);
      TFTscreen.stroke(0, 255, 255);
      TFTscreen.setTextSize(2);
      spasso.toCharArray(fpas, 15);
      TFTscreen.text(fpas , 0, 76);
      TFTscreen.setTextSize(1);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("MARCA 1", 0, 98);
      TFTscreen.stroke(0, 255, 255);
      sf1.toCharArray(f1s, 15);
      TFTscreen.text(f1s, 50, 98);
      TFTscreen.stroke(0, 255, 0);
      TFTscreen.text("MARCA 2", 0, 112);
      TFTscreen.stroke(0, 255, 255);
      sf2.toCharArray(f2s, 15);
      TFTscreen.text(f2s, 50, 112);

    }
    if (irrecv.decode(&lido)) {
      valorlido = (lido.value);
      if (valorlido == ngo) {
        oqeh = " ";
        TFTscreen.background(0, 0, 0);
      }
      if (valorlido == nf1) {
        oqeh = "F1";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == nf2) {
        oqeh = "F2";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == nce) {
        oqeh = "inicio";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == ncd) {
        oqeh = "fim";
        num = 0;
        numerico();
        oqeh = " ";

      }
      if (valorlido == nsobe) {
        oqeh = "passo";
        num = 0;
        numerico();
        oqeh = " ";

        TFTscreen.background(0, 0, 0);
      }

      if (valorlido == nrcfm) {
        frequency = freqini;


        TFTscreen.background(0, 0, 0);
        npasso = 0;
        x0 = 0;
        y0 = 0;
        while (frequency <= freqfinal)
        {


          oqeh = "PARE";

          TFTscreen.stroke(255, 255, 255);
          TFTscreen.setTextSize(1);
          String sfreqfinal = String(frequency);
          sfreqfinal.toCharArray(fnal, 15);
          TFTscreen.text(fnal , 0, 0);


          sendFrequency(frequency);

          TFTscreen.stroke(128, 128, 128);
          TFTscreen.line (0, 0, 0, alt);
          TFTscreen.line (31, 0, 31, alt);
          TFTscreen.line (63, 0, 63, alt);
          TFTscreen.line (95, 0, 95, alt);
          TFTscreen.line (127, 0, 127, alt);
          TFTscreen.line (159, 0, 159, alt);
          TFTscreen.line (0, alt - 1, larg, alt - 1);
          TFTscreen.line (0, alt - 24, larg, alt - 24);
          TFTscreen.line (0, alt - 48, larg, alt - 48);
          TFTscreen.line (0, alt - 72, larg, alt - 72);
          TFTscreen.line (0, alt - 96, larg, alt - 96);
          TFTscreen.line (0, alt - 128, larg, alt - 128);
          TFTscreen.stroke(0, 255, 0);


          if ((rere == 1) || (rere == 2)) {
            y1 = map(mult1 * ylido, 0, 1023, 1, alt);
          }
          if ((rere == 3)) {


            y1 = map(ylido, 0, 50, 1, alt);
            if (y1 > alt) {
              (y1 = alt);
            }
            TFTscreen.stroke(0, 255, 0);
            if (y1 < 39) {
              TFTscreen.stroke(0, 255, 255);
            }
          }
          int maxpasso = ((freqfinal - freqini) / passo);
          npasso++;
          x1 = map(npasso, 1, maxpasso, 1, 160);

          TFTscreen.line (x0, alt - y0, x1, alt - y1);
          x0 = x1;
          y0 = y1;

          if (x0 == 31) {
            int xlabel = ((freqini + ((freqfinal - freqini) / 5)) / divi);

            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 20, alt - 8);
          }
          if (x0 == 63) {
            int xlabel = ((freqini + (2 * (freqfinal - freqini) / 5)) / divi);

            //int xlabel = ((divi));
            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 52, alt - 8);
          }
          if (x0 == 95) {
            int xlabel = ((freqini + (3 * (freqfinal - freqini) / 5)) / divi);
            // int xlabel = ((divi));
            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 84, alt - 8);
          }
          if (x0 == 127) {
            int xlabel = ((freqini + (4 * (freqfinal - freqini) / 5)) / divi);
            //int xlabel = ((divi));
            String(xlabel).toCharArray(fpas, 8);
            TFTscreen.text(fpas , 116, alt - 8);
          }

          TFTscreen.text(fpas , 146, alt - 8);
          // }
          if (frequency == f1) {
            TFTscreen.stroke(0, 0, 255);
            TFTscreen.line (x1, 0, x1, alt);
          }
          if (frequency == f2) {
            TFTscreen.stroke(0, 0, 255);
            TFTscreen.line (x1, 0, x1, alt);
          }


          delay(5);
          if ((rere == 1) || (rere == 2))
          {
            mult1 = 1;
            V1 = (analogRead(2));

            ylido = V1;
            V1 = (V1 * 5.0) / 1024.0;
            V2 = analogRead(3);

            if (rere == 1) {
              ylido = V2;
            }
            V2 = (V2 * 5.0) / 1024.0;

            Serial.print("DATA, , , ,");
            Serial.print(frequency);
            Serial.print(",");
            Serial.print(V1);
            Serial.print(",");

            Serial.println("");

          }

          if (rere == 3)
          {
            Vinc = analogRead(4);

            Vinc = abs(Vinc);
            Vref = analogRead(5);

            if (Vref >= Vinc) {
              Vref = (Vinc - 0.01);
            }

            SWR = (Vinc + Vref) / (Vinc - Vref);
            if (SWR < 1) {
              SWR = 4 ;
            }
            ylido = 10 * SWR;
            mult1 = 1;
            Serial.print("DATA, , , ,");
            Serial.print(frequency);
            Serial.print(",");
            Serial.print(Vinc);
            Serial.print(",");
            Serial.print(Vref);
            Serial.print(",");
            Serial.println(SWR);
            Serial.println("");
          }
          TFTscreen.stroke(0, 0, 0);
          TFTscreen.text(fnal , 0, 0);
          frequency = (frequency + passo);

        }


      }


      if (valorlido == rtrn) { //tecla JUMP
        gs = 1;
        oqeh = "1";
      }
      irrecv.resume();
    }

  }
}


void numerico() {

  TFTscreen.background(0, 0, 0);

  while (num == 0) {
    if (irrecv.decode(&lido))

    {
      valorlido = (lido.value);


      if (valorlido == n1)
      {
        ero = "1";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n2)
      {
        ero = "2";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n3)
      {
        ero = "3";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n4)
      {
        ero = "4";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n5)
      {
        ero = "5";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n6)
      {
        ero = "6";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n7)
      {
        ero = "7";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n8)
      {
        ero = "8";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n9)
      {
        ero = "9";
        xero = xero + ero;
        delay (500);
      }
      if (valorlido == n0)
      {
        ero = "0";
        xero = xero + ero;
        delay (500);
      }

      TFTscreen.background(0, 0, 0);
      TFTscreen.stroke(0, 255, 255);//azul claro
      TFTscreen.setTextSize(2);
      TFTscreen.text("FREQUENCIA ", 0, 0);

      oqeh.toCharArray(fini, 15);
      TFTscreen.text(fini , 5, 22);
      // TFTscreen.stroke(0, 255, 255);//azul claro
      TFTscreen.text("  EM ", 0, 44);
      if (oqeh == "passo") {
        String pass = "Hz";
        pass.toCharArray(fini, 15);
        TFTscreen.text(fini, 75, 44);
      }
      else {
        hz.toCharArray(fini, 15);
        TFTscreen.text(fini, 75, 44);
      }
      TFTscreen.stroke(0, 255, 0); //verde

      xero.toCharArray(fnal, 25);
      TFTscreen.text(fnal , 0, 70);

      if (valorlido == ngo)
      {
        if (hz == "kHz")
        {
          xero = (xero + "000");
        }
        xeroxero = xero.toInt();


        if (hz == "kHz")
        {
          if (xeroxero > 50000001) {
            (xeroxero = 50000000);
          }
          if (xeroxero < 10) {
            (xeroxero = 10);
          }
        }

        if (oqeh == "passo")
        {
          passo = xeroxero;
          if (hz == "kHz") {
            passo = (xeroxero / 1000);
            if (passo > 50001)  {
              (passo = 50000);
            }
            if (passo < 1) {
              (passo = 1);
            }
          }
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("PASSO EM Hz", 0, 0);
          TFTscreen.stroke(0, 255, 0); //verde
          String spasso = String(passo);
          spasso.toCharArray(fpas, 15);
          TFTscreen.text(fpas , 0, 20);
          delay (3000);

        }
        if (oqeh == "F1")
        {
          f1 = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("MARCA  1", 0, 22);
          TFTscreen.stroke(0, 255, 0); //verde
          String sf1 = String(f1);
          sf1.toCharArray(fini, 15);
          TFTscreen.text(fini , 0, 48);
          delay (3000);

        }
        if (oqeh == "F2")
        {
          f2 = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("MARCA 2", 0, 22);
          TFTscreen.stroke(0, 255, 0); //verde
          String sf2 = String(f2);
          sf2.toCharArray(fini, 15);
          TFTscreen.text(fini , 0, 48);
          delay (3000);

        }
        if (oqeh == "inicio")
        {
          freqini = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("INICIAL Hz ", 0, 22);
          TFTscreen.stroke(0, 255, 0); //verde
          String sfreqini = String(freqini);
          sfreqini.toCharArray(fini, 15);
          TFTscreen.text(fini , 0, 48);
          delay (3000);

        }
        if (oqeh == "fim")
        {
          freqfinal = xeroxero;
          TFTscreen.background(0, 0, 0);
          TFTscreen.stroke(0, 255, 255);//azul claro
          TFTscreen.setTextSize(2);
          TFTscreen.text("FREQUENCIA", 0, 0);
          TFTscreen.text("FINAL Hz ", 0, 22);

          TFTscreen.stroke(0, 255, 0); //verde
          String sfreqfinal = String(freqfinal);
          sfreqfinal.toCharArray(fnal, 15);
          TFTscreen.text(fnal , 0, 48);
          delay (3000);

        }

        xero = "";
        ero = "";
        xeroxero = 0;
        num = 1;

        TFTscreen.background(0, 0, 0);

      }

      irrecv.resume();
    }
  }
}
void format(unsigned long value) {
  unsigned long j = 10000000;
  for (int i = 0; i <= 7; i++) {
    int digit = (value / j) % 10;
    incr == (7 - i) ? TFTscreen.stroke(0, 255, 255) : TFTscreen.stroke(0, 255, 0);
    String sfreqini = String(digit);
    sfreqini.toCharArray(fnal, 15);
    TFTscreen.text(fnal , 17 * i + 10, 43);
    if ( (i == 4) || (i == 1)) {
      TFTscreen.stroke(255, 255, 0);
      TFTscreen.text("." , (17 * i + 17), 43);
    }
    j /= 10;
  }
  delay(30);
}



73 de py2ohh miguel