[SOLUCIONADO] ALARMA INCENDIOS CONFIGURACIÓN

Hola, primero de todo me gustaría indicar que soy nuevo en esto de programar.
He realizado una alarma antiincendios con el LM35, un LED rojo y un piezo.
El programa funciona como debería funcionar segun lo que he programado, pero yo sólo quiero que en el momento en que el LM35 lea que la temperatura és de 20 grados por ejemplo, pite durante cinco segundos, y una vez esto ya ha sucedido una sola vez, se pare todo .
Aquí os dejo el programa:

const int sensorLM35 = A0;
int buzzer=11;
int ledRed2= 9;


void setup() {
  Serial.begin(9600);
  pinMode (ledRed2, OUTPUT);
  digitalWrite(ledRed2, LOW);
  

}

void loop() {
  int sensorVal= analogRead(sensorLM35);
  Serial.print("LM35 value");
  Serial.print(sensorVal);
  float voltage= (sensorVal/1024.0)* 5.0;
  Serial.print(", Volts: ");
  Serial.print (voltage);
  Serial.print (" , degrees C: ");
  float temperaturee = (voltage - .5)* 100;
  Serial.println(temperaturee);

  if(temperaturee > 20.0 ){
    digitalWrite(ledRed2, HIGH);
    tone(buzzer, 600);
    delay(500);
    noTone(buzzer);
    digitalWrite(ledRed2, LOW);
    
  }else if (temperaturee <= 20.0){
    digitalWrite(ledRed2, LOW);
    noTone(buzzer);
  }

}

Hola Victor-Student.

No he entendido bien que problema tienes. Tampoco entiendo que quieres decir con que "... se pare todo."

Como primera medida podrias poner tu sketch completo con el setup(), el loop() y demás.

Comenta con claridad el problema. Gracias

El código lo acabo de copia bien con los voids y eso. A lo que me refiero es a que yo solo quiero que el LM35 me detecte una sola vez que se sobrepasa la temperatura, pite cinco segundos, y que en ese momento el piezo y el led se desactiven permanentemente indistintamente de la temperatura que marque a partir de ese momento.

Aca va el código. Espero que no hayas posteado varias veces porque yo respondí y ahora me encuentro con otro hilo o me lo parece.

// global
bool EstadoEstadoSirena = false;
bool cargomillis = false;
unsigned long tAlarma;

void loop() {

  int sensorVal = analogRead(sensorLM35);
  Serial.print("LM35 value");
  Serial.print(sensorVal);
  
  float voltage= (sensorVal/1023.0)* 5.0;
  Serial.print(", Volts: ");
  Serial.print (voltage);
  Serial.print (" , degrees C: ");
  float temperaturee = (voltage - 0.5)* 100;
  Serial.println(temperaturee);

  if (temperaturee > 20.0 ) {
      suenaTiempo(5000);  
  }
  else if (temperaturee <= 20.0) {
             digitalWrite(ledRed2, LOW);
             noTone(buzzer);
             cargomillis   = false; // preparo para proximo ciclo de sirena
             EstadoSirena  = false;
        }
}

void suenaTiempo(unsigned int tiempo) {
  if (!cargomillis) {
      tAlarma = millis()+ tiempo;
      cargomillis = true;
      EstadoSirena = false;
  }
  unsigned long currentmillis = millis();
  if (!EstadoSirena & currentmillis < tAlarma) { // se ejecuta el tiempo elegido
      digitalWrite(ledRed2, HIGH);
      tone(buzzer, 600);
      delay(500); // por simplicidad lo dejo pero no debería estar
      noTone(buzzer);
      digitalWrite(ledRed2, LOW);
  }
  else
      EstadoSirena = true;

}

Muchas gracias por tu ayuda, pero a la hora de compilar me da un error

Te da error porque te faltará alguan variable. Define la variable que falte. yo te indique bien que hacer. A mi sugerencia le debes agregar tus globales y tu setup.

Ahora funciona pero no como queria. Puede que no me haya expresado bien, pero lo que quiero es durante todo el tiempo que se haya estado ejecutando el programa pite una sola vez durante cinco segundos y ya está, sin más. EJEMPLO: habitación a 16 grados, sube a 20 pita 5 segundos i el LEDrojo también, y aunque siga estando a 20 grados se desactiva la alarma y el LED rojo.

const int sensorLM35 = A0;
int buzzer=11;
int ledRed2= 9;
bool EstadoSirena = false;
bool cargomillis = false;
unsigned long tAlarma;


void setup() {
  Serial.begin(9600);
  pinMode (ledRed2, OUTPUT);
  digitalWrite(ledRed2, LOW);
  

}

void loop() {
 

  int sensorVal = analogRead(sensorLM35);
  Serial.print("LM35 value");
  Serial.print(sensorVal);
  
  float voltage= (sensorVal/1023.0)* 5.0;
  Serial.print(", Volts: ");
  Serial.print (voltage);
  Serial.print (" , degrees C: ");
  float temperaturee = (voltage - 0.5)* 100;
  Serial.println(temperaturee);

  if (temperaturee > 20.0 ) {
      suenaTiempo(5000);  
  }
  else if (temperaturee <= 20.0) {
             digitalWrite(ledRed2, LOW);
             noTone(buzzer);
             cargomillis   = false; // preparo para proximo ciclo de sirena
             EstadoSirena  = false;
        }
}

