Início
  • Cadastramento
    • Cadastro de Unidades
    • Cadastrar sua Unidade
    • Listagem de Unidades Cadastradas
    • Preencher a sua Carteirinha AQUI
    • Cadastro de Links
    • Cadastrar seu LINK
    • Consultar LINKS cadastrados
    • Mapa de Links por Cidade/UF
  • Rádio de Uso Geral
    • Sobre
    • Resolução nº 680 Anatel
    • Resolução nº 242 Anatel
    • Lei 9.472
  • Anatel
    • Apostilas Provas
    • Legislação
    • Ética Operacional
    • Rádio Eletricidade
    • Simulado das Provas
    • Legislação
    • Ética Operacional
    • Radioeletricidade
    • Formularios de Requerimento
    • Rádioamador - Formulário 14
    • Rádiocidadão - Formulário 19
    • Acessos a Informações
    • Consulta de Indicativos
    • Acesso aos Boletos
    • Consulta Débitos FISTEL
    • Consulta Pública Nº 14
  • Projetos
    • Interfaces
    • Interface Arduino
    • Interface Smartphone
    • Interface VOX
    • Interface Cabo de Programação
    • CrossLink Zello
    • Antenas UHF/Vhf
    • Antenas DualBand
    • Antenas UHF TALKABOUT
    • Eliminador de Baterias
    • Formula Calculo de Cabos
    • Formula Calculos Antenas
    • Calculadora online de Antenas
    • Dipolo
    • J-Pole
    • Vertical Plano Terra
    • Como Fazer seu Link Passo a Passo
  • Downloads
    • Manuais Baofeng
    • UV-3R PT-BR
    • UV-5R PT-BR
    • UV-6R PT-BR
    • UV-82 PT-BR
    • BF777s/BF888s
    • Software Programação
    • Drivers Porta USB Serial
    • Beep de Cortesia
    • Manual das Antenas
    • Tabela de Frequência
    • Talkabout
    • Baofeng BF777s/BF888s
    • Código Q / Fonético
  • Util
    • Canalização
    • Propagação
    • Sdr
    • Satélite
    • CDR
    • ARSATC
    • AMSAT-BR
    • Labre-SP
    • QRZ.COM
    • QRZNOW
    • DX CLUBE BRASIL
    • DX WAYS BR
    • DX WATCH
  • Parceiros
    • Bétão PU2NVU
    • eQSO do Brasil
    • Portal do Rádioamador
    • QTC

Sketch para INTERFACE CONTROLADORA DE GATEWAY

para arduino Pro-Mini

Por Renato Druziani 2RUGE7

 

 

 

 

 * Esta INTERFACE CONTROLADORA DE GATEWAY funciona com o app ZELLO e um SMARTPHONE com o áudio interligado

 * (mic>fone / fone>mic).

 * O diferencial nessa interface é a NÃO UTILIZAÇÃO da função VOX em nenhum dos equipamentos. 

 * O acionamento dos PTTs tanto no ZELLO quanto no RÁDIO é feito por dois Opto Acopladores acionados através da leitura 

 * do LED de Tx/Rx do rádio e da mudança da cor na borda do botão PTT na tela do ZELLO. esse método melhora a agilidade

 * do gateway evitando o corte no início do câmbio, a espera após o final do câmbio e as quedas de PTT durante as pausas

 * de fala durante o câmbio.

 * Essa detecção é feita com um LDR fixado na tela do smartphone bem posicionado dobre a borda do botão PTT do APP 

 * e outro LDR posicionado sobre o LED de Tx/Rx do rádio, os LDRs monitoram a VARIAÇÃO da LUZ quando o botão do

 * zello muda cor ou o LED no rádio acende com a recepção de um sinal e o Arduíno trata estas leituras para acionar 

 * o PTT necessário de acordo com os limites predefinidos.

 */

 

// DEFININDO PINOS -------------------------------------------------------------------------------------------------------

#define Radio A0 // LDR rádio - uma perna no VCC e a outra na porta A2 e um resistor 10k em PullDown A2-GND

#define Celular A2 // LDR Celular - uma perna no VCC e a outra na porta A0 e um resistor 10k em PullDown A0-GND

#define PTTradio 5 // Relé que aciona o PTT do celular - FECHA contato do GND até MIC com resistor de 5~10ohm

#define PTTcelular 2 // Relé que aciona o PTT do Rádio

#define LEDpw 6 // LED indicação de Operadional

#define LEDst 7 // LED indicação de Zello online ou offline

#define LEDrx 8 // LED indicação de Gateway em Rx

#define LEDtx 9 // LED indicação de Gateway em Tx

#define LED 13 // LED da placa para visualizar o funcinamento

 

// DEFININDO ESTADO ------------------------------------------------------------------------------------------------------

