Centralita de llamadas

Hola de nuevo gente :slight_smile: .

Tengo en mente una idea que ya inici茅 hace algunos d铆as y ahora que otro proyecto ha llegado a su fase final he cre铆do conveniente comenzar raudo con este antes de que se pase la emoci贸n. La idea es crear mediante Arduino Uno, un m贸dulo GSM y un shield de ethernet con tarjeta sd, una centralita capaz de comunicar mediante SMS o llamada por voz (mediante mensajes pregrabados en la tarjeta SD) diferentes estados de lo que sea necesario.

Elementos:

Objetivos:

  • Env铆o de SMS ( conseguido ).

  • Llamadas telef贸nicas ( conseguido ).

  • Reproducci贸n de mensajes pregrabados (en desarrollo).

Hasta el momento este es el c贸digo que ya llevo hecho:

//LIBRERIAS____________________________________________________________________________________________________________________________
#include <GSM.h>
#include <SPI.h>
#include <Ethernet.h>
#define Reiniciar asm("jmp 0x0000")

boolean conectado = false;

//int i = 0;
char mander;

int freeRam()
{
聽 extern int __heap_start, *__brkval;
聽 int v;
聽 return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

const char NumArd[] = "GSM_1:";
boolean GSM_Encendido = false;
boolean Repuesto = false;


const char Tlf[] = "GSMtf:";
const char Orden_Mensaje[] = "GSM_Men:";
const char Orden_Llamada[] = "GSM02:";


String cadena = ""; // Almacenar el codigo recibido.


// DATOS TLF_____________________________________________________________________________________________________________________________
#define PINNUMBER "1234"
char tlf[15];

char txtMsg[160] = "Mensaje de prueba";
// ___________________________________________________________________________________________________________________________________


// CONFIGURACI脫N DE RED____________________________________________________________________________________________________________________________

byte direccion_mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Direcci贸n MAC no debe estar repetida en la red.
IPAddress direccion_ip_fija(172, 16, 4, 50); // Direcci贸n IP elegida para el m贸dulo
IPAddress servidor_dns(172, 16, 0, 25); // Servidor DNS
IPAddress puerta_enlace(172, 16, 0, 200); // Direcci贸n IP del router
IPAddress mascara_red(255, 255, 0, 0); // M谩scara de la red
IPAddress ip_servidor(172, 16, 200, 79); // Direcci贸n IP de Pc Pruebas.

EthernetClient cliente = EthernetClient();




// INICIO LIBRER脥A GSM_____________________________________________________________________________________
GSM gsmAccess;
GSM_SMS sms;
GSMVoiceCall vcs;
String remoteNumber =聽 tlf;聽 // the number you will call

//___________________________________________________________________________________________________________________________________




// PINES_____________________________________________________________________________________________________________________________
int Pin6 = 6;
int Pin7 = 7;
int pin = 4;


//___________________________________________________________________________________________________________________________________



void conectar_ethernet()聽 聽 // Funci贸n de reconexi贸n.
{
聽 cliente.connect(ip_servidor, 80); // Conexion a pc Pruebas.
聽 //cliente.connect(ip_servidor, 4373); // Conexion a pc Comprobaci贸n.
聽 delay(100); // Un peque帽o delay para permitir que se active la conexi贸n.

聽 if (cliente.connected())
聽 {
聽 聽 conectado = true;
聽 聽 Serial.println("Conectado.");

聽 }
聽 else
聽 {
聽 聽 Serial.println("Conexion fallida intentando reconectar.");
聽 聽 cliente.stop();
聽 聽 delay(10000);
聽 聽 freeRam();
聽 聽 Serial.print("聽 SRAM Libre: "); Serial.println(freeRam());

聽 }

}


void setup() {

聽 // PINMODES_____________________________________________________________________________________________________________________________
聽 pinMode(Pin6, OUTPUT);
聽 pinMode(Pin7, OUTPUT);
聽 pinMode(pin, OUTPUT);

聽 // ETHERNET Y SERIAL__________________________________________________________________________
聽 Serial.begin(9600);
聽 Ethernet.begin(direccion_mac, direccion_ip_fija, servidor_dns, puerta_enlace, mascara_red);
聽 Serial.print("Mi ip es: ");
聽 Serial.println(Ethernet.localIP());

聽 // GSM__________________________________________________________________________
聽 boolean notConnected = true;
聽 while (notConnected) {
聽 聽 if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
聽 聽 聽 notConnected = false;
聽 聽 聽 GSM_Encendido = true;
聽 聽 聽 Serial.println("Pin metido");
聽 聽 }
聽 聽 else {

聽 聽 聽 digitalWrite(Pin6, LOW);
聽 聽 聽 delay(10);
聽 聽 聽 digitalWrite(Pin7, HIGH);
聽 聽 聽 delay(1000);
聽 聽 聽 digitalWrite(Pin7, LOW);
聽 聽 聽 delay(10);
聽 聽 }
聽 }
聽 digitalWrite(Pin6, HIGH);
}