void suenaTiempo(unsigned int tiempo) {
  if (!cargomillis) {
      tAlarma = millis()+ tiempo;
      cargomillis = true;
      EstadoSirena = false;
  }
  unsigned long currentmillis = millis();
  if (!EstadoSirena & currentmillis < tAlarma) { // se ejecuta el tiempo elegido
      digitalWrite(ledRed2, HIGH);
      tone(buzzer, 600);
      delay(500); // por simplicidad lo dejo pero no debería estar
      noTone(buzzer);
      digitalWrite(ledRed2, LOW);
  }
  else
      EstadoSirena = true;

}

Dejame ver en que me he equivocado.

¿ Que tal un semaforo no rearmable ?

const int sensorLM35 = A0;
int buzzer=11;
int ledRed2= 9;


void setup()
{
  Serial.begin(9600);
  pinMode (ledRed2, OUTPUT);
  digitalWrite(ledRed2, LOW);
  bool unavez=true;
}

void loop()
{
  int sensorVal= analogRead(sensorLM35);
  Serial.print("LM35 value");
  Serial.print(sensorVal);
  float voltage= (sensorVal/1024.0)* 5.0;
  Serial.print(", Volts: ");
  Serial.print (voltage);
  Serial.print (" , degrees C: ");
  float temperaturee = (voltage - .5)* 100;
  Serial.println(temperaturee);

  if((temperaturee > 20.0 ) && unavez)
  {
    digitalWrite(ledRed2, HIGH);
    tone(buzzer, 600);
    delay(500);
    noTone(buzzer);
    digitalWrite(ledRed2, LOW);
    unavez=false;
  }
}

Es extremadamente simple (suponiendo que haya entendido bien lo que quieres).

Da varios errores cuando se compila, haber si averiguras porqué y así podré probarlo. Hace buena pinta

Que dice exactamente ?

Alfaville: ¿ Que tal un semaforo no rearmable ?

const int sensorLM35 = A0;
int buzzer=11;
int ledRed2= 9;

void setup() {   Serial.begin(9600);   pinMode (ledRed2, OUTPUT);   digitalWrite(ledRed2, LOW);   bool unavez=true; }

void loop() {   int sensorVal= analogRead(sensorLM35);   Serial.print("LM35 value");   Serial.print(sensorVal);   float voltage= (sensorVal/1024.0)* 5.0;   Serial.print(", Volts: ");   Serial.print (voltage);   Serial.print (" , degrees C: ");   float temperaturee = (voltage - .5)* 100;   Serial.println(temperaturee);

  if((temperaturee > 20.0 ) && unavez)   {     digitalWrite(ledRed2, HIGH);     tone(buzzer, 600);     delay(500);     noTone(buzzer);     digitalWrite(ledRed2, LOW);     unavez=false;   } }




Es extremadamente simple (suponiendo que haya entendido bien lo que quieres).

Solo una pequeña correccion, la variable unavez solo se podria usar en el setup() y seguramente de error al compilar,habria que definirla antes del loop y setup ,con las demas.

Si que da error si. Alguien sabe cómo arreglarlo??

Victor_Student: Si que da error si. Alguien sabe cómo arreglarlo??

saca esto del setup() :

bool unavez=true;

y ponlo antes del setup().

¡¡ Que agobio con la limitacion de los 5 minutos.. !! No me ha dejado postear hasta ahora. Sigamos

Mas que error es un descuido, prueba ahora

const int sensorLM35 = A0;
int buzzer=11;
int ledRed2= 9;
boolean unavez = true;


void setup()
{
  Serial.begin(9600);
  pinMode (ledRed2, OUTPUT);
  digitalWrite(ledRed2, LOW);
}

void loop()
{
  int sensorVal= analogRead(sensorLM35);
  Serial.print("LM35 value");
  Serial.print(sensorVal);
  float voltage= (sensorVal/1024.0)* 5.0;
  Serial.print(", Volts: ");
  Serial.print (voltage);
  Serial.print (" , degrees C: ");
  float temperaturee = (voltage - .5)* 100;
  Serial.println(temperaturee);

  if((temperaturee > 20.0 ) && unavez)
  {
    digitalWrite(ledRed2, HIGH);
    tone(buzzer, 600);
    delay(500);
    noTone(buzzer);
    digitalWrite(ledRed2, LOW);
    unavez = false;
  }
}

Vale, ya está solucionado, funciona perfectamente. Muchas gracias a todos los que me habéis ayudado, tanto Surbey, como Alfaville y jose.

Pero tu habias pedido 5 segundos que funcionara no 500mseg? No entiendo tu solución

Si, he cogido el código del compañero Alfaville y he cambiado el delay de 500 a 5000 y ya está. Ahora va como queria.

Vaya hombre que debes aprender a explicarte mejor. Yo pense que ese ciclo que tenias de 500mseg debía repetirse durante 5 seg