Buongiorno a tutti,
da qualche mese, per puro svago, mi diletto con Arduino. A parte qualche esame di fisica ed elettrotecnica (tanti anni fa!), sono a digiuno dell'argomento, quindi ho iniziato con lo Starter kit Arduino ed ora sto cercando di fare altro, quindi ho preso un modulo SIM900 per far ricevere ad Arduino alcuni comandi tramite sms, o per inviarne.
Il tutto funziona perfettamente, ma da quando ho decido di inserire un sensore di movimento e di far partire un sms nel caso venga attivato, succede qualcosa di veramente strano; ad ogni ricezione o invio di sms da parte del SIM900, il PIR viene attivato, segnalando movimento!
Ho verificato tutti i collegamenti, ho cambiato il pin del PIR, ho eliminato tutti gli altri componenti presenti per semplificare il sistema, ma niente, accade sempre!
Vi riporto il log dove ho evidenziato il momento della ricezione degli sms:
12:29:22.781 -> Initializing...
12:29:24.281 -> AT
12:29:24.281 -> OK
12:29:24.812 -> AT+CMGF=1
12:29:24.812 -> OK
12:29:25.281 -> AT+CNMI=1,2,0,0,0
12:29:25.328 -> OK
12:29:25.328 -> Ready...
### Movimento 1 ###
12:29:36.078 -> Rilevato movimento!
### Movimento 2 ###
12:29:41.906 -> Rilevato movimento!
### Ricezione sms 1 ###
12:29:57.859 -> Rilevato movimento!
12:30:00.531 -> SMS:+CMT: "+XXXXXXXXXXXX","","19/05/02,12:28:29+08"Temp:
12:30:00.531 -> SND:+XXXXXXXXXXXX
12:30:00.578 -> DAT:19/05/02,12:28:29+08:
12:30:00.578 -> MSG:TEMP:
12:30:01.046 -> AT+CMGD=1,4
12:30:01.046 -> OK
### Ricezione sms 2 ###
12:32:13.140 -> Rilevato movimento!
12:32:15.781 -> SMS:+CMT: "+XXXXXXXXXXXX","","19/05/02,12:30:43+08"OFF 0:
12:32:15.828 -> SND:+XXXXXXXXXXXX:
12:32:15.828 -> DAT:19/05/02,12:30:43+08:
12:32:15.875 -> MSG:OFF 0:
12:32:16.343 -> AT+CMGD=1,4
12:32:16.343 -> OK
Il modulo SIM900 è quello presente in questo
articolo.
Allego lo schema e lo sketch semplificato.
#include <SoftwareSerial.h>
#define ADMIN_PHONE "+XXXXXXXXXXXX"
#define BAUD_RATE 19200
#define SIM_TX_PIN 7
#define SIM_RX_PIN 8
#define PIR_PIN 2
enum COMMAND_TYPE {
NONE,
ON,
OFF,
STATUS,
TEMP,
HELP
};
int smsReading = 0;
String smsSender;
String smsDateTime;
String smsMessage;
int pirState = LOW;
SoftwareSerial SIM900(SIM_TX_PIN, SIM_RX_PIN);
void setup()
{
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(BAUD_RATE);
//Begin serial communication with Arduino and SIM900
SIM900.begin(BAUD_RATE);
Serial.println("Initializing...");
delay(1000);
//Handshaking with SIM900
SIM900.println("AT");
updateSerial();
//Configuring TEXT mode
SIM900.println("AT+CMGF=1");
updateSerial();
// Decides how newly arrived SMS messages should be handled
SIM900.println("AT+CNMI=1,2,0,0,0");
updateSerial();
pinMode(PIR_PIN, INPUT);
Serial.println("Ready...");
};
void loop()
{
unsigned int pirValue = digitalRead(PIR_PIN);
if (pirValue == HIGH) {
if (pirState == LOW) {
//smsSend(ADMIN_PHONE, "Rilevato movimento!");
Serial.println("Rilevato movimento!");
pirState = HIGH;
}
}
else {
if (pirState == HIGH) {
pirState = LOW;
}
}
//Verifica se è presente un nuovo SMS
if (smsIsPresent())
{
//Dopo aver processato l'SMS, esegue le istruzioni
//e azzera le variabili
//execCommand();
smsClear();
}
};
boolean smsIsPresent()
{
//Se c'è già un sms, aspetto
if (smsReading) return smsReading;
if (SIM900.available() > 0)
{
int p1;
int p2;
String sms = "";
//Ricevo tutti i caratteri eliminando \n e \r e li metto in una string
while (SIM900.available() > 0)
{
delay(10);
char c = SIM900.read();
if ((c != '\n') && (c != '\r'))
sms.concat(c);
}
//Verifico che sia un SMS, nel qual caso lo processo
if (sms.startsWith("+CMT:") )
{
//La stringa sarà del tipo
//+CMT: "NUMERO","","YY/MM/DD,HH:NN:SS+08"MESSAGGIO
p1 = sms.indexOf('"');
p2 = sms.indexOf('"', p1 + 1);
smsSender = sms.substring(p1 + 1, p2);
p1 = sms.indexOf(',', p2 + 1);
p1 = sms.indexOf(',', p1 + 1);
p1 = sms.indexOf('"', p1 + 1);
p2 = sms.indexOf('"', p1 + 1);
smsDateTime = sms.substring(p1 + 1, p2);
smsMessage = sms.substring(p2 + 1);
smsMessage.toUpperCase();
Serial.println("SMS:" + sms + ":");
Serial.println("SND:" + smsSender + ":");
Serial.println("DAT:" + smsDateTime + ":");
Serial.println("MSG:" + smsMessage + ":");
smsReading = 1;
//Elimino gli SMS
smsDelete();
}
}
return smsReading;
};
void smsDelete() {
SIM900.println("AT+CMGD=1,4");
updateSerial();
};
void smsClear() {
SIM900.flush();
smsReading = 0;
smsSender = "";
smsDateTime = "";
smsMessage = "";
};
void updateSerial()
{
delay(500);
while (Serial.available())
{
SIM900.write(Serial.read());//Forward what Serial received to Software Serial Port
}
while (SIM900.available())
{
Serial.write(SIM900.read());//Forward what Software Serial received to Serial Port
}
};
Grazie
Federico
PS
Ho trovato nel forum in inglese due casi simili, ma uno si risolveva cambiando pin e l'altro non aveva soluzione!