SIM800 Reset hardware

Ho realizzato il progetto e il codice sotto riportato per l’invio e la ricezione di SMS, utilizzando:

SIM800L (blu), alimentata con 5V 4a;

Arduino Nano, alimentato con 5V 2a al pin +5V;

alimentazioni separate, con massa in comune.

Sia l’invio, sia la ricezione di SMS funzionano perfettamente se Arduino è collegato al serial monitor.

Se invece Arduino no è collegato al serial monitor, funziona unicamente l’invio.

La ricezione funziona solo se, dopo l’accensione del sistema, eseguo il reset hardware con il tastino. Così facendo, continua a funzionare regolarmente, fino allo spegnimento.

Al Nano ho messo il bootloader dell’Arduino Uno.

Ho provato anche ad inserire un condensatore elettrolitico tra reset e gnd e, in effetti, sembra faccia un reset all’accensione, ma il risultato non cambia.

Pensavo di usare watchdog per il reset, ma non ho ancora capito come fare a farlo una sola volta all’accensione.

[code]
#include <SoftwareSerial.h>

#define CTRL_Z 26

#define intervallo 180000//Intervallo di tempo tra due letture(millisecondi)= 3 min
long previousMillis = 0;  //Memorizza l'ultima volta che la sonda è stata letta

SoftwareSerial SIM800(2, 3); //SIM800L Tx & Rx is connected to Arduino #2 & #3

void setup() {
  pinMode(13, OUTPUT);
  pinMode(4, INPUT);
  Serial.begin(9600);
  SIM800.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  SIM800.println("AT");
  updateSerial();
  SIM800.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
  updateSerial();
  SIM800.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
  updateSerial();
  SIM800.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  SIM800.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
  updateSerial();
}

int n = 0;
String ret = "";
bool LOOP = true;
int bt, prevbt;

void loop() {
  if (SIM800.available()) {
    char c = SIM800.read();
    if (c == '\n') {
      Serial.println("RX:" + ret + "#");
      if (ret == "Led on") {
        digitalWrite(13, HIGH);
        Serial.println("on");
      } else if (ret == "Led off") {
        digitalWrite(13, LOW);
        Serial.println("off");
      }
      ret = "";
    } else if (c == '\r') {
    } else {
      ret += c;
    }
  }
    if (millis() -  previousMillis > intervallo)
  {
    bt = digitalRead(4);

    if (!prevbt && bt)
    {
      sendSMS();
      Serial.println("NO Energia Elettrica");
    }
 //   prevbt = bt;
    delay(100);
    if (prevbt && !bt)
    {
      sendSMSok();
      Serial.println("Energia Elettrica OK");
    }
    delay(100);
    prevbt = bt;
    previousMillis = millis();
  }
}

void sendSMS()
{
  // AT command to set SIM800 to SMS mode
  SIM800.print("AT+CMGF=1\r");
  delay(100);
  updateSerial();
  SIM800.println("AT+CMGS=\"+39XXXXXXXXXX\"");
  delay(100);
  updateSerial();
  SIM800.println("NO Energia Elettrica");
  delay(100);

  // End AT command with a ^Z, ASCII code 26
  SIM800.println((char)26);
  delay(100);
  SIM800.println();
  // Give module time to send SMS
  delay(5000);
}

void sendSMSok()
{
  // AT command to set SIM800 to SMS mode
  SIM800.print("AT+CMGF=1\r");
  delay(100);

  SIM800.println("AT+CMGS=\"+39XXXXXXXXXX\"");
  delay(100);

  SIM800.println("Energia Elettrica OK");
  delay(100);

  // End AT command with a ^Z, ASCII code 26
  SIM800.println((char)26);
  delay(100);
  SIM800.println();
  // Give module time to send SMS
  delay(5000);
}
void updateSerial()
{
  delay(500);
  while (Serial.available())
  {
    SIM800.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while (SIM800.available())
  {
    Serial.write(SIM800.read());//Forward what Software Serial received to Serial Port
  }
}
[/code]

Si accettano consigli, critiche e suggerimenti.

Grazie

Marco

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.
Grazie.

@marco508286:

A quanto detto da UKHeliBob aggiungo ...

... so che sei un vecchio utente del forum, ma ... Non riesco a trovare il tuo post di "presentazione", per cui ... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Sono Marco, ho 74 anni e ho da “sempre” la passione per l’elettronica. Una curiosità : mi sono diplomato in Elettronica industriale nel 1969 e all’esame di maturità c’erano le valvole!!!
Poi ho fatto tutt’altro nella vita lavorativa, dopo una laurea in Economia e Commercio.
Da quando sono in pensione mi sono appassionato al mondo Arduino e ho realizzato alcuni progetti di home automation.
Prediligo la parte manuale, tipo progettazione e realizzazione pcb, ma ovviamente ho dovuto imparare le basi di programmazione. Comunque, vado molto di “copia e incolla” sfruttando quanto disponibile in Internet.

Ho risolto il mio problema.

Era una banalità, forse, ma la riporto ugualmente nel caso possa essere di aiuto a qualcun altro dilettante come me.

Verificato che il tutto funzionava resettando Arduino con il pulsantino o aprendo il serial monitor, in pratica quindi rifacendo il setup a sistema alimentato, ho semplicemente inserito un delay nel setup del codice.

Adesso funziona sia in trasmissione, sia in ricezione SMS.

Il nuovo setup :

[code]
#include <SoftwareSerial.h>

#define CTRL_Z 26

#define intervallo 180000//Intervallo di tempo tra due letture(millisecondi)= 3 min
long previousMillis = 0;  //Memorizza l'ultima volta che la sonda è stata letta

SoftwareSerial SIM800(2, 3); //SIM800L Tx & Rx is connected to Arduino #2 & #3

void setup() {
  pinMode(13, OUTPUT);
  pinMode(4, INPUT);

  delay(7000);
  
  Serial.begin(9600);
  SIM800.begin(9600);

  Serial.println("Initializing...");
  delay(1000);

  SIM800.println("AT");
  updateSerial();
  SIM800.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
  updateSerial();
  SIM800.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
  updateSerial();
  SIM800.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  SIM800.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
  updateSerial();
}

int n = 0;
String ret = "";
bool LOOP = true;
int bt, prevbt;

void loop() {

}
[/code]

Scusate se ho fatto perder tempo, ma ci sono arrivato dopo un numero considerevole di prove.
Saluti a tutti
Marco