¿Como realizar llamadas y envio de Sms con el modulo SIM800l y arduino uno?

Buenas a todos, estoy desarrollando un pequeño proyecto de un equipo sensor de gas que realiza cierres automatizados, alarmas y llamadas locales. Quería poder implementa el envió de un mensaje posterior a la llamada pero no eh podido hacer que envié 1 solo mensaje correctamente (solamente eh podido hacer que envié ilimitados mensajes al no condicionar la función).

Ajunto mi codigo para un mayor entendimiento del circuito en cuestion.

int pin8 = 8;
int sensor = A0;
int valorSensor = 0;
const int buzzer = 5;
const int buttonPin = 7;
int buttonState = 0;
int gas = 0;

unsigned int actual = 0;
unsigned int anterior = 0;

unsigned long previousMillis = 0;
int currentIntervalIndex = 0;
const int intervals[] = {200, 500}; // Intervalos de tiempo en milisegundos

// Variable para el estado del LED
int ledState = LOW;

#include <SoftwareSerial.h>
//Crea el objeto software serial para comunicarse con la SIM800L
SoftwareSerial mySerial(3, 2); // Los pines de la SIM800L Tx & Rx se conectaran a los pines de Arduino #3 & #2

unsigned long tiempoInicioLlamada = 0; // Variable para el temporizador de llamada
bool llamadaActiva = false; // Estado de la llamada
bool llamadaRealizada = false;
bool mensajeEnviado = false;

