Shield GSM

Bonjour à tous,
Petite question aux pros du shield GPS GPRS http://www.tinyosshop.com/index.php?route=product/product&product_id=464
Je développe une petite alarme pour mon bateau basée sur un capteur PIR, un capteur de présence secteur, un capteur ILS de présence d’eau anormale.
Tout ça fonctionne normalement. Le capteur PIR monté sur l’arduino uno fonctionne normalement càd passage HIGH en cas de présence.
Mon problème concerne son utilisation conjointement avec le shield SIM 900.
J’ai un état haut sur sur sa sortie (pin6) toutes les trois heures.
Pas de soucis côté code puisque ça fonctionne, je reçois bien les sms provoqués par le capteur PIR.
Je me demande si le shield GSM ne génère pas à intervalles plus ou moins réguliers un HIGH sur les pins E/S dont je me sers. Le SIM900 est équipé d’une RTC dont je ne me sers pas vu que les sms reçus et émis donnent cette info sur le smartphone. Mais le fait que le phénomène se produise de façon régulière laisse supposer que le shield fait quelque chose en relation avec la RTC. Ce n’est pas un reset de mon logiciel.
Merci par avance pour une suggestion.

/* Alarme GSM 
Shield GSM GPRS TinySine  http://www.tinyosshop.com/index.php?route=product/product&product_id=464
*/
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;
//SoftwareSerial SIM900(2,3);  //déjà pris en compte dans lib

/* D2, D3 for Rx, Tx
D4 VOIE D'EAU
D5 SECTEUR 230Vac absence
D6 capteur PIR intrusion.
D7 for Ring Indicator
D8 power
D9 reset 
D10 SD_CS, D11 MOSI, D12 MSO, D13 SCK, capteur PIR intrusion. ******************
*/

//To change pins for Software Serial, use the two lines in GSM.cpp.
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
//debug begin
char sms_position;
char phone_number[20]; // array for the phone number string
char sms_text[100];
int i;
 String SMS2 ;  //
// String SIM_PIN_CODE = String( "1234" );
//---------------------------------
int buttonState_10 = 0;          // variable for reading the pushbutton status
const int buttonPin_4 = 4;       // capteur VOIE d'EAU
int buttonState_4 = 0;
const int buttonPin_5 = 5;       // capteur absence 230Vac Secteur
int buttonState_5 = 0;
const int buttonPin_6 = 6;       // capteur PIR intrusions
int buttonState_6 = 0;           // variable for reading the pushbutton status
//--------------------------------------------------------------------------------------------------------------------------------------------------

void setup()
{
    //  SIM900.begin(2400);    
    Serial.begin(4800);        //    mySerial.begin(19200);  
    pinMode(buttonPin_6, INPUT);
    //-------------------------
    Serial.println("GSM Shield testing.");    
    if (gsm.begin(4800)) 
    {
        Serial.println("\nstatus=READY");
        started=true;
    } 
    else 
        Serial.println("\nstatus=IDLE");

    if(started) 
    {
        //Enable this two lines if you want to send an SMS.
        if (sms.SendSMS("+3361273xxxx", "Ete 42 > SETUP"))  
        Serial.println("\nSMS sent OK");
    }    
}
//--------------------------------------------------------------------------------------------------------------------------------------------------

