Interfaccia di Arduino Mega 2560 con modulo sim800L

Ciao ragazzi, sono matteo e sono nuovo nel forum. Mi trovo alle prese con un progetto che ha lo scopo di comandare 4 relè tramite l'arrivo di differenti messaggi su un modulo gsm sim800L. Il codice che sto utilizzando è questo:

//attenzione per collegare il modulo gsm tx su pin 19 e rx su pin 18
#include "SIM900.h"
#include "sms.h"           // Libreria per la gestione degli SMS



SMSGSM sms;
int rel1 = 9;// Il Pin 9 è quello connesso al relè1
int rel2 = 8; // Il Pin 8 è quello connesso al relè 2
int rel3 = 7; // Il Pin 7 è quello connesso al relè 3
int rel4 = 6; // Il Pin 6 è quello connesso al relè 4


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

void setup() 
{
  delay(2000);
  Serial.begin(9600);
  
//  Serial.println("APERTURA TRAMITE RICEZIONE SMS");
  pinMode(rel1, OUTPUT);   // imposta il pin 9 come pin di OUTPUT.
  digitalWrite(rel1, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto

  
  pinMode(rel2, OUTPUT);   // imposta il pin 8 come pin di OUTPUT.
  digitalWrite(rel2, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(rel3, OUTPUT);   // imposta il pin 7 come pin di OUTPUT.
  digitalWrite(rel3, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(rel4, OUTPUT);   // imposta il pin 6 come pin di OUTPUT.
  digitalWrite(rel4, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  
 
  // 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;  
  }
  else 
    Serial.println("STATUS Modulo GSM = INATTIVO");
};


void loop() 
{
  char inSerial[50];
  char position;
  if (started)
  {
    
    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);


//cambiare o aggiungere i numeri autorizzati all'apertura
  if ((strcmp(Mittente,"+39389112xxxx")==0) 
     || (strcmp(Mittente,"+39320262xxxx")==0)
     )
      
      {
         
     
      
      Serial.print("Comando Ricevuto [tel. "+String(Mittente)+String("]: ") + String(smsbuffer));
      if (strcmp(smsbuffer,"Garage")==0)
      {
         digitalWrite(rel1, LOW); // Accende il LED impostando il voltaggio a HIGH
         delay(700);
         Serial.println(" => Apro il Garage");
         digitalWrite(rel1, HIGH);
      }

      
      else if (strcmp(smsbuffer,"Condizionatore")==0)
      {
       digitalWrite(rel2, LOW); // Accende il LED impostando il voltaggio a HIGH
         delay(700);
         Serial.println(" => Accendo il Condizionatore");
         digitalWrite(rel2, HIGH);
         }
      else if (strcmp(smsbuffer,"Riscaldamento")==0)
      {
          digitalWrite(rel3, LOW); // Accende il LED impostando il voltaggio a HIGH
         delay(700);
         Serial.println(" => Accendo il riscaldamento ");
         digitalWrite(rel3, HIGH);}
         

 else if (strcmp(smsbuffer,"Porta")==0)
      {
          digitalWrite(rel4, LOW); // Accende il LED impostando il voltaggio a HIGH
         delay(700);
        Serial.println(" => Apro la porta");
         digitalWrite(rel4, HIGH);}
      }
      
      else
       Serial.println(" => non riconosciuto!");
     sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }


{

    
    delay(1000);
  }
 
  }   };

Utilizzando arduino mega ho commentato e decommentato nella libreria le righe per l'utilizzo corretto della scheda come da informazioni. Non richiamo la libreria software serial in quanto arduino mega ha le seriali vere e proprie. Ho utilizzato serial1 (tx 18 e rx 19) come suggerito in un topic molto simile al mio, e il codice si compila correttamente, ma nel monitor seriale quell che visualizzo è questo:

DB:NO RESP
DB:NO RESP
DB:NO RESP
Trying to force the baud-rate to 9600
1200
2400
4800
9600
19200
38400
57600
115200
ERROR: SIM900 doesn't answer. Check power and serial pins in GSM.cpp
STATUS moduloGSM=INATTIVO

Il modulo che utilizzo è questo : SIM800L

e nell'attesa di uno stabilizzatore lm2596 sto utilizzando una batteria da 4V e 2A, il modulo sembra agganciare correttamente alla rete perché lampeggia una volta ogni 3 secondi.

Il GND del modulo (batteria) è in comune con il GND della MEGA?

Guglielmo

Ciao Guglielmo, grazie per la risposta! Si è in comune! Non riesco a trovare il problema

Altre domandine banali ...

  1. hai adattato i livelli, visto che Arduino lavora a 5V mentre il SIM800L lavora a tensioni più basse?

  2. hai incrociato il TX e il RX di Arduno con quelli del SIM800L?

Guglielmo

Questo è il collegamento che uso io con quella scheda

Il TX del modulo con RX1 e RX del modulo con TX1. L'alimentazione del modulo gsm è a 4V precisi (da tester), e lampeggia correttamente. Ti ringrazio Brunello22, come mai utilizzi i diodi in uscita da RX e Reset? (ps io non avevo collegato il reset in quanto lo ritenevo superfluo.)

I diodi servono per adattare i livelli di tensione e funziona anche con un solo diodo perchè gli ingressi della sim800l hanno di default una resistenza di PullUp

Questo sarebbe il collegamento corretto usando un'alimentazione esterna

Ora provo a collegare in questo modo! Il reset lo collego al D2 anche se sto utilizzando mega?

Collegandolo come mi hai detto, il modulo gsm non riesce ad agganciarsi, lampeggia continuamente.
Se può essere d'aiuto, ogni volta che esce DB:NO RESP il relè due si illumina, per poi restare illuminato dopo il terzo DB:NO RESP.

Ma hai usato un diodo o un transistor per il reset ?

prova cosi

/*
    Test Sim800L
 */

#define pin_sleep 5
#define pin_reset 4

void setup() {
  // Reset del Modulo
  pinMode(pin_reset, OUTPUT);     // Pin collegato al Reset del modulo
  pinMode(pin_sleep, OUTPUT);     // Pin collegato al DTR del modulo
  digitalWrite(pin_sleep, HIGH);
  digitalWrite(pin_reset, LOW);   // invertire se si usa un NPN
  delay(100);
  digitalWrite(pin_reset, HIGH);  // invertire se si usa un NPN

  Serial.begin(9600);   // inizializza seriale per Arduino
  Serial1.begin(9600); // Inizializza SoftwareSerial
  delay (1500);
  Serial.println();
  Serial.println("Test seriale");
  Serial.println("il carattere PUNTO ESCLAMATIVO e' per fare CTRL-Z");
  Serial.println("il carattere LIRA resetta il modulo");
  Serial.println("il carattere DOLLARO invia un SMS");
  Serial.println("il carattere PERCENTUALE legge gli SMS");
  Serial.println("il carattere ^ entra in modalita Sleep");
  Serial.println();
  delay(2000);
  Serial1.write("AT\r\n");
}

void loop()
{
  if (Serial1.available() > 0)  Serial.write(Serial1.read());
  if (Serial.available() > 0) {
    bool stato = 0;
    char a = Serial.read();
    if (a == '!') {
      a = 26; // invia codice CTRL-Z
    }
    else if (a == '£') {
      digitalWrite(2, LOW);    // invertire se si usa un NPN
      delay(100);
      digitalWrite(2, HIGH);   // invertire se si usa un NPN
      stato = 1;
    }
    else if (a == '

) {
     invia_SMS(); // invia un SMS
     stato = 1;
   }
   else if (a == '%') {
     leggi_SMS(); // Legge gli SMS
     stato = 1;
   }
   else if (a == '^') {
     Serial1.println("AT+CSCLK=1"); // Attiva Sleep
     stato = 1;
   }
   if (stato == 0) {
     Serial1.write(a);
   }
 }
}

void invia_SMS() {
 Serial1.print("AT+CMGF=1\r");
 delay(1000);
 Serial1.print("AT+CMGS="+39338xxxxxxx"\r"); // mettere un numero di telefono
 delay(1000);
 Serial1.println("Prova invio di un SMS" );
 Serial1.println((char)26);
 Serial1.println();
}

void leggi_SMS() {
 Serial1.print("AT+CMGF=1\r");
 delay(100);
 Serial1.println("AT+CMGL="ALL"");
 Serial1.println();
}


![sim800L_B.jpg|1608x654](upload://cARYMT24ZB8LZC1Dv41XfXZo6X1.jpeg)

Il SIM800L richiede uno spunto di corrente per agganciarsi alla rete, se l'alimentatore non riesce a fornire 0,2A continuativi con picchi di 2A il SIM800L non si aggancia alla rete.

Inizio a credere che il problema non sia il modulo gsm. Se questo lampeggia ogni 3 secondi non dovrebbe essere agganciato correttamente? Potrebbe essere un problema nello sketch? L'istruzione gsm.begin(2400) è quella che non riesce ad eseguire correttamente.

Alla fine dopo innumerevoli tentativi ho comprato arduino uno e il codice funziona correttamente inserendo la libreria SoftwareSerial e utilizzando i pin 2 e 3 per tx ed rx. Mega non ne voleva proprio sapere