Hola saludos

hola soy de cuba y estoy haciendo una programación con arduino uno y ya la tengo casi lista pero me falta un solo detalle es que me repite el envió de mensajes ´

te pongo el código de bajo a ver si me puedes ayudar solo quiero que elin 10 me diga cuando hay electricidad o no y me envie un sms al movil, lo hace pero de forma repetida

#include <call.h>
#include <GSM.h>
#include <HWSerial.h>
#include <SIM900.h>
#include <sms.h>
#include <Streaming.h>
#include <SoftwareSerial.h>
SoftwareSerial GSM(7,8);
char numero_cell="+5352611198";//Numero de telefono al que vas a enviar los mensajes de confirmacion
int pulsador =9;
int led =11;
int led2 =12;
int estado;
boolean valor=true;
int i=0;
int j=0;
char DAT;
char DAT_dos;
boolean condicion=true;
char datosSERIAL[10];
//char clave_uno= “INVON”; //OTRA FORMA DE USAR UN ARREGLO
char clave_uno={‘I’,‘N’,‘V’,‘O’,‘N’};//AQUI CAMBIAMOS TODO EL MENSAJE DE CONTROL
char clave_dos={‘I’,‘N’,‘V’,‘O’,‘F’};//AQUI CAMBIAMOS TODO EL MENSAJE DE CONTROL
char clave_uno1={‘C’,‘O’,‘N’,‘O’,‘N’};//AQUI CAMBIAMOS TODO EL MENSAJE DE CONTROL
char clave_dos1={‘C’,‘O’,‘N’,‘O’,‘F’};//AQUI CAMBIAMOS TODO EL MENSAJE DE CONTROL
void setup()
{
pinMode(pulsador,INPUT);
pinMode(led,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(10,INPUT);
pinMode(13,OUTPUT);
Serial.begin(9600);
GSM.begin(9600);
digitalWrite(9, HIGH); // Activar la alimentación de la tarjeta SIM900 por Software
delay(5000);
configuracion_inicial();
Serial.println(“Sistema Controlador del Inversor Encendida Modulo SIM900”);
delay(1000);

}
/////////////////////////
void loop()
{
Serial.println(“Esperando recibir mensaje…”);
while (true)
{
estado2();
}
while (true)
{
leer_mensaje();
}
}

///////////////////////

///////////////////////////////////
void estado2()
{
int reading = digitalRead(estado);
estado = digitalRead(10);

if (estado ==HIGH)
{
mensaje_elecon();
Serial.print("\n");
}
if (estado==LOW)
{
mensaje_elecof();
Serial.print("\n");
}
}
/////////////////////////////////////

///////////////////////

void configuracion_inicial()//configura los codigos de lectura de mensajes
{
GSM.println(“AT+IPR=9600”);//modo texto
Serial.println(“AT+IPR=9600”);//modo texto
delay(300);
GSM.println(“AT+CMGF=1”);//modo texto
Serial.println(“AT+CMGF=1”);//modo texto
delay(300);
GSM.println(“AT+CMGR=?”);//ACTIVAMOS CODIGO PARA RECIBIR MENSAJES
Serial.println(“AT+CMGR=?”);//ACTIVAMOS CODIGO PARA RECIBIR MENSAJES
delay(300);
GSM.println(“AT+CNMI=2,2,0,0”);//ACTIVAMOS PARA VER MENSAJES
Serial.println(“AT+CNMI=2,2,0,0”);//ACTIVAMOS PARA VER MENSAJES
//GSM.println(“AT+CNMI=3,3,0,0”);//ACTIVAMOS PARA VER MENSAJES
//Serial.println(“AT+CNMI=3,3,0,0”);//ACTIVAMOS PARA VER MENSAJES
delay(300);
Serial.println(“configuracion terminada”);
delay(300);
}
///////////////////////////////////////////// ENVIO DE MENSAJES
void mensaje_elecof()
{
GSM.println(“AT+CMGF=1”);//modo texto
//Imprime los datos al puerto serie como texto ASCII seguido de un retorno de carro
delay(2000);
GSM.print(“AT+CMGS=”);// comando de envio de mensaje
//Imprime los datos al puerto serie como texto ASCII
GSM.print((char)34);//ponemos las comillas ", para que lo tome debe ser char de lo contrario el serial envia caracter por caracter
GSM.print(numero_cell);//colocamos numero de telefono
GSM.println((char)34);//volvemos a poner el caracter "
delay(200);//tiempo para que de respuesta el modulo >
GSM.print(“SE FUE LA ELECTRICIDAD”);//mensaje que enviare
GSM.print((char)26);//ponemos el simbolo ascii 26,que corresponde a CTRL+Z,con lo que el modulo sabe que el sms termino
Serial.print(“SE FUE LA ELECTRICIDAD”);//mensaje que enviare
}
/////////////////////////////
void mensaje_elecon()
{
GSM.println(“AT+CMGF=1”);//modo texto
//Imprime los datos al puerto serie como texto ASCII seguido de un retorno de carro
delay(2000);
GSM.print(“AT+CMGS=”);// comando de envio de mensaje
//Imprime los datos al puerto serie como texto ASCII
GSM.print((char)34);//ponemos las comillas ", para que lo tome debe ser char de lo contrario el serial envia caracter por caracter
GSM.print(numero_cell);//colocamos numero de telefono
GSM.println((char)34);//volvemos a poner el caracter "
delay(200);//tiempo para que de respuesta el modulo >
GSM.print(“HAY ELECTRICIDAD”);//mensaje que enviare
GSM.print((char)26);//ponemos el simbolo ascii 26,que corresponde a CTRL+Z,con lo que el modulo sabe que el sms termino
Serial.print(“HAY ELECTRICIDAD”);//mensaje que enviare
}
/////////////////////////////

while (true) 
{ 
   state2 (); 
}

The condition for this while loop will always be true so the program will stay in the loop and the code outside of it will never be executed. Is that what you want the program to do ?

no lo que quiero es que me detecte cuando hay un cambio de estado y me mande un mensaje informandolo

I feel that the the language barrier between us is going to make providing help difficult because I do not understand your post when it is auto-translated

Is it OK for the program never to leave this while loop ?

while (true) 
{ 
   state2 (); 
}

THE LANGUAGE IS NOT A PROBLEM.

WHAT I WANT IS THAT THE PROGRAM ALLOWS ME AUTOMATICALLY WHEN THE PIN 10 CHANGES STATE AND DON'T MAKE IT CONSTANT MIND

MODERADOR: Edita usando ESPAÑOL!! NO hablamos ni respondemos en inglés a nadie en este foro como no se hace en espaÑol en el foro en inglés

I am sorry, but your latest post proves my point about the language difficulty because I can make no sense of

WHAT I WANT IS THAT THE PROGRAM ALLOWS ME AUTOMATICALLY WHEN THE PIN 10 CHANGES STATE AND DON'T MAKE IT CONSTANT MIND

I feel that I can be of no further help but you may get more help now that the thread has been moved to the Spanish section of the forum

Good luck with your project

Prueba a sustituir toda tu función estado2() por esta versión de la función:

///////////////////////////////////
void estado2()
{
  int reading = digitalRead(10);
  if (estado != reading) {
    estado = reading;
    if (estado == HIGH)
    {
       mensaje_elecon();
       Serial.print("\n");
    }
    if (estado == LOW)
    {
      mensaje_elecof();
      Serial.print("\n");
    }
  }
}
/////////////////////////////////////

Nota: es importante que sustituyas todas las líneas que he puesto, ya que el cierre de las llaves es diferente a lo que tienes tú.

Ya me funciono a la perfección Gracias hermano, aqui estoy para lo que te haga falta de verdad gracias

En este foro se usa idioma Español salvo para mostrar especificaciones de hojas de datos o códigos copias/pegados, pero cuando respondemos lo hacemos en el idioma del foro, unicamente. Jamas en Inglés, francés, portuguez o lo que sea que una persona escriba para intentar ayudar equivocadamente porque desconoce las normas del foro que no es ESTE sino todo el foro. Si alguien les escribe en inglés solo será al comienzo del hilo y porque Uds se han equivocado de Foro y fueron movidos, de lo contrario si no hay errores, el error lo comete el PERDIDO o LOST como ellos llaman a todo aquel latino que escribe en el foro en otro idioma. No busco ni tengo resentimiento alguno con nadie, pero solo aplico lo que otros aplican. Mismas reglas para todos los foreros del foro Arduino.cc sean del idioma que sean. Sin mas a los intervinientes en particular @guillealberdifdz editar su respuesta.