void loop() {
聽 String corte = "";

聽 //Reconexi贸n_______________________________________________________________________________________________________________________________________________________________________________

聽 if (!cliente.connected())
聽 {
聽 聽 conectar_ethernet();
聽 }
聽 else
聽 {
聽 聽 if (cliente.available())
聽 聽 {
聽 聽 聽 //聽 聽 i =0;
聽 聽 聽 cadena = "";
聽 聽 聽 while (cliente.available())
聽 聽 聽 {

聽 聽 聽 聽 mander = cliente.read();
聽 聽 聽 聽 cadena = cadena + mander;
聽 聽 聽 }

聽 聽 聽 Serial.println(cadena + " = cadena" );
聽 聽 聽 freeRam();
聽 聽 聽 Serial.print("聽 SRAM Libre: "); Serial.println(freeRam());
聽 聽 }

聽 聽 //LECTURA DE CODIGOS RECIBIDOS DESDE PC________________________________________________________________________________________
聽 聽 if (cadena.startsWith(Tlf)) // Si el identificador es de numero de telefono ( GSMtf:0034612345678 )
聽 聽 {
聽 聽 聽 delay (10);
聽 聽 聽 corte = cadena.substring(6, 19); // Cortamos el codigo y nos quedamos solo con el numero de telefono (formato: 0034 612345678)
聽 聽 聽 corte.toCharArray(tlf, 14); // Almacenamos el n煤mero de telefono en una variable.
聽 聽 聽 Serial.println(tlf);聽 // Comprobaci贸n mediante puerto serie utilizado solo durante el desarrollo de que el n煤mero se ha cortado corretcamente. <---------------------------------------
聽 聽 聽 Serial.println(corte); // En caso de no ser correcto comprobamos que el corte estaba bien hecho.
聽 聽 聽 cadena = "";

聽 聽 }


聽 聽 if (cadena.startsWith(Orden_Mensaje)) // Si el identificador es de orden mensaje ( GSM01:Mensaje de prueba. )
聽 聽 {
聽 聽 聽 Repuesto = false;
聽 聽 聽 corte = cadena.substring(8, 22); // Cortamos el codigo y nos quedamos solo con el mensaje. //
聽 聽 聽 corte.toCharArray(tlf, 14);
聽 聽 聽 Serial.println(tlf);
聽 聽 聽 corte = "";

聽 聽 聽 corte = cadena.substring(21, cadena.length());
聽 聽 聽 corte.toCharArray(txtMsg, corte.length() + 1); //Guardamos el mensaje en su propia variable.
聽 聽 聽 Serial.print(txtMsg );
聽 聽 聽 Serial.print (" = este es el mensaje");
聽 聽 聽 Serial.println("");聽 聽 // Comprobaci贸n mediante puerto serie utilizado solo durante el desarrollo de que el mensaje se ha cortado corretcamente.
聽 聽 聽 sms.beginSMS(tlf);聽 聽 //
聽 聽 聽 sms.print(txtMsg);聽  // Envio del mensaje al tel茅fono recibido anteriormente.
聽 聽 聽 sms.endSMS();聽 聽 聽  //

聽 聽 聽 Serial.println("Se ha enviado");
聽 聽 聽 if (cadena != "")
聽 聽 聽 {
聽 聽 聽 聽 Serial.println(cadena + " => Limpieza");
聽 聽 聽 聽 cadena = "";
聽 聽 聽 }
聽 聽 聽 corte = "";
聽 聽 }

聽 聽 if (cadena.startsWith(Orden_Llamada)) // Si el identificador es de orden llamada ( GSM02:Llamada )
聽 聽 {
聽 聽 聽 Repuesto = false;
聽 聽 聽 corte = cadena.substring(6, 19); // Cortamos el codigo y nos quedamos solo con el numero de telefono (formato: 0034 612345678)
聽 聽 聽 corte.toCharArray(tlf, 15); // Almacenamos el n煤mero de telefono en una variable
聽 聽 聽 if (vcs.voiceCall(tlf)) {
聽 聽 聽 聽 delay (3000);
聽 聽 聽 聽 vcs.hangCall();
聽 聽 聽 }
聽 聽 聽 cadena = "";
聽 聽 }

聽 }
聽 if (cadena != "")
聽 {
聽 聽 Serial.println(cadena + " => Limpieza");
聽 聽 cadena = "";
聽 }
}