void loop()
{
    if(started) 
      {   // GESTION CAPTEUR PIR
      buttonState_6 = digitalRead(buttonPin_6);  //  Test de la pin 6
      if (buttonState_6 == HIGH) {  // Serial.println("BOUTON ON");       // si etat pin 10 == 1  il y a détection PIR         
            //----------------------------------------
            // ATTENTE QUE LE PIR REPASSE à LOW   
             while(digitalRead(buttonPin_5)==HIGH) { // attente buttonPin_5 repasse à LOW 
             }                        
            //---------------------------------------                                          
            if( sms.SendSMS("+3361273xxxx", "Ete_42 / INTRUSION /")) ;     // envoi SMS correspondant à INTRUSION
              buttonState_6 == 0;      // A ESSAYER            //   Serial.println("\nSMS sent OK");
       delay(2000);       
       }
      //----------------------------------------------  Read if there are messages on SIM card and print them.      
        sms_position=sms.IsSMSPresent(SMS_UNREAD);
      
        if (sms_position) 
          {
            // read new SMS
            Serial.print("SMS postion:");
            Serial.println(sms_position,DEC);
            sms.GetSMS(sms_position, phone_number, sms_text, 100);
            // now we have phone number string in phone_num
            Serial.println(phone_number);
            // and SMS text in sms_text
            Serial.println(sms_text);
            // Serial.print(sms_text);
            String SMS2 = sms_text;  // Passe SMS reçu dans String SMS2 pour test
            // Serial.print("SMS TEXTE = "); Serial.println(SMS2);
       //---------------------------------------------------------------------
             if (SMS2 == "ALA_OFF")  // Neutralise pin 10
              {                
                 pinMode(buttonPin_6, OUTPUT);   // NEUTRALISE LA PIN 10 en entr
                 if( sms.SendSMS("+3361273xxxx", "Ete_42 : ALA OFF")) ; 
                 SMS2 == "";  // vide le buffer            
               }
       //---------------------------------------------------------------------        
                if (SMS2 == "ALA_ON")  // Active pin 10
              {              
                 pinMode(buttonPin_6, INPUT);   // NEUTRALISE LA PIN 10 en entr
                 if( sms.SendSMS("+3361273xxxx", "Ete_42 : ALA ON")) ;  
               SMS2 == "";  // vide le buffer
               }
        //---------------------------------------------------------- INTERROGATION depuis smartphone             
            if (SMS2 == "JPJ")
              {
                 //  Serial.println("  SMS pris en compte");
                 if( sms.SendSMS("+3361273xxxx", "Ete_42 : RAS"))
                 SMS2 == "";  // vide le buffer
                 //  Serial.println("\nSMS sent OK");
               }           
          }   
            else
          {
            // Serial.println("NO NEW SMS,WAITTING");
          }
        SMS2 = "";  //RAZ buffer
                  
    }   
}

jpjcb66: ... Tout ça fonctionne normalement. Le capteur PIR monté sur l'arduino uno fonctionne normalement càd passage HIGH en cas de présence. Mon problème concerne son utilisation conjointement avec le shield SIM 900. J'ai un état haut sur sur sa sortie (pin6) toutes les trois heures.

Bonsoir JP Pas sur d'avoir bien compris "tout" ton problème :grin:

Si je resume ce que j'ai compris :

  • l'envoi d'un SMS sur declenchement (vérifié) du PIR , c'est OK
  • tu reçois systematiquement un "SMS intrusion" toutes les 3 heures ?

Salut Philippe
Toujours embusqué au coin du bois :slight_smile:
Suis rentré très tard hier, on travaille de midi à minuit chez nous :slight_smile:

Tu as bien compris.
En fait le sketch d’origine je l’ai juste modifié dans “void loop()” en deux parties distinctes mais qui malheureusement interfèrent.

  1. La détection PIR pin(6) et envoi/réception sms.
  2. Réception sms pour tester mon gadget à bord du bateau et activer/désactiver l’alarme.
    Dans cette partie il arrive souvent que sur un ordre envoyé il me réponde par une détection alarme.
    Comme s’il vidait le buffer sms alors qu’il ne devrait pas entrer dans la routine déclenchée par un état HIGH de la pin(6) détection PIR.
    Ensuite il y a l’émission régulière à la minute près d’un sms “Ete_42 / INTRUSION /” donc passage à l’état HIGH de la pin PIR.
    Bon en attendant j’ai les plaquettes de freins de Mme à changer.
    La librairie doit être costaud, je n’ai pas encore mis le nez dedans.
    @+ Bon pont :slight_smile:

jpjcb66: Salut Philippe Toujours embusqué au coin du bois :) Suis rentré très tard hier, on travaille de midi à minuit chez nous :)

