Saludos a todos los miembros del grupo.
Estoy incursionando en este mundo de la progrmacion de arduino, estoy trabajando en un proyecto el cual es que nesesito ejecutar una parte de codigo cuando solo le envie o le accione mas no no, el proyecto es un sistema de sensor de temperatura el cual quiero que me de lectura cuando se lo pida y me envie una alerta cuando supere el limite de temperatura accionado, lo de enviarme en forma de un sms al celular al momento de sucitarse un exedente de temperatura lo hace, la otra cuestion de cuando se le pido la temperatura tambien pero tengo un problema, el cual es que se queda en el bucle de enviarme a cada momento, pero no se como poder hacer que solo me envie ese dato una ves cada ves que se lo pida mi codigo esta de esta manera
char incomingChar;
String message = "";
String Numero ="+123456789";
String transformar_temp;
#include "DHT.h"
#define DHTPIN 46
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
String Alerta;
String Temperatura_Actual;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(115200); // Comunicación con el ordenador
Serial1.begin(115200); // Comunicación con el módulo GSM
// Configura el módulo GSM
dht.begin();
//Serial.println("Módulo GSM configurado.");
}
void loop() {
float Temperatura = dht.readTemperature();
delay(1000);
Serial.println(Temperatura);
if (Serial1.available()) {
incomingChar = Serial1.read();
message += incomingChar;
if (incomingChar == '\n')
Serial.print("Mensaje: ");
Serial.print(message);
if (message.indexOf("TEMPERATURA") >= 0)
// digitalWrite(ledPin, HIGH);
//Serial.println(" - LED ENCENDIDO");
// delay(1000);
String transformar_temp = String(Temperatura, 2); // Se encarga de tranformar los valores del sensor de temperatura en un valor string para poder ser enviados.
String Temperatura_Actual = "Temperatura actual... "+transformar_temp;
while (Serial1.available()) { Serial.write(Serial1.read());
}
// FUNCION ENCARGADA DE ACCIONAR EL FORMATO DE ENVIO DEL MENSAJE SI LA ALERTA SE PRESENTA
enviarSMS(Numero,Temperatura_Actual);
if (Serial.available()) {
Serial1.write(Serial.read());
}
if (Serial1.available()) {
Serial.write(Serial1.read());
}
}
// Verifica el mensaje y enciende o apaga el LED
if(Temperatura >= 27.00){
String transformar_temp = String(Temperatura, 2); // Se encarga de tranformar los valores del sensor de temperatura en un valor string para poder ser enviados.
String Alerta = "Alerta Insendio...Temperatura demasiado alta "+transformar_temp;
while (Serial1.available()) { Serial.write(Serial1.read());
}
// FUNCION ENCARGADA DE ACCIONAR EL FORMATO DE ENVIO DEL MENSAJE SI LA ALERTA SE PRESENTA
enviarSMS(Numero,Alerta);
if (Serial.available()) {
Serial1.write(Serial.read());
}
if (Serial1.available()) {
Serial.write(Serial1.read());
}
}
}
void enviarSMS(String numero, String mensaje) {
Serial1.println("AT+CMGF=1"); // Configura el módulo A9G para el modo texto
// Serial1.println("AT");
// delay(100);
// Serial1.println("AT+CMGF=1"); // Configura en modo texto
// delay(100);
Serial1.println("AT+CNMI=1,2,0,0,0"); // Configura para mostrar mensajes automáticamente
delay(100);
//delay(1000);
while (Serial1.available()) {
Serial.write(Serial1.read());
}
Serial1.print("AT+CMGS=\"");
Serial1.print(numero);
Serial1.println("\"");
delay(1000);
while (Serial1.available()) {
Serial.write(Serial1.read());
}
Serial1.print(mensaje);
delay(1000);
Serial1.write(26); // Enviar Ctrl+Z para indicar el final del mensaje
delay(1000); // Espera 5 segundos para que se envíe el mensaje
while (Serial1.available()) {
Serial.write(Serial1.read());
}
}
`
No eres claro, que es lo que repite? esto
if (Temperatura >= 27.00) {
String transformar_temp = String(Temperatura, 2); // Se encarga de tranformar los valores del sensor de temperatura en un valor string para poder ser enviados.
String Alerta = "Alerta Insendio...Temperatura demasiado alta " + transformar_temp;
while (Serial1.available()) {
Serial.write(Serial1.read());
}
// FUNCION ENCARGADA DE ACCIONAR EL FORMATO DE ENVIO DEL MENSAJE SI LA ALERTA SE PRESENTA
enviarSMS(Numero, Alerta);
if (Serial.available()) {
Serial1.write(Serial.read());
}
if (Serial1.available()) {
Serial.write(Serial1.read());
}
}
Si este fuera el caso usa un flag, o sea una bandera o variable booleana que tienes en false.
Se da la situación de superar 27 pues la activas, envias el SMS.
entonces hasta que no baje de 27, no reactivas ese flag y no te va a enviar de nuevo.
Eso tiene el inconveniente que un 26.9 te la activa y si en la siguiente lectura tienes 27.1 otra vez enviará. Para ello se usa la histéresis y te pones mas firme y reactivas digamos a 26.0
Se comprende?
saludos y gracias por responder, de echo esa parte de la funcion de exedente de maximo de temperatura no se repite, la que se repite es esta parte de codigo, en la cual le pido que solo me envie una ves o cuando y unicamente le emvie el mensaje desde mi celular al modulo, pero al momento de enviar el mensaje me empieza a enviar repetidamente varias veces lo cual no deseeo que pase eso.
if (Serial1.available()) {
incomingChar = Serial1.read();
message += incomingChar;
if (incomingChar == '\n')
Serial.print("Mensaje: ");
Serial.print(message);
if (message.indexOf("TEMPERATURA") >= 0)
String transformar_temp = String(Temperatura, 2); // Se encarga de tranformar los valores del sensor de temperatura en un valor string para poder ser enviados.
String Temperatura_Actual = "Temperatura actual... "+transformar_temp;
while (Serial1.available()) { Serial.write(Serial1.read());
}
// FUNCION ENCARGADA DE ACCIONAR EL FORMATO DE ENVIO DEL MENSAJE SI LA ALERTA SE PRESENTA
enviarSMS(Numero,Temperatura_Actual);
if (Serial.available()) {
Serial1.write(Serial.read());
}
if (Serial1.available()) {
Serial.write(Serial1.read());
}
}
esta parte de codigo es la encargada de recibir el mensaje y que le envie los datos del sensor, entonces nose como podria hacerle para que unicamente me envie solo una ves, nose si me podrias ayudar con un ejemplo, de ante mano muchas gracias por tu ayuda
saludos
Estás de acuerdo en que este if solamente controla la primera instrucción?
Lo mismo pasa aquí:
Probablemente quieres controlar un bloque de instrucciones, y estás olvidando poner "{}" para delimitar el bloque
saludos, correcto quiero controlar este congunto de funciones para la peticion de datos: entonces le puces como apertura principal desde la parte inicial y en la parte final de la seccion le cerre.
if (Serial1.available()) {
incomingChar = Serial1.read();
message += incomingChar;
// demas seccion de la funcion
}/// y sierre del conjunto de funciones
Bueno inicialmente le coloque las llaves en la parte inicial del if y la cerre en la parte final despues que se acctiva el envio del mensaje, pense que de esa forma estaria correcto
Entonces le añado tambien las llaves en estas demas secciones de cada if ?
Debes encerrar entre llaves después del if todas las instrucciones que quieras controlar. Lo que queda dentro del par de llaves es un bloque de instrucciones, y se ejecutan todas o ninguna según la condición del if. Es decir, se ejecutan en bloque. Secuencialmente, por supuesto.
Dentro de un bloque puede haber otra instrucción if con su respectivo bloque. Este seria un if "anidado".
entonces le pongo de esta manera,
if (Serial1.available()) {
incomingChar = Serial1.read();
message += incomingChar;
}
if (incomingChar == '\n'){
Serial.print("Mensaje: ");
Serial.print(message);
}
//switch(message){
if (message.indexOf("TEMPERATURA")>=0){
String transformar_temp = String(Temperatura, 2); // Se encarga de tranformar los valores del sensor de temperatura en un valor string para poder ser enviados.
String Temperatura_Actual = "Temperatura actual... "+transformar_temp;
// while (Serial1.available()) { Serial.write(Serial1.read());
// }
// FUNCION ENCARGADA DE ACCIONAR EL FORMATO DE ENVIO DEL MENSAJE SI LA ALERTA SE PRESENTA
enviardato(Numero,Temperatura_Actual);
if (Serial.available()) {
Serial1.write(Serial.read());
}
if (Serial1.available()) {
Serial.write(Serial1.read());
}
}
Usa ctrl-T para alinear el código y tengas así una mejor idea de los bloques de instrucciones que controla cada if
pero aun tengo el inconveniente inicial que es que cuando le envio el mensaje de peticion este me responde varias veces y solo quiero que me envie el dato unicamente laq ves que le envie el mensaje nose como podria hacer ahi
Eso es porque esta instrucción se ejecuta constantemente, y si la temperatura sigue arriba de 27º va a seguir enviando el mensaje.
Pon una bandera (flag) que indica que se debe enviarse la alerta la próxima vez que la Temperatura suba del límite. Una vez que la alerta ha sido enviada sube la bandera de modo que no se siga reenviando el SMS. Baja la bandera cuando la temperatura baje o cuando recibas el texto.
bool enviarAlerta;
...
if (Temperatura <27) {
enviarAlerta = true; // enviar alerta la siguiente vez que la temperatura exceda el limite
} else {
//enviar alerta
...
enviarAlerta = false; // impide que la alerta se reenvie hasta que la temperatura baje
}
if (message.indexOf("TEMPERATURA")>=0){
enviarAlerta=true;
...
}
La solución te la habia dado antes pero evidentemente estas algo perdido en la programación y no terminas de ver como usar simples herramientas que ayudan a controlar las cosas.
El flag debe disparar el envio pero luego ese flag debe restaurarse cuando te asegures que la situación no se repita.
Tal como te dije en el post #2.
Muchas Gracias por tu ayuda
saludos