Casa domotica y sensor pir

Buenas, soy nuevo en este foro, nose si lo que voy a publicar va en esta sección pero necesito una ayuda para terminar la programación de mi proyecto. La programación del sensor pir me anda bien si lo coloco afuera de la programación de la casa domotica, pero cuando lo pongo dentro deja de andar, osea, cuando pongo el comando desde el celular para que se active la alarma (sensor pir) anda el primer segundo y después deja de andar, alguno me puede dar una mano. me falta eso y ya termino es para hacer una exposición

#include <LiquidCrystal_I2C.h>
#include <Servo.h>

Servo servo;

LiquidCrystal_I2C lcd(0x3F,16,2);

String mensaje;
const int led1 = 3;
const int led2 = 4;
const int led3 = 5;
const int led4 = 6;
const int led5 = 11;
const int buzz = 10;
const int PIRPin= 2;

void setup() {
  Serial.begin(9600);
  servo.attach(9);
  lcd.backlight();
  lcd.init();
  lcd.clear();
  lcd.print("Bienvenidos");
  delay (2000); 
  delay(1000);
  pinMode(buzz,OUTPUT);
  servo.write(0);
  for(int i=3; i<=6;i++){
  pinMode(i, OUTPUT);}
  pinMode(PIRPin, INPUT);
  pinMode(led5,OUTPUT);
}

void loop() {

while(Serial.available()){ 
  delay(10);
  char c = Serial.read();
  mensaje += c;
}
delay(50);
if (mensaje.length()>0){
  if(mensaje=="*Prender luz pieza1"){
        lcd.clear();
        lcd.print("LUZ PIEZA 1");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led1,HIGH);
  }
  else if (mensaje=="*Apagar luz pieza1"){
    lcd.clear();
        lcd.print("LUZ PIEZA 1");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led1,LOW);
  }
    else if(mensaje=="*Prender luz pasillo"){
        lcd.clear();
        lcd.print("LUZ PASILLO");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led2,HIGH);
  }
  else if (mensaje=="*Apagar luz pasillo"){
    lcd.clear();
        lcd.print("LUZ PASILLO");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led2,LOW);
  }
      else if(mensaje=="*Prender luz comedor"){
        lcd.clear();
        lcd.print("LUZ COMEDOR");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led3,HIGH);
  }
  else if (mensaje=="*Apagar luz comedor"){
    lcd.clear();
        lcd.print("LUZ COMEDOR");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led3,LOW);
  }
      else if(mensaje=="*Prender luz cocina"){
        lcd.clear();
        lcd.print("LUZ COCINA");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led4,HIGH);
  }
  else if (mensaje=="*Apagar luz cocina"){
    lcd.clear();
        lcd.print("LUZ COCINA");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led4,LOW);
  }
    else if (mensaje=="*Abrir puerta"){
      lcd.clear();
        lcd.print("PUERTA");
        lcd.setCursor(0,1);
        lcd.print("ABIERTA");      
    servo.write(90);
  }
      else if (mensaje=="*Cerrar puerta"){
        lcd.clear();
        lcd.print("PUERTA");
        lcd.setCursor(0,1);
        lcd.print("CERRADA");       
    servo.write(0);
  }
      else if (mensaje=="*Me voy"){
      lcd.clear();
      lcd.print("HASTA LUEGO");
      lcd.setCursor(0,1);
      lcd.print("ALARMA ENCENDIDA");
      servo.write(0);
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      alarmaON();
      }
   mensaje="";     
  }
}

void alarmaON(){
  int value= digitalRead(PIRPin);
      if (value == HIGH){
        digitalWrite(led5, HIGH);
        delay(500);
        digitalWrite(led5, LOW);
        delay(500);
        }
      else{
        digitalWrite(led5, LOW);
        }
}

Hola,

Tu problema radica donde haces la llamada al método alarmaON(), solo es llamado una vez cuando recibe el mensaje “Me voy”, luego mensaje es igualado a cadena vacía “” por lo tanto if (mensaje=="*Me voy") no se vuelve a cumplir mas.
Si analizamos el método alarmaON(), observamos que si el PIRPin esta en nivel alto entonces enciende un led durante medio segundo y luego lo apaga ya no hace nada mas, recomendación si estas pendiente de recibir datos por el puerto serie quita los delay, mientras se ejecutan esos dos delays que tiene ese método, 1 segundo, tienes muchas posibilidades de estarás perdiendo todo lo que recibas por el puerto serie.
Yo lo haría así:

