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 solamente modificar el código.
``