Este es el Código por si les sirve. Con respecto al esquemático lo subo una vez que logre terminar todo el proyecto.
// * Marcador de telefono Arduino X PULSOS * "ConRelay"
// Utiliza el metodo por pulsos para marcar un numero de telefono.
int offtimer = 60; // Cuanto mayor sea el numero, mas lento sera el tiempo.
int ontimer = 30;
String NroTel = "15695419"; // el numero de telefono para marcar
int numero = NroTel.length();
int pinOut=2; // El pin de salida para el pulso del Rele Pin 12
int estado = LOW; // Colgado o Descolgado para discar por Pulsos
/* CodDTMF3 (generador de tono dual) para un marcador de telefono
*
* PREPARAR:
* - Conecte los pines 12 y 13 al terminal de altavoz +, cada uno a traves de su propia resistencia de 240 Ohm.
* - Conecte un condensador de 4.7 uF entre los terminales + y - del altavoz
* - Conecte el altavoz GND a Arduino GND
* - Conecte un interruptor momentáneo al Pin 8, y el otro lado del interruptor a GND
*/
const byte tono1Pin = 10; // pin para tono 1 ~ 10
const byte tono2Pin = 11; // pin para tono 2 ~ 11
int variaFrec = 10; // Lo agregue ir variando la Frecuencia (Originalmente este valor es de 10)
int DTMF[13][2]={
{941,1336}, // frecuencia para tecla tono 0
{697,1209}, // frecuencia para tecla tono 1
{697,1336}, // frecuencia para tecla tono 2
{697,1477}, // frecuencia para tecla tono 3
{770,1209}, // frecuencia para tecla tono 4
{770,1336}, // frecuencia para tecla tono 5
{770,1477}, // frecuencia para tecla tono 6
{852,1209}, // frecuencia para tecla tono 7
{852,1336}, // frecuencia para tecla tono 8
{852,1477}, // frecuencia para tecla tono 9
{941,1209}, // frecuencia para tecla tono *
{941,1477}, // frecuencia para tecla tono #
{0,0} // pausa
};
void setup() {
Serial.begin(9600);
Serial.println("Digitar [P o *] Discar por PULSO o COLGAR [T] Discar por TONO");
pinMode(pinOut, OUTPUT); // define pin como salida. [D2]
digitalWrite(pinOut, LOW);
pinMode(5, INPUT); // Tecla Pulso
digitalWrite(5, LOW);
pinMode(6, INPUT); // Descolgar / Colgar
digitalWrite(6, LOW);
pinMode(7, INPUT); // Tecla Tonos
digitalWrite(7, LOW);
pinMode(tono1Pin,OUTPUT); // Output Tono 1 [D10]
pinMode(tono2Pin,OUTPUT); // Output Tono 2 [D11]
}
void loop() {
if (digitalRead(5) == HIGH){
Serial.print("Discado <Por PULSO>: ");
digitalWrite(pinOut, HIGH);
delay (1000);
// Leo los numeros del telefono a marcar
// int numero = NroTel.length();
for (int i=0; i<numero; i++){
char x = NroTel.charAt(i);
int digito = String(x).toInt();
// Disco el numero del telefono
Serial.print(x);
for (int y = 0; y < digito; y++) {
digitalWrite(pinOut, LOW); // apaga el rele OFF
delay(offtimer); // espera un rato
digitalWrite(pinOut, HIGH); // enciende el rele ON
delay(ontimer); // espera un rato
}
delay(500); // Demora entre cada Pulso marcado
}
Serial.println(" ");
// Mantiene el Rele encendido para que el telefono espere que suene en el otro extremo.
digitalWrite(pinOut, HIGH);
}
if (digitalRead(6) == HIGH){
estado = digitalRead(pinOut);
digitalWrite(pinOut,!estado);
}
if (digitalRead(7) == HIGH){
byte duracion = 100; // 100 ms de duracion del tono
Serial.println("Discado <Por TONO>: ");
Serial.print("Numero: ");
// int numero = NroTel.length();
for(int i = 0; i < numero; i++) {
char x = NroTel.charAt(i);
int digito = String(x).toInt();
// Disco el numero del telefono
Serial.print(digito);
byte digit = digito;
boolean tono1state=false;
boolean tono2state=false;
// Calcular el retraso (en microsegundos) para el tono 1 (la mitad del periodo de un ciclo).
// 10 es un factor de fudge para aumentar la frecuencia debido a una temporizacion lenta.
int tono1delay=(500000/DTMF[digit][0])-variaFrec;
int tono2delay=(500000/DTMF[digit][1])-variaFrec;
unsigned long tono1timer=micros();
unsigned long tono2timer=micros();
unsigned long timer=millis(); // para la duracion del tiempo de un solo tono
if(digit==12) { delay(1000); } // un segundo retraso si el digito es 12
while(millis() - timer < duracion) {
int x1 = micros()-tono1timer;
if( x1 > tono1delay ) {
tono1timer=micros(); // reset restablecer el temporizador del timer
tono1state=!tono1state; // alternar estado del tono 1
digitalWrite(tono1Pin, tono1state);
}
int x2 = micros()-tono2timer;
// if(micros()-tono2timer>tono2delay) {
if(x2>tono2delay) {
tono2timer=micros(); // reset restablecer el Temporizador
tono2state=!tono2state; // alternar estado del tono2estado
digitalWrite(tono2Pin, tono2state);
}
}
digitalWrite(tono1Pin,LOW);
digitalWrite(tono2Pin,LOW);
delay(100); // 100ms pausa entre los tonos
}
Serial.println(" ");
}
}