Buongiorno a tutti,
non so se vi può essere d'aiuto, ma come anticipato nel mio vecchio post vi voglio dettagliare il modo in cui ho risolto il problema di comunicazione tra il mio GPRS Shield e Arduino 2009.
In questa versione ho anche aggiunto lo shield Relè LINK
Leggendo su alcuni siti, ho scaricato e modificato all'interno della file GSM.cpp presente nella libreria "GSM_GPRS_GPS_Shield_GSMSHIELD" le porte di comunicazione dello shild con Arduino, impostandole sulla porta 2 e 3, come di seguito mostrato.
#define _GSM_TXPIN_ 2
#define _GSM_RXPIN_ 3
Modificate le porte ed eseguito le seguenti connessioni:
Shiled GSM - Arduino - Releè SHILED (montato direttamente sopra Arduino)
Porta 1 RX --> Porta 2 TX
Porta 2 TX --> Porta 3 RX
Porta 13 led
Porta 5 --> Rele1
Porta 6 --> Rele2
Porta 7 --> Rele3
Porta 8 --> Rele4
ho deployato il seguente codice:
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"
CallGSM call;
SMSGSM sms;
CallGSM gsmAccess;
// PIN Number della scheda 32XXXXXXX
#define PINNUMBER ""
SoftwareSerial mySerial(2, 3); // RX, TX
boolean started=false;
int led = 13; // Il Pin 13 è quello connesso al LED
char number_incoming[20];
// Define constants and variables
const int out1 = 5; // define Arduino pin connected to relay 1
const int out2 = 6; // define Arduino pin connected to relay 2
const int out3 = 7; // define Arduino pin connected to relay 3
const int out4 = 8; // define Arduino pin connected to relay 4
void setup()
{
pinMode(led,OUTPUT);
mySerial.begin (19200);
Serial.begin(9600);
Serial.println("GSM Shield testing.");
if (gsm.begin(19200))
Serial.println("\nstatus=READY");
else Serial.println("\nstatus=IDLE");
pinMode(out1, OUTPUT); // initialize the digital pin as an output
pinMode(out2, OUTPUT); // initialize the digital pin as an output
pinMode(out3, OUTPUT); // initialize the digital pin as an output
pinMode(out4, OUTPUT); // initialize the digital pin as an output
digitalWrite( out1,LOW );
digitalWrite( out2,LOW );
digitalWrite( out3,LOW );
digitalWrite( out4,LOW );
Serial.println("CHIUDO LA CHIAMATA");
delay(1000);
call.HangUp();
delay(1000);
Serial.println("ASPETTO CHIAMATA");
};
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
switch (call.CallStatus())
{
case CALL_NONE: // Nothing is happening
Serial.println("NESSUNA CHIAMATA");
break;
case CALL_INCOM_VOICE: // Yes! Someone is calling us
Serial.println("RECEIVING CALL");
call.CallStatusWithAuth(number_incoming,0,0);
Serial.print("incoming voice call from ");
Serial.println(number_incoming);
if ((strcmp(number_incoming,"+3932XXXXXXX")==0)
|| (strcmp(number_incoming,"+3932XXXXXXX")==0)
|| (strcmp(number_incoming,"+3932XXXXXXX")==0)
|| (strcmp(number_incoming,"+3932XXXXXXX")==0)
|| (strcmp(number_incoming,"+3932XXXXXXX")==0)) {
Serial.println(" => Accendo il LED");
delay(1000);
digitalWrite(led, HIGH); // Accende il LED impostando il voltaggio a HIGH
delay(1000);
Serial.println(" => Aziono il cancello");
delay(1000);
Serial.println(" => Apro il Relè");
digitalWrite(out1, HIGH);
call.HangUp();
delay(1000);
digitalWrite(led, LOW); // Accende il LED impostando il voltaggio a HIGH
delay(1000);
digitalWrite(out1, LOW);
break;
} else {
Serial.print(number_incoming);
Serial.println(" => non riconosciuto!");
call.HangUp();
delay(4000);
InvioMessaggio();
break;
}
case CALL_COMM_LINE_BUSY: // In this case the call would be established
Serial.println("TALKING. Line busy.");
break;
}
delay(1000);
}
void InvioMessaggio ()
{
mySerial.println ( "AT + CSCS = \"GSM\"" "\r"); // Imposta il modulo GSM in modalità testo
delay (1000); // Ritardo di 1000 milli secondi o 1 secondo
mySerial.println ( "AT + CMGF = 1" "\r"); // Imposta il modulo GSM in modalità testo
delay (1000); // Ritardo di 1000 milli secondi o 1 secondo
mySerial.println ( "AT + CMGS = \"32XXXXXXX\"" "\r"); // Sostituisci x con il numero di cellulare
delay (1000);
mySerial.println ("Alert! - Apertura cancello" "\r"); // Il testo SMS che si desidera inviare
delay (1000);
mySerial.println ((char) 26); // codice ASCII di CTRL + Z
delay (1000);
Come potete notare, all'interno del codice ho impostato la gestione del chiamante, in modo tale che nel caso sia presente in quella lista abilito il led e il relè, mentre nel caso non sia presente invio un sms ad un numero di cellulare personale.
Tale gestione mi permette di modificare la lista senza smontare la sim ed inserirla in un cellulare per la memorizzazione dei numeri.
A questo punto l'unico mio problema è la gestione della corrente. Nel caso essa salti devo impostare il reset della connessione GSM in modo automatico ma non avviene.
Avevo impostato questo codice con relativi collegamenti:
void powerUpOrDown()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(9,HIGH);
delay(2000);
digitalWrite(9,LOW);
delay(3000);
}
ma non ottengo nessun risultato anche se sulla libreria GSM è definita la porta 9
#define GSM_RESET 9
il progetto è finito, ma naturalmente tutto è migliorabile infatti attendo vostri consigli per risolvere il problema della connessione e sulla gestione degli errori e sbagli che ho fatto all'interno del codice.
Grazie a tutti per la collaborazione.