Hasta el momento el arduino recibe un c贸digo (mediante un programa en un PC a trav茅s de la red) que le indica si llamar o mandar un mensaje, la estructura del c贸digo es:

Orden (Mensaje o llamada) : Tel茅fono (el n煤mero) : Contenido (caracteres o archivo a reproducir )

Como ya he comentado antes el tema de los mensajes ya est谩 mas que perfecto y las llamadas de voz ya se realizan correctamente, la cosa es reproducir un audio de forma 鈥渋nterna鈥 sin necesidad de un micr贸fono, en plan contestador autom谩tico. Hab铆a pensado en unir de alguna manera una salida de audio ( es decir los pines del arduino ) con el micr贸fono del gsm pero la verdad tampoco se muy bien como, continuo investigando y os comento.

Espero os parezca interesante y logremos sacar algo chulo de aqui :slight_smile: . Muchas gracias de antemano.

Eirvos: la cosa es reproducir un audio de forma "interna" sin necesidad de un micr贸fono, en plan contestador autom谩tico. Hab铆a pensado en unir de alguna manera una salida de audio ( es decir los pines del arduino ) con el micr贸fono del gsm pero la verdad tampoco se muy bien como, continuo investigando y os comento.

A qu茅 te refieres con "tampoco se ve muy bien"? Est茅ticamente? Total no bastar谩 con conectar un pin directamente a la entrada de audio. Si no necesitas el micr贸fono, lo puedes quitar.

Dices que tienes un Arduino Uno? Pues d茅jame decirte que es posible reproducir audio digital en 茅l (no estoy hablando de los sonidos zumbantes que genera tone, sino que de meramente audio "muestreado" o "estilo reproductor de MP3").

Tampoco estoy hablando de shields, m贸dulos adicionales, ni nada de eso; hablo de que el Arduino por s铆 solo puede reproducir audio.. C贸mo? Gracias a esta librer铆a.

Pru茅bala y me cuentas qu茅 tal! :) ;)

PD: cuando dije:

Total no bastar谩 con conectar un pin directamente a la entrada de audio.

Quiero decir a que la se帽al de audio debe ser "filtrada" (y posiblemente atenuada con potenci贸metro).

El filtro consiste en una resistencia (entre 100 y 200 ohms) y un capacitor/condensador (cer谩mico de 0.1 uF, tienen impreso un "104"). Se le llama "filtro pasa-bajos".

Gracias :) le echar茅 un ojo en que pueda pero tiene buena pinta es justo lo que necesitoo pero no sab铆a muy bien como hacerlo.

Lo de no se ve muy bien... no se donde lo he puesto :stuck_out_tongue: as铆 que no puedo responderte hehe.

Eirvos: Lo de no se ve muy bien... no se donde lo he puesto :stuck_out_tongue: as铆 que no puedo responderte hehe.

Textualmente ese "no" nunca lo escribiste; pero como cre铆 que fue un error el haberlo omitido, lo a帽ad铆 al quote :stuck_out_tongue:

HOLA , que tal , lograste realizar que reproduciera el audio grabado , estoy realizando un proyecto y estaria genial se pudiera hacer , saludos