#define Ligado 1 // LIGADO para HIGH e !LIGADO para LOW

 

// DEFININDO VALORES E LIMITES -------------------------------------------------------------------------------------------

#define LimiteCelular 95 // Limite que determina quando ativar o PTT do rádio

#define LimiteRadio 110 // Limite que determina quando ativar o PTT do Celular

#define OffLine 65 // Limite inferior para evitar a ativação do PTT do rádio se a tela do celular apagar

#define Pausa 500 // Tempo em milissegundos para PAUSAR as micro ativações repetitivas

#define Intervalo 150 // Tempo entre o acionamento dos LED sequênciais - velocidade da sequência

#define TempoMax 300000 // TOT - Tempo máximo para PTT do HT ficar acionado (300000 milisegundos = 5 min)

 

#define n 250 // Número de pontos para calcular a média móvel - Sem DEBUG 250, com DEBUG 25

long mediamovel(); 

 

// DECLARANDO VARIÁVEIS --------------------------------------------------------------------------------------------------

int SinalRadio = 0; // Armazena a leitura do LDR do Rádio

int SinalCelular = 0; // Armasena a leitura do LDR do Celular

unsigned long Temporizador = 0; // Para contar o tempo

unsigned long TimerSeguranca = 0; // Para contar o tempo de transmissão

 

int media[n]; // Array para armazenamento das leituras obtidas do rádio e cálculo da média

 

 

//------------------------------------------------------------------------------------------------------------------------

void setup() 

{

  pinMode (Radio, INPUT); // Configuração dos PINOS

  pinMode (Celular, INPUT);

  pinMode (PTTradio, OUTPUT);

  pinMode (PTTcelular, OUTPUT);

  pinMode (LEDpw, OUTPUT);

  pinMode (LEDst, OUTPUT);

  pinMode (LEDrx, OUTPUT);

  pinMode (LEDtx, OUTPUT);

  pinMode (LED, OUTPUT);

 

  digitalWrite (PTTradio, !Ligado); // Situação inicial - MODO ESPERA 

  digitalWrite (PTTcelular, !Ligado);

  digitalWrite (LEDpw, Ligado);

  digitalWrite (LEDst, !Ligado);

  digitalWrite (LEDrx, !Ligado);

  digitalWrite (LEDtx, !Ligado);

  digitalWrite (LED, !Ligado);

 

  // DEBUG 1 de 5 - Remova as // da linha abaixo para usar o monitor serial ou plotter serial

  //Serial.begin(9600);

}

 

// -----------------------------------------------------------------------------------------------------------------------

void loop() 

