Led comandato tramite GSM

Ciao a tutti ragazzi!

Siccome era un po' di tempo che non mettevo mano con il codice GSM di Arduino, avrei bisogno di un piccolo aiutino :smiley:

Il mio progetto è molto semplice: interagire a distanza con un led (più in là diventeranno poi sensori e lampadine) e visualizzare il suo status sul mio cellulare.
Ho provato a smanettare un po' con gli esempi forniti già dalla libreria, ad esempio SendSMS ma trovo difficoltà a passare nella variabile remoteNumber il mio numero di telefono.

Mi spiego meglio: il progetto verrà alimentato standalone e quindi senza nessun monitor seriale che dica di inserire il numero ed il testo del messaggio, vorrei invece che tutto ciò fosse già implementato nel codice stesso.

Ad esempio se il led è acceso mi invia un messaggio con scritto "ON" e viceversa "OFF", oppure ancora, sono io che mando un messaggio per verificarne il suo stato e di conseguenza spegnerlo o accenderlo.

So che è una questione da superprincipianti ma non riesco a trovarne la soluzione :frowning:

Questo è il codice che ho fatto io, a me funziona… Buon lavoro!

/* -----------------------------------------------------------------------------------
 Accende e spegne un RELE a secondo dell'SMS inviato:
 ON  => Accende il RELE
 OFF => Spegne il RELE
 STATO => Comunica stato della caldaia/rele
 TEMP => Comunica la temperatura in casa
 Altro => Messaggio di errore sul Serial Monitor
 Fuga di Gas => invio sms con allarme
 Mancanza rete => invia sms con avviso (se collegata una batteria tampone su usb)
 ---------------------------------------------------------------------------------- */
#include "SIM900.h"
#include <SoftwareSerial.h> // necessaria alla libreria gsm.h richiamata in sms.h
#include "sms.h"            // Libreria per la gestione degli SMS
#include "call.h"

SMSGSM sms;
CallGSM call;

int rele1 = 10; // Il Pin 13 è quello connesso al rele
int rele1_led = 8;
int rele2 = 11;
int rele2_led = 9;
int status_led = 12;
int reset_gsm = 13;
int interrCount=0;
//int numdata;

boolean started=false;
char smsbuffer[160];
char Mittente[20];
char Mittente1[20];

void setup() 
{
  Serial.begin(9600);
  pinMode (rele1, OUTPUT);
  pinMode (rele2, OUTPUT);
  pinMode (rele1_led, OUTPUT);
  pinMode (rele2_led, OUTPUT);
  pinMode (status_led, OUTPUT);

  digitalWrite(rele1, HIGH);
  digitalWrite(rele2, HIGH);
  digitalWrite(rele1_led, LOW);
  digitalWrite(rele2_led, LOW);

  Serial.println("ESEMPIO INVIO/RICEZIONE SMS");
  strcpy(Mittente1,"NUMERO CELL"); //qui ci va il tuo numero di cellulare
  // sensors.begin();
  // Inizializzo la connessione GSM impostando il baudrate
  // Per l'utilizzo di HTTP è opportuno usare 4800 baud o meno
  if (gsm.begin(2400) )
  {
    Serial.println("STATUS Modulo GSM = PRONTO");
    started=true;
    digitalWrite(status_led, HIGH);  
  }
  else 
    Serial.println("STATUS Modulo GSM = INATTIVO");
}

