Hola a todos, gracias a la ayuda de la estupenda gente de este foro ya he terminado el código totalmente y es perfectamente funcional. Es un discriminador de llamadas entrantes por línes telefónica. Recibe las llamadas a través de un modem, el cual lee el número llamante, lo envía por un módulo serie a un Arduino UNO y este lo graba en un fichero de una tarjeta SD. Posteriormente podemos leer los números llamantes con la pulsación de una botonadura y elegir si queremos bloquearlo o no pulsando otro botón. Tras ello se graba el número en un fichero de números bloqueados que es utilizado para leer el número llamante y compararlo con el almacenado en el fichero. Si coinciden, la llamada es tomada y se paran los timbrazos del teléfono durante unos minutos. El código completo en dos partes es este:
Primera parte:
/* Proyecto de discriminador de llamadas telefonicas no deseadas, tras la llamada se identifica el
numero llamante y se compara con los que están anotados en un fichero almacenado en una tarjeta SD. Si
coincide con alguno, la llamada es bloqueada. Ademas graba automáticamente los números que han llamado
y que posteriormente pueden seleccionarse con la botonadura para ser bloqueados.
El hardware necesario es un Arduino Uno, un modem con CallerID (en mi caso US Robotics 56k), un modulo
SD YL-30, una tarjeta SD, un modulo Serie RS232, un cable serie modem nulo, un modulo LCD de 16x2 y
una botonadura tipo Keypad de resistencias (una botonadura simple con tres resistencias de 3K en serie
conectando GND a Pin A0, p.e.).
El cable serie modem nulo permite obviar el comportamiento del modem en respuesta a la lineas RTS-CTS,
DTR-DSR, las cuales se unen en los extremos de cada conector, cruzándose las lineas TX-RX y
uniendo las GND entre si.
Conexion pines modulo SD a Arduino:
modulo: GND 3.3v 5v. CS MOSI SCK MISO GND
Arduino:GND 3.3V 5V. 10 11 13 12 GND
Conexion pines modulo LCD 1602 a Arduino:
(X)En modulo unir 1 y 3 con Resitencia 3K.
modulo: 1 2 3 4 5 6 ....11 12 13 14 15 16
Arduino:GND 5v(X) 2 GND 3 ....4 5 6 7 5v GND
*/
//Sample using LiquidCrystal library
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <SD.h> //CS en pin 10
SoftwareSerial mySerial(8, 9); // pin 8 a TX y 9 a RX del modulo
// select the pins used on the LCD panel
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
// Guardamos en que entrada de arduino esta conectado el pin CS del modulo.
//const int chipSelect = 10;
char nmbrstring[ ] = "NMBR";
char numerodete[10];
char numerotst[10];
char numllam[10];
char charBuf[10];
char charBuf2[10];
char charThree[10];
int numblock = 50;//cantidad de lineas de numeros del fichero
int i2 = 0;
int llamadas = 0;// Contador de llamadas, debe ser 0. Otro valor es para pruebas.
File myFile; //fichero llamadas recibidas
String stringThree;
unsigned long tAntes = 0;
unsigned long tAntes2 = 0;
unsigned long tAntes3 = 0;
unsigned long tAntes4 = 0;
long time_now = 0;
void setup()
{
lcd.begin(16, 2); // start LCD library
pinMode(A0, INPUT_PULLUP); // sets analog pin for input
lcd.setCursor(0,0);
lcd.print("LCD Activado"); // print a simple messag
delay (2000);
// Configuramos el puerto serie para informar de fallos a traves de el.
Serial.begin(9600);
while (!Serial) {
; // Espera para conexion puerto serie, solo necesario para leonardo
}
// Configuramos el puerto serie virtual para comunicarnos con el modem.
mySerial.begin(9600);
//Serial.println("Setup is Ready\n");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Setup is Ready");
//Iniciamos la SD
//Serial.print("Iniciando SD...");
//Serial.print("\n");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Iniciando SD...");
// El pin CS por defecto de la placa arduino debe ser configurado como salida
// aunque no se use (10 en la mayoria de las placas, 53 en Arduino Mega).
pinMode(10, OUTPUT);
// Si ha habido error al leer la tarjeta informamos por el puerto serie.
if (!SD.begin(10)) {
//Serial.println("Error inicializar SD!");
lcd.setCursor(0,1);
lcd.print("Error ini.SD!");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PULSE RESET");
pinMode(10, INPUT);
delay(1000);
//card.init(SPI_HALF_SPEED, 10);
delay(1000);
setup();
//return;
}
//Serial.print("SD inicializada...OK");
//Serial.print("\n");
lcd.setCursor(0,1);
lcd.print("SD ini...OK");
delay(2000);
//REcreando fichero RECIB.TXT
File Archivo1;
Archivo1 = SD.open("RECIB.TXT", FILE_WRITE);
if (Archivo1) {
Archivo1.println("111111111");
Archivo1.close();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("RECIB.TXT ini");
delay(2000);
lcd.setCursor(0,1);
lcd.print("OK");
delay(2000);
} else {
lcd.setCursor(0,1);
lcd.print("Error SD write");
delay(2000);
}
/* //Codigo test fichero existente
if (SD.exists("RECIB.TXT")){
lcd.setCursor(0,1);
lcd.print("RECIB.TXT exists");
SD.open("RECIB.TXT", FILE_WRITE).close();
}
else {
lcd.setCursor(0,1);
lcd.print("NO RECIB.TXT");
SD.open("RECIB.TXT", FILE_WRITE);
SD.open("RECIB.TXT", FILE_WRITE).close();
}
delay(2000);
if (SD.exists("BLOQ.TXT")){
lcd.setCursor(0,1);
lcd.print("BLOQ.TXT exists");
SD.open("BLOQ.TXT", FILE_WRITE).close();
}
else {
lcd.setCursor(0,1);
lcd.print("NO BLOQ.TXT");
SD.open("BLOQ.TXT", FILE_WRITE);
SD.open("BLOQ.TXT", FILE_WRITE).close();
}
*/ // Fin codigo test
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Start Modem....");
// Iniciamos los comandos Hayes para configurar el modem
mySerial.write("ATZ\r\n");
delay(4000);
lcd.setCursor(0,1);
lcd.print("4.");
//mySerial.write("AT+VCID=1\r\n");//Conceptronics CID ON
mySerial.write("AT#CID=1\r\n");//USR Robotics CID ON
delay(2000);
lcd.setCursor(2,1);
lcd.print("3.");
mySerial.write("ATS7=5\r\n");//USR Robotics Answer Wait 7 seg
delay(2000);
lcd.setCursor(4,1);
lcd.print("2.");
mySerial.write("ATS0=0\r\n");//USR Robotics Auto Answer OFF
delay(2000);
lcd.setCursor(6,1);
lcd.print("OK");
delay(2000);
}
void loop()
{
static char buffer[20];
buttonselect();// Selector botones
if (readline(mySerial.read(), buffer, 80) > 0)
{
//Presentador de todos los datos leidos por el puerto serie
//Serial.print("Datos: >");
//Serial.print(buffer);
//Serial.println("<");
//lcd.clear();
//lcd.setCursor(0,0);
//lcd.print("Datos: >");
//lcd.print(buffer);
char* numero1 = strchr(buffer, 'NMBR =');
char* prefinmbr = strtok(buffer, " =");
char* numero2 = strchr(numero1, ' ');
/* // Comprobador por puerto serie deteccion numero
Serial.println("Numero:");
Serial.print(numero2);
Serial.println("Prefinmbr:");
Serial.print(prefinmbr);
Serial.print("==");
Serial.print(nmbrstring);
Serial.print("\n");
*/
if(strcmp(prefinmbr, nmbrstring) == 0)//Detectamos la cadena NMBR que contiene el numero llamante
{
//Lector de numero
char* numerodete = numero2;//detecta numero con 1 espacio al inicio
String stringOne = numerodete;//convierte numero char a string
stringOne.trim();//elimina el espacio del inicio del número
//Serial.print("Numero llamante es:\n");
//Serial.print(stringOne);
//Serial.print("\n");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Num.llamante:");
lcd.setCursor(0,1);
lcd.print(stringOne);
stringOne.toCharArray(charBuf, 10);//convierte el numero string a char para strcmp
lcd.setCursor(0,1);
lcd.print(charBuf);