{

  SinalRadio = analogRead (Radio);

  SinalCelular = analogRead (Celular);

  SinalCelular = mediamovel();

  TimerSeguranca = millis (); // Zerando o timer de segurança

  Temporizador = millis (); // Zerando o temporizador

 

  // DEBUG 2 de 5- Remova os /* e */ para usar o monitor serial ou plotter serial

  /*

  Serial.print ("ESPERANDO ");

  Serial.print ("LDR Rádio ");

  Serial.print (SinalRadio);

  Serial.print (" >> ");

  Serial.print ("LDR Celular ");

  Serial.println (SinalCelular);

  */

 

 

  // Enquanto estiver OFFLINE ou TELA APAGADA --------------------------------------------------------------------------------

  /*

  * se a tela se apagar ou se o Zello ficar Offline este trecho irá evitar que o PTT do Rádio fique acionado

  * permanentemente.

  * os IFs fazem todos os LED piscarem juntos

  */

 

  while (SinalCelular < OffLine)

    {

       SinalRadio = analogRead (Radio);

       SinalCelular = analogRead (Celular);

       SinalCelular = mediamovel();

 

       // DEBUG 3 de 5- Remova os /* e */ abaixo para usar o monitor serial ou plotter serial

       /*

       Serial.print ("OFFLINE ");

       Serial.print ("LDR Radio ");

       Serial.print (SinalRadio);

       Serial.print (" >> ");

       Serial.print ("LDR Celular ");

       Serial.println (SinalCelular);

       */

       

       if ((millis () - Temporizador) < Intervalo)

         {

           digitalWrite (LEDst, Ligado); //ST piscando OFFLINE

           digitalWrite (LED, Ligado);

         }

       else 

         {

           digitalWrite (LEDst, !Ligado); //ST piscando OFFLINE

           digitalWrite (LED, !Ligado);

         }

       if ((millis () - Temporizador) > (Intervalo * 2))

         {

            Temporizador = millis ();

         }

       

    }

 

 

  // TX - Enquanto chegar áudio no ZELLO -----------------------------------------------------------------------------------

  /*

  * Este trecho entra em ação quando o sinal do LED na tela do celular detecta a chegada de uma 

  * transmissão de áudio percebendo a mudança de cor na borda do botão PTT da tela. ele percebe

  * uma queda no sinal, essa queda é menor que a tela se apagando.

  * ao perceber essa variação no sinal o PTT do rádio será acionado

  * os IFs seguintes fazem os LEDs piscarem sequencialmente gerando um movimento do celular

  * para o rádio indicando o sendito da transmissão

  */

 

  while ((SinalCelular < LimiteCelular) and (SinalCelular > OffLine))

    {

      if ((millis() - TimerSeguranca) < TempoMax )

        {

           digitalWrite (PTTradio, Ligado);

           digitalWrite (LEDtx, Ligado);

           digitalWrite (LED, Ligado);

        }

        else

        {

           digitalWrite (PTTradio, !Ligado);

           if ((millis () - Temporizador) < Intervalo)

             {

               digitalWrite (LEDtx, Ligado); //TX piscando TOT

               digitalWrite (LED, Ligado);

             }

           else 

             {

               digitalWrite (LEDtx, !Ligado); //TX piscando TOT

               digitalWrite (LED, !Ligado);

             }

           if ((millis () - Temporizador) > (Intervalo * 2))

             {

                Temporizador = millis ();

             }

        }

      SinalRadio = analogRead (Radio);

      SinalCelular = analogRead (Celular);

      SinalCelular = mediamovel();

 

      // DEBUG 4 de 5- Remova os /* e */ abaixo para usar o monitor serial ou plotter serial

      /*

      Serial.print ("TRANSMITINDO ");

      Serial.print ("LDR Radio ");

      Serial.print (SinalRadio);

      Serial.print (" >> ");

      Serial.print ("LDR Celular ");

      Serial.println (SinalCelular);

      */

    }

 

 

 

  // RX - Enquanto chegar sinal no RÁDIO ------------------------------------------------------------------------------------

  /*

   * Este trecho entra em ação quando o sinal do LDR nno LED Tx/Rx do rádio detecta a recepção 

   * no rádio percebendo a mudança de cor no LED Tx/Rx.

   * ao perceber essa variação no sinal o PTT do celular será acionado

   * os IFs seguintes fazem os LEDs piscarem sequencialmente gerando um movimento do rádio

   * para o celular indicando o sendito da transmissão

  */

 

  while (SinalRadio > LimiteRadio)

    {

      digitalWrite (PTTcelular, Ligado);

      digitalWrite (LEDrx, Ligado);

      digitalWrite (LED, Ligado);

      SinalRadio = analogRead (Radio);

      SinalCelular = analogRead (Celular);

      SinalCelular = mediamovel();

 

      // DEBUG 5 de 5- Remova os /* e */ abaixo para usar o monitor serial ou plotter serial

      /*

      Serial.print ("RECEBENDO ");

      Serial.print ("LDR Radio ");

      Serial.print (SinalRadio);

      Serial.print (" >> ");

      Serial.print ("LDR Celular ");

      Serial.println (SinalCelular);

      */

    }

 

 

  // Retornando para o modo ESPERA

 

  digitalWrite (PTTradio, !Ligado); // PTT rádio OFF

  digitalWrite (PTTcelular, !Ligado); // PTT celular OFF     

  digitalWrite (LEDpw, Ligado); // PW ok 

  digitalWrite (LEDst, Ligado); // ST online

  digitalWrite (LEDrx, !Ligado); // RX off

  digitalWrite (LEDtx, !Ligado); // TX off

  digitalWrite (LED, !Ligado);

}

 

// ---------------------------------------------------- FIM ------------------------------------------------------

 

//----------------------------------------------Função MÉDIA MÓVEL------------------------------------------------

 /* 

 * A MÉDIA MÓVEL consistem em somar uma sequencia N de leituras dos LDRs e dividir o resultado por N achando a média,

 * assim teremos um número mais estável eliminando as discrepâncias causadas por ruídos nas entradas evitando micro

 * acionamentos dos PTTs.

 * Essa média é MÓVEL porque, depois de preenchido o número N de vezes para o cálculo, a cada nova leitura é descartada 

 * a leitura mais antiga e somada a leitura mais recente para um novo cálculo. Assim temos uma pequena latencia e

 * o amortecimento das leituras muito acima ou abaixo da média causadas pelo ruido.

 */

 

long mediamovel()

{

  for(int i= n-1; i>0; i--) media[i] = media[i-1]; // Jogando as leituras uma casa pra frente no array, a última se descarta

  media[0] = SinalCelular; // Colocando a nova leitura no início do array

  long contador = 0; // Zerando o contador

  for(int i=0; i<n; i++) contador += media[i]; // Somando todas as leituras do array no contador

  return contador/n; // Dividindo o resultado por N para chegar na média e retornar o resultado

}

 

 

 

Todos os direitos reservados

COPYRIGHT© 2018 - www.talkaboutfrs.com.br