void loop() 
{
  interrCount++;                    // contatore dei cicli loop
  char inSerial[50];
  char position;
  Serial.println(interrCount);      // stampa il numero dei cicli su seral monitor
  if (started)
  {
    if ( interrCount == 30 )        // ogni 30 cicli
    {
      interrCount = 0;              // azzero il contatore
      gsm.CheckRegistration();      // controllo se la sim è connessa alla rete

      if  (gsm.IsRegistered()==0)    // se disconnessa, riavvia il modulo GSM
      {
        Serial.println("disconnesso, riavvio");    // messaggio su serial monitor

        digitalWrite(reset_gsm, HIGH);
        delay(2000);
        digitalWrite(reset_gsm, LOW);
        delay(5000);
      }
    }

    // Legge se ci sono messaggi disponibili sulla SIM Card
    // e li visualizza sul Serial Monitor.
    position = sms.IsSMSPresent(SMS_ALL); // Valore da 1..20
    if (position) 
    {
      // Leggo il messaggio SMS e stabilisco chi sia il mittente
      sms.GetSMS(position, Mittente, smsbuffer, 160);
      Serial.print("Comando Ricevuto [tel. "+String(Mittente)+String("]: ") + String(smsbuffer));
      if (strcmp(smsbuffer,"1-ON")==0)        // se riveve il messaggio ON via sms
      {
        digitalWrite(rele1, LOW);
        digitalWrite(rele1_led, HIGH);   // Accende il LED/rele impostando il voltaggio a HIGH
        Serial.println(" => Accendo la Caldaia");
        call.Call("NUMERO CELL");
        delay(10000);
        call.HangUp();
      }
      else if (strcmp(smsbuffer,"1-OFF")==0)    // se riceve il messaggio OFF
      {
        digitalWrite(rele1, HIGH);    // Spengo il LED/rele impostando il voltaggio a LOW
        digitalWrite(rele1_led, LOW);
        Serial.println(" => Spengo la caldaia");
        call.Call("NUMERO CELL");
        delay(10000);
        call.HangUp();
      }
      else if (strcmp(smsbuffer, "2-ON")==0)  // se riceve 2-ON accende rele 2
      {
        digitalWrite(rele2, LOW); // Accendo il rele 2
        digitalWrite(rele2_led, HIGH); // Accendo il led rele 2
        Serial.println(" => Accendo rele 2");
        call.Call("NUMERO CELL");
        delay(10000);
        call.HangUp();
      }
      else if (strcmp(smsbuffer, "2-OFF")==0)  // se riceve 2-OFF spegne rele 2
      {
        digitalWrite(rele2, HIGH); // Accendo il rele 2
        digitalWrite(rele2_led, LOW); // Accendo il led rele 2
        Serial.println(" => Spengo rele 2");
        call.Call("NUMERO CELL");
        delay(10000);
        call.HangUp();
      }     
      else if (strcmp(smsbuffer, "S1")==0)    // altrimenti se riceve il messaggio STATO
      {
        if (digitalRead(rele1)==LOW)              // se il rele è acceso (stato invertito..)
        {
          sms.SendSMS(Mittente, "STATO:  Caldaia Accesa"); // invia sms con caldaia accesa - restituisce true se invia l'SMS
          Serial.println(" => La Caldaia e' Accesa");
          delay(5000);
        }
        else                                    // altrimenti
        {
          sms.SendSMS(Mittente, "STATO:  Caldaia Spenta"); //  invia sms con caldaia spenta - restituisce true se invia l'SMS
          Serial.println(" => La Caldaia e' Spenta");
          delay(5000);
        }
       }  
       else if (strcmp(smsbuffer,"S2")==0)    // altrimenti se riceve il messaggio STATO
         {
          if (digitalRead(rele2)==LOW)              // se il rele è acceso (stato invertito..)
          {
          sms.SendSMS(Mittente, "STATO:  Rele 2 acceso"); // invia sms con caldaia accesa - restituisce true se invia l'SMS
          Serial.println(" => Rele 2 acceso");
          delay(5000);
          }
          else                                   // altrimenti
          {
          sms.SendSMS(Mittente, "STATO:  Rele 2 spento"); //  invia sms con caldaia spenta - restituisce true se invia l'SMS
          Serial.println(" => Rele 2 spento");
          delay(5000);
          }
         }
      else
        Serial.println(" => non riconosciuto!");
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }
  }

  delay(1000);
}

Vedi che nel codice c'è NUMERO CELL: chiaramente devi sostituire il tuo numero a questo.

Il sistema ti fa uno squillo dopo aver eseguito il comando, in modo da non far spendere soldi per inviare SMS.

Ciao dokke,

Grazie per la risposta :slight_smile:

Adesso provo il codice, ma siccome dovrò adattarlo alle mie esigenze dovrò eliminare buona parte di esso, senza creare errori. Questa per me è la parte più difficile :cold_sweat:

Non è che ne avresti uno più semplice? Qualcosa di basilare del tipo:

Led acceso? ---> Manda un messaggio al numero X
Led spento? ---> Manda un messaggio al numero X

Oppure

Messaggio "status"---> Leggi stato del led

La libreria GSM per me è aramaico :o

Non so se può essere d'aiuto, ma utilizzo la versione 1.6.4 di Arduino e la libreria SIM900.h non mi viene riconosciuta nonstante abbia quella GSM installata