#include <LiquidCrystal_I2C.h>
#include <Servo.h>

Servo servo;

LiquidCrystal_I2C lcd(0x3F,16,2);

String mensaje;
const int led1 = 3;
const int led2 = 4;
const int led3 = 5;
const int led4 = 6;
const int led5 = 11;
const int buzz = 10;
const int PIRPin= 2;
bool alarmaactiva=false; // Inicializo flag de alarma activa en desactivado

void setup() {
  Serial.begin(9600);
  servo.attach(9);
  lcd.backlight();
  lcd.init();
  lcd.clear();
  lcd.print("Bienvenidos");
  delay (2000);
  delay(1000);
  pinMode(buzz,OUTPUT);
  servo.write(0);
  for(int i=3; i<=6;i++){
  pinMode(i, OUTPUT);}
  pinMode(PIRPin, INPUT);
  pinMode(led5,OUTPUT);
}

void loop() {

while(Serial.available()){
  delay(10);
  char c = Serial.read();
  mensaje += c;
}
delay(50);
if (mensaje.length()>0){
  if(mensaje=="*Prender luz pieza1"){
        lcd.clear();
        lcd.print("LUZ PIEZA 1");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led1,HIGH);
  }
  else if (mensaje=="*Apagar luz pieza1"){
    lcd.clear();
        lcd.print("LUZ PIEZA 1");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led1,LOW);
  }
    else if(mensaje=="*Prender luz pasillo"){
        lcd.clear();
        lcd.print("LUZ PASILLO");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led2,HIGH);
  }
  else if (mensaje=="*Apagar luz pasillo"){
    lcd.clear();
        lcd.print("LUZ PASILLO");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led2,LOW);
  }
      else if(mensaje=="*Prender luz comedor"){
        lcd.clear();
        lcd.print("LUZ COMEDOR");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led3,HIGH);
  }
  else if (mensaje=="*Apagar luz comedor"){
    lcd.clear();
        lcd.print("LUZ COMEDOR");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led3,LOW);
  }
      else if(mensaje=="*Prender luz cocina"){
        lcd.clear();
        lcd.print("LUZ COCINA");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led4,HIGH);
  }
  else if (mensaje=="*Apagar luz cocina"){
    lcd.clear();
        lcd.print("LUZ COCINA");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led4,LOW);
  }
    else if (mensaje=="*Abrir puerta"){
      lcd.clear();
        lcd.print("PUERTA");
        lcd.setCursor(0,1);
        lcd.print("ABIERTA");
        alarmaactiva=false; // Desactivo la alarma
    servo.write(90);
  }
      else if (mensaje=="*Cerrar puerta"){
        lcd.clear();
        lcd.print("PUERTA");
        lcd.setCursor(0,1);
        lcd.print("CERRADA");      
    servo.write(0);
  }
      else if (mensaje=="*Me voy"){
      lcd.clear();
      lcd.print("HASTA LUEGO");
      lcd.setCursor(0,1);
      lcd.print("ALARMA ENCENDIDA");
      servo.write(0);
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      alarmaactiva=true; // Activo la alrma
      }
   if (alarmaactiva==true) // Si se ha activado la alarma llamo al meto alarmaON()
      {
        alarmaON();
      }
   mensaje="";    
  }
}

Un saludo.

Gracias por la respuesta, pero sigo teniendo el mismo resultado, se activa ese medio segundo y después no hace mas nada, le puse un while para probar y ese me anda re bien, lo malo es que me empieza a titilar la pantalla.

¿ Puedes poner lo que tienes actualmente?

rodripelto:
¿ Puedes poner lo que tienes actualmente?

Eh copiado y pegado lo que usted me ha pasado, lo del while es algo que probe antes, el tema que con lo tuyo no me ha funcionado, cuando activo la alarma sólo suena ese medio segundo, yo creo que tiene que ver con el mensaje="";. Sino la última que me queda es cuando diga el comandó me voy apague el display y ya puedo ejecutar el white en la alarma, pero quiero tratar de lograr lo que quiero. Gracias por la ayudarme rodri

