Buenos días, tardes y noches a todos, estoy preparando un proyecto que junta un arduino uno con un módulo de ethernet (con una clase de cliente) y un módulo de gsm para enviar mensajes y llamar, os posteo el código aquí debajo:
Elementos utilizados:
//LIBRERIAS____________________________________________________________________________________________________________________________
#include <GSM.h>
#include <SPI.h>
#include <Ethernet.h>
#define Reiniciar asm("jmp 0x0000")
boolean conectado = false;
int Comprobar_conexion = 0;
int cuenta;
int intento = 0;
String NumArd = "GSM_1:";
boolean GSM_Encendido = false;
boolean Repuesto = false;
String Tlf = "GSMtf:";
String Orden_Mensaje = "GSM01:";
String Orden_Llamada = "GSM02:";
String Comprobrar_Sim = "GSM03:ESTADO";
String cadena = ""; // Almacenar el codigo recibido.
String sincronizacion = "";
// DATOS TLF_____________________________________________________________________________________________________________________________
#define PINNUMBER "1234"
char tlf[20] = "";
char txtMsg[200] = "Mensaje de prueba";
// ___________________________________________________________________________________________________________________________________
// CONFIGURACIÓN DE RED____________________________________________________________________________________________________________________________
byte direccion_mac[] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc}; // Dirección MAC no debe estar repetida en la red.
IPAddress direccion_ip_fija(172, 16, 4, 56); // 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, 74); // Dirección IP de Pc Pruebas.
//IPAddress ip_servidor(172, 16, 0, 87); // Dirección IP de Pc Comprobacion.
EthernetClient cliente = EthernetClient();
byte estado_conexion;
// INICIO LIBRERÍA GSM_____________________________________________________________________________________
GSM gsmAccess;
GSM_SMS sms;
GSMVoiceCall vcs;
String remoteNumber = tlf; // the number you will call
char charbuffer[20];
//___________________________________________________________________________________________________________________________________
// PINES_____________________________________________________________________________________________________________________________
int Pin6 = 6;
int Pin7 = 7;
//___________________________________________________________________________________________________________________________________
void Comprobar_Sim()
{
}
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);
intento++;
if (intento > 10) {
intento = 0;
Reiniciar;
}
conectar_ethernet();
}
}
void setup() {
// PINMODES_____________________________________________________________________________________________________________________________
pinMode(Pin6, OUTPUT);
pinMode(Pin7, OUTPUT);
// ETHERNET Y SERIAL__________________________________________________________________________
Serial.begin(115200);
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 = "";
if (!cliente.connected())
{
conectar_ethernet();
}
else
{
while (cliente.available()) {
char c = cliente.read();
if (cadena.length() < 161) {
cadena += c;
}
}
if (cadena == "sincro") {
sincronizacion = cadena;
Serial.println("Sincronizacion recibida");
}
if (cadena != "sincro") {
Repuesto = false;
}
//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.
}
if (cadena.startsWith(Orden_Mensaje)) // Si el identificador es de orden mensaje ( GSM01:Mensaje de prueba. )
{
Repuesto = false;
corte = cadena.substring(6, cadena.length()); // Cortamos el codigo y nos quedamos solo con el mensaje.
corte.toCharArray(txtMsg, corte.length() + 1); //Guardamos el mensaje en su propia variable.
Serial.println(txtMsg); // 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(); //
}
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, 14); // Almacenamos el número de telefono en una variable
if (vcs.voiceCall(tlf)) {
delay (3000);
vcs.hangCall();
}
}
if (cadena.startsWith(Comprobrar_Sim)) // Si el identificador es de orden llamada ( GSM03: )
{
}
if (cadena == "disconect") //
{ //
conectado = false; // Desconexión "controlada"
cliente.stop(); //
} //
if (cadena != "") //
{ //
Serial.println(cadena); // Limpieza de la variable
cadena = ""; //
} //
if (Repuesto == false) {
cliente.println(NumArd + "LIBRE");
Repuesto = true;
}
}
Comprobar_conexion++;
}
*/
Una vez presentado el código hago lo mismo con nuestra duda, como podreis haber comprobado en el código, este aparato esta conectado con un ordenador mediante una aplicación de visual basic que tan solo manda una cadena de tipo string mediante Tcp al arduino, el cual lee y realiza una acción u otra dependiendo de lo que le llegue, hasta ahora funciona:
1- Envio de mensajes a números de teléfono.
2- Conexión y reconexión suceda lo que suceda (hasta el momento ha pasado todas las puñeteradas que se nos han ocurrido).
3- Comprobación de conexión de red desde el visual.
La pregunta es la siguiente, el arduino ha de llamar con la función que he comentado al final del código, la cual esta en proceso,hemos conseguido hacer llamadas perdidas y establerlas pero se nos ocurrió que con la tarjeta SD del arduino shield quizás seríamos capazes de reproducir un audio pregrabado a la persona que conteste la llamada y de ser así, cosa que espero, si alguien podría echarme una mano con el código que sería necesario.
Hemos trabajado anteriormente con las tarjetas tipo micro SD y el arduino, importando archivos, pero jamás con uno de audio.
Gracias de antemano y espero podais ayudarnos.