Alarme avec GSM SIM 900

Bonjour à tous,
Je compte me créer une alarme permettant d’envoyer un sms si il y a intrusion et de pouvoir la contrôler à distance, par sms.

Je précise, je suis novice dans la matière.

Mon alarme comprendra

1 arduino
1 module GSM (ou un module GPRS A6, que me conseillez vous ??)
1 sirène (12v)
1 relais
2 ou 3 capteurs à effet hall
2 ou 3 aimants.

Le but est de pouvoir activer l’alarme en envoyant ‘on’ et de pouvoir la désactiver en envoyant ‘off’. Les capteurs seront positionnés au dessus des portes et les aimants sur les portes.

La partie du code qui comprend l’envoi de sms par le GSM, c’est bon mais ce qui me pose problème, c’est la réception de sms par le GSM et le transfert à l’arduino.
J’ai trouvé un bout de code, je compte l’adapter à mon cas mais je ne le comprends pas. Or, quand je pique un bout de code, j’aime bien le comprendre pour pouvoir apprendre des choses, puisque je le rappelle, je suis un grand débutant.

Pourriez-vous donc m’aider à comprendre ce bout de code, surtout la partie comprenant ‘BuffIndex’, tous ces truc là.
Merci d’avance :slight_smile:

Voici le code en question :

#include <SoftwareSerial.h>
unsigned char Buff[250];
unsigned char BuffIndex;

void setup()
{    
  Serial.begin(9600);    
  Serial.println("GSM Tutorial");    
  delay(3000);    
  Serial.println("AT+CMGF=1");    
  delay(3000);    
  Serial.println("AT+CNMI=2,2,0,0,0");    
  memset(Buff, '\0', 250);// Initialize the string    
  BuffIndex=5; 
} 
  
  
voidloop()
{
  while(1)
      {
        if(Serial.available()>0)
          {
            Buff[BuffIndex] = Serial.read();
            
            if( (Buff[BuffIndex-2] == '@') && (Buff[BuffIndex-1] == 'C') && (Buff[BuffIndex] == '1'))
              {
                Serial.println("Command 1");
              }
              
              if( (Buff[BuffIndex-2] == '@') && (Buff[BuffIndex-1] == 'C') && (Buff[BuffIndex] == '2'))
              {  
                Serial.println("Command 2");             
              }

             
              if( (Buff[BuffIndex-2] == 'C') && (Buff[BuffIndex-1] == 'M') && (Buff[BuffIndex] == 'D'))
              {                  
                Serial.println("Command CMD");              
              }

               BuffIndex++;
              if(BuffIndex>250)
              {
                BuffIndex=5; 
              }
              

              
          }
      }
}

vous n'avez pas trouvé un code super... void loop() c'est en 2 mots... pourquoi rajouter un   while(1)alors que la loop() va boucler pour vous... l'indentation est moche c'est pénible à lire...

en gros à chaque fois qu'un caractère arrive il le rajoute à la fin de son buffer et teste les 3 derniers caratères reçus à la recherche des mot magique "@C1", "@C2" ou "CMD".

il ne commence pas à écrire dans le buffer à l'index 0 pour ne pas lire n'importe où en mémoire au début avec les indices -1 et -2 et a sans doute prévu des commandes qui peuvent comporter 5 caractères peut être

cela dit, il écrit à la case 250 qui n'existe pas donc aura un débordement mémoire et ne gère pas correctement la réception à ce moment là (si vous avez reçu 'C' et 'M' en fin de buffer et que vous recevez le 'D' ensuite et qu'il l'a mis en position 5, le test     if ( (Buff[BuffIndex - 2] == 'C') && (Buff[BuffIndex - 1] == 'M') && (Buff[BuffIndex] == 'D'))ne voit pas qu'on a reçu CMD...

vous devriez lire un tuto sur écouter le port Série (éventuellement jetez un oeil à mon petit tuto sur le sujet)

Je vais regarder ça, merci !