void setup() {
  //comienza la comunicación serial con Arduino y Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Comienza la comunicacion serial con Arduino y SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
  actual = millis();
  anterior = actual;

  pinMode(buzzer, OUTPUT);
  pinMode(pin8, OUTPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(pin8, HIGH);

 
}

void loop() {
  gas = digitalRead(pin8);
  buttonState = digitalRead(buttonPin);
  valorSensor = analogRead(sensor);

  // Si el valor del sensor supera un umbral y no hay una llamada activa, activa la llamada
  if (valorSensor > 130 && !llamadaActiva && !llamadaRealizada) {
    digitalWrite(pin8, LOW);
    llamadaActiva = true; // Marca que la llamada está activa
    tiempoInicioLlamada = millis(); // Inicializa el temporizador de llamada
    mySerial.println("ATD+ +59177167799;"); // Cambia ZZ con el código del país y xxxxxxxxxxx con el número de dígitos del teléfono
    updateSerial();
  }

  // Controla la duración de la llamada (20 segundos)
  if (llamadaActiva && (millis() - tiempoInicioLlamada >= 15000)) {
    llamadaActiva = false; // Marca que la llamada ya no está activa
    mySerial.println("ATH"); // Cuelga
    updateSerial();
    llamadaRealizada = true;    
    limpiarBufferSerial();    
  }

  if (llamadaRealizada && !mensajeEnviado) {
    limpiarBufferSerial();
    Serial.begin(9600);
  
    //comienza la comunicacion serial con Arduino y SIM800L
    mySerial.begin(9600);

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

    mySerial.println("AT"); //una vez que las pruebas están hechas exitosamente, regresará un OK
    updateSerial();
    
    mySerial.println("AT+CMGF=1"); // Configurando modo texto
    updateSerial();
    mySerial.println("AT+CMGS=\"+59177167799\"");//cambia ZZ  código del país y xxxxxxxxxxx con el número de teléfono a sms
    updateSerial();
    mySerial.print("alerta, gas detectado"); //contenido del texto
    updateSerial();
    mySerial.write(26);
    mensajeEnviado = true;
  }

  if (gas == LOW) {
      // Obtener el tiempo actual
  unsigned long currentMillis = millis();

  // Verificar si ha pasado el tiempo del intervalo actual
  if (currentMillis - previousMillis >= intervals[currentIntervalIndex]) {
    // Guardar el tiempo actual como referencia para el siguiente intervalo
    previousMillis = currentMillis;

    // Cambiar el estado del LED
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // Aplicar el estado al LED
    digitalWrite(buzzer, ledState);

    // Avanzar al siguiente intervalo (cíclico)
    currentIntervalIndex = (currentIntervalIndex + 1) % (sizeof(intervals) / sizeof(intervals[0]));
  }
  
}

  if ((valorSensor < 130) && (buttonState == HIGH)) {
    digitalWrite(pin8, HIGH);
    llamadaRealizada = false; // Cualquier botón presionado cuelga la llamada
    digitalWrite(buzzer, LOW);
    mensajeEnviado = false;

  }
}

void limpiarBufferSerial() {
  while (Serial.available() > 0) {
    char c = Serial.read();
  }
}

void updateSerial() {
  unsigned long tiempoActual = millis();
  if (tiempoActual - anterior >= 500) {
    anterior = tiempoActual;
    while (Serial.available()) {
      mySerial.write(Serial.read()); // reenvía lo que ha recibido el puerto del software serial
    }
    while (mySerial.available()) {
      Serial.write(mySerial.read()); // reenvía el software serial recibido al puerto serial
    }
  }
}

PD: Debido a que el modulo sim800l ya se encuentra soldado a mi placa personalizada junto con un atmega328p no me es posible observar el monitor en serie :frowning: solamente modificar el código.

``

Adjunta el código de acuerdo a las Normas del Foro en Español, punto 7.
También usa la opción "Autoformato" del menú "Herramientas" de la IDE antes de copiar el código así nos facilitas su lectura.

Saludos

Buenas, gracias por responder recién acabo de salir el sol por aquí :smiley: .

``` 
int pin8 = 8;
int sensor = A0;
int valorSensor = 0;
const int buzzer = 5;
const int buttonPin = 7;
int buttonState = 0;
int gas = 0;

unsigned int actual = 0;
unsigned int anterior = 0;

unsigned long previousMillis = 0;
int currentIntervalIndex = 0;
const int intervals[] = {200, 500}; // Intervalos de tiempo en milisegundos

// Variable para el estado del LED
int ledState = LOW;

#include <SoftwareSerial.h>
//Crea el objeto software serial para comunicarse con la SIM800L
SoftwareSerial mySerial(3, 2); // Los pines de la SIM800L Tx & Rx se conectaran a los pines de Arduino #3 & #2

unsigned long tiempoInicioLlamada = 0; // Variable para el temporizador de llamada
bool llamadaActiva = false; // Estado de la llamada
bool llamadaRealizada = false;
bool mensajeEnviado = false;

void setup() {
  //comienza la comunicación serial con Arduino y Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Comienza la comunicacion serial con Arduino y SIM800L
  mySerial.begin(9600);

  Serial.println("Initializing..."); 
  actual = millis();
  anterior = actual;

  pinMode(buzzer, OUTPUT);
  pinMode(pin8, OUTPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(pin8, HIGH);

 
}

void loop() {
  gas = digitalRead(pin8);
  buttonState = digitalRead(buttonPin);
  valorSensor = analogRead(sensor);

  // Si el valor del sensor supera un umbral y no hay una llamada activa, activa la llamada
  if (valorSensor > 130 && !llamadaActiva && !llamadaRealizada) {
    digitalWrite(pin8, LOW);
    llamadaActiva = true; // Marca que la llamada está activa
    tiempoInicioLlamada = millis(); // Inicializa el temporizador de llamada
    mySerial.println("ATD+ +59177167799;"); // Cambia ZZ con el código del país y xxxxxxxxxxx con el número de dígitos del teléfono
    updateSerial();
  }

  // Controla la duración de la llamada (20 segundos)
  if (llamadaActiva && (millis() - tiempoInicioLlamada >= 15000)) {
    llamadaActiva = false; // Marca que la llamada ya no está activa
    mySerial.println("ATH"); // Cuelga
    updateSerial();
    llamadaRealizada = true;    
    limpiarBufferSerial();    
  }

  if (llamadaRealizada && !mensajeEnviado) {
    limpiarBufferSerial();
    Serial.begin(9600);
  
    //comienza la comunicacion serial con Arduino y SIM800L
    mySerial.begin(9600);

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

    mySerial.println("AT"); //una vez que las pruebas están hechas exitosamente, regresará un OK
    updateSerial();
    
    mySerial.println("AT+CMGF=1"); // Configurando modo texto
    updateSerial();
    mySerial.println("AT+CMGS=\"+59177167799\"");//cambia ZZ  código del país y xxxxxxxxxxx con el número de teléfono a sms
    updateSerial();
    mySerial.print("alerta, gas detectado"); //contenido del texto
    updateSerial();
    mySerial.write(26);
    mensajeEnviado = true;
  }

  if (gas == LOW) {
      // Obtener el tiempo actual
  unsigned long currentMillis = millis();

  // Verificar si ha pasado el tiempo del intervalo actual
  if (currentMillis - previousMillis >= intervals[currentIntervalIndex]) {
    // Guardar el tiempo actual como referencia para el siguiente intervalo
    previousMillis = currentMillis;

    // Cambiar el estado del LED
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // Aplicar el estado al LED
    digitalWrite(buzzer, ledState);

    // Avanzar al siguiente intervalo (cíclico)
    currentIntervalIndex = (currentIntervalIndex + 1) % (sizeof(intervals) / sizeof(intervals[0]));
  }
  
}

  if ((valorSensor < 130) && (buttonState == HIGH)) {
    digitalWrite(pin8, HIGH);
    llamadaRealizada = false; // Cualquier botón presionado cuelga la llamada
    digitalWrite(buzzer, LOW);
    mensajeEnviado = false;

  }
}

void limpiarBufferSerial() {
  while (Serial.available() > 0) {
    char c = Serial.read();
  }
}

void updateSerial() {
  unsigned long tiempoActual = millis();
  if (tiempoActual - anterior >= 500) {
    anterior = tiempoActual;
    while (Serial.available()) {
      mySerial.write(Serial.read()); // reenvía lo que ha recibido el puerto del software serial
    }
    while (mySerial.available()) {
      Serial.write(mySerial.read()); // reenvía el software serial recibido al puerto serial
    }
  }
}
```

No subi el codigo debido a que segun mi criterio me parecio un poco grande, si hay alguna otra observacion quedo pendiente.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.