Go Down

Topic: [RISOLTO] SIM900 e PIR: interferenza! (Read 369 times) previous topic - next topic

Federico66

May 02, 2019, 01:26 pm Last Edit: May 03, 2019, 11:14 am by Federico66
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:

Code: [Select]

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.

Code: [Select]

#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!
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Standardoil

io la butto li, come ipotesi
i sensori di movimento PIR sono dei variometri, ovvero si accorgono della "variazione" di un qualcosa rilevato dal sensore, non sono sensibili al valore assoluto quindi, ma alla sua variazione
non è escluso, faccio ipotesi, che il consumo necessario all'invio di un SMS faccia variare la tensione di alimentazione, e da qui il sensore si attiva
tu, a parte l'invio di SMS, hai un'altra maniera per sapere se il PIR senta movimento? magari un led?
 
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

gpb01

#2
May 02, 2019, 01:58 pm Last Edit: May 02, 2019, 01:58 pm by gpb01
... non è escluso, faccio ipotesi, che il consumo necessario all'invio di un SMS faccia variare la tensione di alimentazione, e da qui il sensore si attiva
Verissimo, ma per questo quella scheda GSM/GPRS ha una SUA alimentazione, separata da quella di Arduino ... proprio perché durante i picchi, arriva ad assorbire anche 2A e Arduino non ce la farebbe ;)

Spero che l'OP abbia utilizzato due alimentazioni separate, una per la scheda GSM/GPRS ed una per Arduno ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Federico66

Intanto grazie per la celerità nel rispondere.

Spero che l'OP abbia utilizzato due alimentazioni separate, una per la scheda GSM/GPRS ed una per Arduno ;)
@gpb01: certamente,
- Arduino tramite usb al pc
- scheda SIM con alimentatore 5V 2,5A
tra di loro hanno in comune il GND


tu, a parte l'invio di SMS, hai un'altra maniera per sapere se il PIR senta movimento? magari un led?
@Standardoil: perdonami, ma non so se ho capito bene cosa intendi;
comunque, prima ho piazzato un led sulla stessa linea (GND-VCC) del pir, ma non ho notato variazioni di luminosità, allora ho verificato con un multimetro, sempre sulla stessa linea, ma niente, anche se onestamente non saprei che velocità di risposta potrebbe avere lo strumento.


Grazie
Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Federico66

... dimenticavo, prima che qualcuno lo chieda, ho già provveduto a sostituire il PIR e Arduino :-)
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Standardoil

questa è bella veramente....
non ho idee,
vabbe' applichiamo le regole standard:
1) metti un led sull'uscita del PIR, per avere conferma che in effetti sia alta l'uscita del PIR, non una "fisima" di Arduino
2) se ineffetti hai led acceso alla ricezione di uno SMS, escludendo l'alimentazione, rimane solo disturbo a RF
potendo, allontana il PIR dalla SIM, tanto le comunicazioni sono seriali per il modulo GSM, addirittura on-off il PIR
allontana, allontana tanto, specialemte il PIR, che tanto con pochi fili te la cavi
3) metti un'uscita di Arduino che ripete il PIR, ovvero se PIR alto uscita ALTA, che ti serve per sapere quando ha cavo troppo lungo, PIR comanda ma arduino non sente
altro non mi viene in mente per ora
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

Federico66

allontana il PIR dalla SIM, tanto le comunicazioni sono seriali per il modulo GSM, addirittura on-off il PIR
allontana, allontana tanto, specialemte il PIR, che tanto con pochi fili te la cavi
@Standardoil: in effetti nel frattempo facendo ulteriori ricerche, ho trovato altri casi simili per lo più senza soluzione, ma in uno la soluzione è stata proprio quella di allontanare a circa 2m il PIR dalla SIM!

In realtà è stata la prima cosa che ho pensato, anche se strana (visto che tutto mi sembrava corretto), e mi ero ripromesso di provare :-)

Stasera faccio qualche prova e ti aggiorno.

Intanto grazie
Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

Standardoil

mi raccomando il led sull'uscita del PIR
comunque i moduli GSM sono dei trasmettitori radio, per "definizione" irradiano, onn ci sarebbe nulla di strano se qualcosa ne soffrisse
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

gpb01

#8
May 02, 2019, 06:39 pm Last Edit: May 02, 2019, 06:42 pm by gpb01
... comunque i moduli GSM sono dei trasmettitori radio, per "definizione" irradiano ...
... non solo, mi piacerebbe proprio vedere questi schedine GSM/GPRS cinesi che certificazioni hanno EMC  ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

Claudio_FF

mi piacerebbe proprio vedere questi schedine GSM/GPRS cinesi che certificazioni hanno EMC
Uhmm, e anche le varie ESPxxxx  ;)
* * * * * IF e SWITCH non sono cicli * * * * *
* * * * Una domanda ben posta è già mezza risposta * * * *
* * * La corrente si misura in mA, la quantità di carica in mAh * * *

Federico66

1) metti un led sull'uscita del PIR, per avere conferma che in effetti sia alta l'uscita del PIR, non una "fisima" di Arduino
2) se ineffetti hai led acceso alla ricezione di uno SMS, escludendo l'alimentazione, rimane solo disturbo a RF
potendo, allontana il PIR dalla SIM, tanto le comunicazioni sono seriali per il modulo GSM, addirittura on-off il PIR
allontana, allontana tanto, specialemte il PIR, che tanto con pochi fili te la cavi
3) metti un'uscita di Arduino che ripete il PIR, ovvero se PIR alto uscita ALTA, che ti serve per sapere quando ha cavo troppo lungo, PIR comanda ma arduino non sente
altro non mi viene in mente per ora
@Standardoil: testato e confermato.
Il LED in uscita del PIR si accende alla ricezione del SMS; inoltre ho progressivamente allontanato il PIR dalla SIM, e a circa 1, 30m ha iniziato a funzionare correttamente. Sono arrivato fino a 2m senza problemi, non avevo un cavo più lungo :-)

Grazie, ho imparato qualcosa di nuovo.
Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

pgiagno

...Grazie, ho imparato qualcosa di nuovo...
Anch'io   :)

Per favore, metti [RISOLTO] nel titolo del tuo primo post.
Grazie.

Ciao,
P.

Go Up