Tu as bien compris. En fait le sketch d'origine je l'ai juste modifié dans "void loop()" en deux parties distinctes mais qui malheureusement interfèrent. 1) La détection PIR pin(6) et envoi/réception sms. 2) Réception sms pour tester mon gadget à bord du bateau et activer/désactiver l'alarme. Dans cette partie il arrive souvent que sur un ordre envoyé il me réponde par une détection alarme. Comme s'il vidait le buffer sms alors qu'il ne devrait pas entrer dans la routine déclenchée par un état HIGH de la pin(6) détection PIR. Ensuite il y a l'émission régulière à la minute près d'un sms "Ete_42 / INTRUSION /" donc passage à l'état HIGH de la pin PIR. Bon en attendant j'ai les plaquettes de freins de Mme à changer. La librairie doit être costaud, je n'ai pas encore mis le nez dedans. @+ Bon pont :)

Bonsoir JP j'ai regardé rapidement

dans ce bout de code

 if (SMS2 == "ALA_ON")  // Active pin 10
              {             
                 pinMode(buttonPin_6, INPUT);   // NEUTRALISE LA PIN 10 en entr
                 if( sms.SendSMS("+3361273xxxx", "Ete_42 : ALA ON")) ; 
               SMS2 == "";  // vide le buffer
               }

tu ne vide pas le buffer SMS2 (utilisation de == au lieu de = ) ça devrait etre :

SMS2 = "";  // vide le buffer

Oui, merci mais je l'ai déjà corrigé ça et même supprimé car ça ne change rien.

jpjcb66: Oui, merci mais je l'ai déjà corrigé ça et même supprimé car ça ne change rien.

:D Alors, il va falloir creuser plus profond !

cette periodicité de 3 heures , ne semble pas etre du à du debordement de "timer" arduino

Tu confirme qu’après un 1er déclenchement du PIR (HIGH) et retour à LOW , il n'y a qu'un seul SMS emis et qu'ensuite tu reçois systématiquement toutes les 3 heures un nouveau SMS "intrusion" ?

Oui je confirme mais parfois c'est toutes les deux heures avec une salve de deux ou trois sms. J'ai essayé ce matin sans le capteur avec une 22k à la masse sur la pin6 pour forcer à LOW Aucun envoi intempestif jusqu'à l'application d'un "+" (HIGH). J'en perds mon latin car qu'est-ce qui dans le PIR peut provoquer sur sa sortie un High à espaces à peu près réguliers. J'ai positionné les potars sur sensibilité mini et temps de l'état haut également au mini. Reste donc le filtrage logiciel sachant que s'il y a une vraie intrusion je vais avoir une succession de HIGH. On peut déclencher le départ du SMS à partir de trois ou quatre HIGH dans un temps donné. http://www.robot-maker.com/shop/blog/27_Connecter-capteur-Infrarouge-HCSR501.html

Tu fais les tests sur le bateau (milieu humide, voire salin) ou en intérieur (milieu sec, tempéré) ?

Sinon, la solution de filtrage me semble adaptée, bien qu’on n’ait pas d’explications du phénomène…

lesept: Tu fais les tests sur le bateau (milieu humide, voire salin) ou en intérieur (milieu sec, tempéré) ?

J'ai fait les deux. Mais en ce moment à domicile. Ce n'est pas ma première application arduino sur le bateau, bus CAN, GPS pour la VHF etc... Jamais eu de problèmes. Sur ce cas je serais déçu d'en arriver à ce filtrage logiciel sans avoir compris ce qui se passe. Donc je cherche ;)

jpjcb66: J'ai fait les deux. Mais en ce moment à domicile. Ce n'est pas ma première application arduino sur le bateau, bus CAN, GPS pour la VHF etc... Jamais eu de problèmes. Sur ce cas je serais déçu d'en arriver à ce filtrage logiciel sans avoir compris ce qui se passe. Donc je cherche ;)

salut JP c'est quoi ton capteur PIR ?

le truc cheap que l'on trouve partout comme çà

ou un truc plus évolué ?

