Visitantes

Notícias da Labre

Atividade Solar

Postagens populares

domingo, 28 de novembro de 2021

 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
}
 

CANAL DE QAP NO ZELLO  Talkabout FRS





Até a próxima publicação até lá!!!! 73 



0 comentários:

Banner para seu site

eQSOdoBrasil
<a href='http://eqsodobrasil.blogspot.com/' title='eQSODOBrasil'><img src='http://www.talkaboutfrs.com.br/banners/eqsodobrasil.jpg' alt='eQSODOBrasil' width="192" height="70"></a>

Talkabout FRS

Parceiros

Parceiros
SEJA VOCÊ TAMBÉM UM PARCEIRO NOSSO!!!
Eletrônica Sem Medo - Site de eletrônica

Consulta de Indicativos