lunes, 22 de julio de 2019

Discado DTMF con Arduino

Con esta aplicación he logrado llamar a un Nr. de teléfono desde mi Arduino por medio de una Línea Telefónica Fija.




String NroTel = "15999999"; // el numero de telefono para marcar
int numero = NroTel.length();

const byte tono1Pin = 10; // pin para tono 1 ~ 10
const byte tono2Pin = 11; // pin para tono 2 ~ 11

int DTMF[13][2]={
  {941,1336}, // frec. p/tecla tono 0
  {697,1209}, // frec. p/tecla tono 1
  {697,1336}, // frec. p/tecla tono 2
  {697,1477}, // frec. p/tecla tono 3
  {770,1209}, // frec. p/tecla tono 4
  {770,1336}, // frec. p/tecla tono 5
  {770,1477}, // frec. p/tecla tono 6
  {852,1209}, // frec. p/tecla tono 7
  {852,1336}, // frec. p/tecla tono 8
  {852,1477}, // frec. p/tecla tono 9
  {941,1209}, // frec. p/tecla tono *
  {941,1477}, // frec. p/tecla tono #
  {0,0} // pausa
};

void setup() {
     Serial.begin(9600);
     Serial.print("Inciando Proceso");
     
     pinMode(6, INPUT); digitalWrite(6, LOW); // Colgado/Descolgado 
     pinMode(7, INPUT); digitalWrite(7, LOW); // Tecla Tonos
     
     pinMode(tono1Pin,OUTPUT); // Output Tono 1 [D10]
     pinMode(tono2Pin,OUTPUT); // Output Tono 2 [D11]

     pinMode(12,OUTPUT); digitalWrite(12, LOW);// Led Testigo DTMF
}

void loop() {
     if (digitalRead(7) == HIGH){
         Serial.println("Discado <Por medio de Tonos DTMF>: ");
         Serial.print("Numero: ");
         for(int i = 0; i < numero; i++) {
             char x = NroTel.charAt(i);
             int digito = String(x).toInt();
             // Disco el digito del Nro Telefonico
             Serial.print(digito);
             byte digit = digito;
             boolean tono1state = false;
             boolean tono2state = false;
             unsigned long tono1delay = (500000/DTMF[digit][0])-10;
             unsigned long tono2delay = (500000/DTMF[digit][1])-10;
             unsigned long tono1timer = micros();
             unsigned long tono2timer = micros();
             // Para la duracion del tiempo de un solo tono
             unsigned long timer = millis();

             if(digit==12) { delay(1000); } // un segundo retraso si el digito es 12

             digitalWrite(12,HIGH);  // Led Testigo
             while(millis() - timer < 100) {
                   if(micros()-tono1timer>tono1delay) {
                      tono1timer=micros();    // Reset restablecer el temporizador del timer
                      tono1state=!tono1state; // Alternar estado del tono 1
                      digitalWrite(tono1Pin, tono1state);
                   }

                   if(micros()-tono2timer>tono2delay) {
                      tono2timer=micros();    // reset restablecer el Temporizador
                      tono2state=!tono2state; // alternar estado del tono2estado
                      digitalWrite(tono2Pin, tono2state);
                   }
             }
             digitalWrite(12,LOW); // Led Testigo
             digitalWrite(tono1Pin,LOW);
             digitalWrite(tono2Pin,LOW);
             delay(150); // 100ms pausa entre los tonos
         }
         Serial.println(" ");
     }
}

No hay comentarios:

Publicar un comentario