En jetant un œil sur le code, je remarque une petite erreur :

      if (buttonState_6 == HIGH) {  // Serial.println("BOUTON ON");       // si etat pin 10 == 1  il y a détection PIR         
            //----------------------------------------
            // ATTENTE QUE LE PIR REPASSE à LOW   
             while(digitalRead(buttonPin_5)==HIGH)

Ça devrait être
while(digitalRead(buttonPin_6)==HIGH) // <-- 6 au lieu de 5Mais c’est peut-être déjà corrigé ?

Slt Philippe Oui c'est ça, je t'ai mis le lien quatre posts plus haut.

@ Lesept.
C’est déjà corrigé, j’ai essayé plusieurs pin(s) et ai du joindre mon code entre deux corrections.
Merci de l’avoir lu :smiley:

jpjcb66: Slt Philippe Oui c'est ça, je t'ai mis le lien quatre posts plus haut.

8) 'soir JP OK

c'est le genre de truc cheap qui ne s’achète pas "par un" :D

tu à testé la reproductibilité ?

Slt Philippe, Affirm, j'ai reçu un paquet de 3, c'est pareil. J'ai un autre test à refaire sans le GPRS Bonne journée

jpjcb66: Slt Philippe, Affirm, j'ai reçu un paquet de 3, c'est pareil. J'ai un autre test à refaire sans le GPRS Bonne journée

Je me disais bien ! 8)

perso , pour une levée de doute , je ferais un test en "supprimant" completement le PIR

un simple contact sec fugitif pour le simuler et voir si je reçois ensuite periodiquement du sms d'intrusion

Oui ça c'est fait aussi, je te l'ai dit un peu plus haut, "Oui je confirme mais parfois c'est toutes les deux heures avec une salve de deux ou trois sms. J'ai essayé ce matin sans le capteur avec une 22k à la masse sur la pin6 pour forcer à LOW Aucun envoi intempestif jusqu'à l'application d'un "+" (HIGH).".

Là je réessaie sans le shield GSM. J'avais un soucis avec un court sketch qui mesure le temps passé en millis() entre deux déclenchements. Donc au moins deux heures d'attente maintenant pour vérifier si le phénomène se reproduit mais j'avais déjà essayé ça aussi et il me semble que je n'avais pas eu de déclenchement. J'ai opté pour ces capteurs chinois cheap because il n'y a pas plus simple, alim 5Vcc mais je peux attaquer un relais ou essayer en intercalant une porte cmos. Les deux autres fonctions de mon alarme, eau dans la cale (contact sec (si je peux dire !) ILS) et contact sec aussi sur relais 230Vac pour la perte du secteur (prise de quai) fonctionnent bien. J'ai en stock des capteurs PIR d'alarme domestique de qualité mais ça tourne en 12v donc ça complique. Il me semble d'ailleurs que la détection de présence aboutit sur relais par lequel passe la boucle d'alarme fenêtres etc... donc contacts secs. @+

Bjr,
J’ai laissé tourner depuis hier un arduino équipé du capteur PIR sans le shield GPRS. RAS, pas de détection parasite.
J’essaie maintenant avec le shield GPRS et le PIR mais avec un sketch minimaliste (sans traitement SMS).
@ suivre

Bjr,

Eh bien je pense avoir fait le tour.... Et rien compris ! Dernière version : Le capteur PIR sur A0. Toujours pareil, trois heures pile après le lancement = une alerte. J'ai donc essayé les différents ports disponibles. A chaque fois après un délai de 3 h un bref passage anormal à HIGH sur la broche du capteur PIR est détecté par mon sketch. Le capteur PIR remplacé par une résistance de rappel à LOW même de forte valeur 1,8M ne provoque pas d'envoi de sms après 3 heures. Le même PIR sur l'arduino sans le shield GSM ne pose pas de problème non plus.

C'est agaçant de ne pas avoir le niveau pour comprendre :( . Un compteur de 10800 sec démarre je ne sais où en présence du shield GSM et du PIR. Comme il n'y a qu'une "alerte" je vais donc filtrer par logiciel pour ne provoquer l'envoi d'un sms d'alerte qu'après plusieurs passages à l'état haut durant une minute. De toutes façons cet algorithme de filtrage était prévu pour éviter les fausses alertes. Mais ça ne répond pas à la question.

@+

Il faudrait voir les datasheets notamment du capteur PIR, il y a peut-être quelque part une mise en sommeil avec un réveil au bout de 3 heures ?