Buongiorno, ho bisogno di una mano con un programmino che sto cercando di ultimare, l'intento è costruire una piccola centrale d'allarme per controllare la porta basculante del box. A tal proposito non avendo reti wi-fi nelle vicinanze, ho optato per la comunicazione GSM tramite sms. Vi posto la bozza del codice:
// Arduino Home Security GSM Alarm
//Librerie e definizione hardware
#include <SoftwareSerial.h>
#define SIM800_TX_PIN 8 //SIM800 TX al pin D8 di to Arduino
#define SIM800_RX_PIN 7 //SIM800 TX al pin D7 di to Arduino
SoftwareSerial mySerial(SIM800_TX_PIN, SIM800_RX_PIN); //Creazione software serial per SIM800L
#define reed 2
#define tumper 3
#define led_1 9
#define led_2 6
//variabili lettura sms in entrata
char stringa[100];
char comando[31] = {0};
// variabili antifurto
bool stato_imp = false;
volatile int stato_reed = LOW;
volatile int stato_tamper = LOW;
String number = "xxxxxxxxxxx";
//==============================================================
// SETUP
//==============================================================
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
delay(10000); // attendo che il GSM abbia agganciato la linea
mySerial.print("AT+CMGF=1\r\n"); // imposta il formato del messaggio SMS come testo
delay(1000);
mySerial.print("AT+CNMI=1,2,0,0,0\r\n"); // specifica come devono essere gestiti i messaggi SMS appena arrivati
delay(1000);
pinMode(reed, INPUT);
attachInterrupt(digitalPinToInterrupt(reed), line_reed, FALLING ); // FALLING = da alto a basso.
pinMode(tumper, INPUT);
attachInterrupt(digitalPinToInterrupt(tumper), line_tamper, FALLING ); // FALLING = da alto a basso.
pinMode(led_1, OUTPUT);
digitalWrite(led_1, LOW);
pinMode(led_2, OUTPUT);
digitalWrite(led_2, LOW);
}
//==============================================================
// LOOP
//==============================================================
void loop()
{
lettura_sms();
antifurto();
}
//==============================================================
// INTERRUPT REED
//==============================================================
void line_reed()
{
stato_reed = HIGH;
}
//==============================================================
// INTERRUPT TAMPER
//==============================================================
void line_tamper()
{
stato_tamper = HIGH;
}
//==============================================================
// ANTIFURTO
//==============================================================
void antifurto() {
if (stato_imp = true) { // flag impianto inserito
digitalWrite(led_1, HIGH); // accende led impianto inserito
if (stato_reed == HIGH) { // contatto porta aperto
invio_sms();
digitalWrite(led_2, HIGH); // accende led segnalazione allarme
}
if (stato_tamper == HIGH) { // linea tamper aperta
invio_sms();
digitalWrite(led_2, HIGH); // accende led segnalazione allarme
}
}
else if (stato_imp = false) { // flag impianto disinserito
digitalWrite(led_1, LOW); // spengne led a impianto disinserito
}
}
//==============================================================
// INVIO SMS ALLARME
//==============================================================
void invio_sms() { //invio sms
mySerial.println("AT+CMGF=1"); // Set SMS Mode
delay(150);
mySerial.println("AT+CMGS=\"+39" + number + "\""); // specifica numero di destinazione
delay(150);
mySerial.print("Attenzione, la centrale è in allarme!"); // testo di risposta via SMS
delay(150);
mySerial.write((byte)0x1A); // End of message character 0x1A: equivalente a Ctrl+z
delay(50);
mySerial.println();
}
//==============================================================
// INSERIMENTO/DISINSERIMENTO IMPIANTO VIA SMS
//==============================================================
void lettura_sms() {
if (mySerial.available()) {
mySerial.readString().toUpperCase(); // rendo maiuscola tutta la stringa per evitare errori di sintassi
mySerial.readString().toCharArray(stringa, 100); // converto la stringa message nell'array stringa
strncpy(comando, stringa, 30); // copio in comando la prima parte del messaggio ricevuto ossia: +CMT "+39numerotelefono"
Serial.println(comando);
if (strncmp(comando, "+39xxxxxxxxx", 13) == 0) { // poi controllo se in comando sia presente il numero del mittente autorizzato
if (strncmp(comando, "ON", 2) == 0) { // e inserisco impianto
stato_imp = true;
}
else if (strncmp(comando, "OFF", 3) == 0) { // o disinserisco impianto
stato_imp = false;
}
}
mySerial.print("AT+CMGDA=\"");
mySerial.println("DEL ALL\""); // cancello tutti i messaggi
}
}
nello specifico la difficoltà che incontro è nella gestione deigli sms entranti:
void lettura_sms() {
if (mySerial.available()) {
mySerial.readString().toUpperCase(); // rendo maiuscola tutta la stringa per evitare errori di sintassi
mySerial.readString().toCharArray(stringa, 100); // converto la stringa message nell'array stringa
strncpy(comando, stringa, 30); // copio in comando la prima parte del messaggio ricevuto ossia: +CMT "+39numerotelefono"
Serial.println(comando);
if (strncmp(comando, "+39xxxxxxxx", 13) == 0) { // poi controllo se in comando sia presente il numero del mittente autorizzato
if (strncmp(comando, "ON", 2) == 0) { // e inserisco impianto
stato_imp = true;
}
else if (strncmp(comando, "OFF", 3) == 0) { // o disinserisco impianto
stato_imp = false;
}
}
mySerial.print("AT+CMGDA=\"");
mySerial.println("DEL ALL\""); // cancello tutti i messaggi
}
}
potete indicarmi il metodo migliore?