Hola,
Creo que ya he visto donde falla, es dificir con la indexación del codigo qe hace el IDE realmente no me guasta nada. El problema es que el if que yo puse para llamar al metodo alarmaon quedo dentro del if (mensaje.length()>0){, como pones justo antes de terminar ese if mensaje=""; en la siguiente buelta del loop si no ha recibido nada por el puerto serie la longitud de mensaje es 0 por lo que no entra en el if y ya no se ejecuta nada. Espero haberlo esplicado bien para que entiendas donde esta el error. El código quedaria de la siguiente manera.

#include <LiquidCrystal_I2C.h>
#include <Servo.h>

Servo servo;

LiquidCrystal_I2C lcd(0x3F,16,2);

String mensaje;
const int led1 = 3;
const int led2 = 4;
const int led3 = 5;
const int led4 = 6;
const int led5 = 11;
const int buzz = 10;
const int PIRPin= 2;
bool alarmaactiva=false; // Inicializo flag de alarma activa en desactivado

void setup() {
  Serial.begin(9600);
  servo.attach(9);
  lcd.backlight();
  lcd.init();
  lcd.clear();
  lcd.print("Bienvenidos");
  delay (2000);
  delay(1000);
  pinMode(buzz,OUTPUT);
  servo.write(0);
  for(int i=3; i<=6;i++){
  pinMode(i, OUTPUT);}
  pinMode(PIRPin, INPUT);
  pinMode(led5,OUTPUT);
}

void loop() {

while(Serial.available()){
  delay(10);
  char c = Serial.read();
  mensaje += c;
}
delay(50);
if (mensaje.length()>0){
  if(mensaje=="*Prender luz pieza1"){
        lcd.clear();
        lcd.print("LUZ PIEZA 1");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led1,HIGH);
  }
  else if (mensaje=="*Apagar luz pieza1"){
    lcd.clear();
        lcd.print("LUZ PIEZA 1");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led1,LOW);
  }
    else if(mensaje=="*Prender luz pasillo"){
        lcd.clear();
        lcd.print("LUZ PASILLO");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led2,HIGH);
  }
  else if (mensaje=="*Apagar luz pasillo"){
    lcd.clear();
        lcd.print("LUZ PASILLO");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led2,LOW);
  }
      else if(mensaje=="*Prender luz comedor"){
        lcd.clear();
        lcd.print("LUZ COMEDOR");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led3,HIGH);
  }
  else if (mensaje=="*Apagar luz comedor"){
    lcd.clear();
        lcd.print("LUZ COMEDOR");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led3,LOW);
  }
      else if(mensaje=="*Prender luz cocina"){
        lcd.clear();
        lcd.print("LUZ COCINA");
        lcd.setCursor(0,1);
        lcd.print("ENCENDIDO!");
    digitalWrite(led4,HIGH);
  }
  else if (mensaje=="*Apagar luz cocina"){
    lcd.clear();
        lcd.print("LUZ COCINA");
        lcd.setCursor(0,1);
        lcd.print("APAGADO!");
    digitalWrite (led4,LOW);
  }
    else if (mensaje=="*Abrir puerta"){
      lcd.clear();
        lcd.print("PUERTA");
        lcd.setCursor(0,1);
        lcd.print("ABIERTA");
        alarmaactiva=false; // Desactivo la alarma
    servo.write(90);
  }
      else if (mensaje=="*Cerrar puerta"){
        lcd.clear();
        lcd.print("PUERTA");
        lcd.setCursor(0,1);
        lcd.print("CERRADA");     
    servo.write(0);
  }
      else if (mensaje=="*Me voy"){
      lcd.clear();
      lcd.print("HASTA LUEGO");
      lcd.setCursor(0,1);
      lcd.print("ALARMA ENCENDIDA");
      servo.write(0);
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      alarmaactiva=true; // Activo la alrma
      }  
  }
   if (alarmaactiva==true) // Si se ha activado la alarma llamo al meto alarmaON()
      {
        alarmaON();
      }
   mensaje=""; 
}

Como apreciaras si analizas el código he sacado if (alarmaactiva==true) de dentro if (mensaje.length()>0) dejandolo directamente en el loop, creo que así funcionara.

Gracias amigo! me anduvo perfectamente. ahora estoy creando otro post en proyectos! si tienes una sugerencia dimela!