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 "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.

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! :slight_smile: :wink:

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 :slight_smile: 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