Hola de nuevo gente .
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 . Muchas gracias de antemano.