Alarma con arduino y conexión bluetooth para activar y desactivar la alarma.

Buenas!!! ahora que mi pequeña me ha dejado un rato, me he puesto a probar el código que me ha pasado @surbyte y veo que me sigue pasando lo mismo... el altavoz suena 3 o 4 segundos y luego se detiene hasta que algo vuelve a pasar por delante del PIR, en vez de sonar un minuto que es lo que necesito, el foco se enciende pero no se termina de apagar... también debería de durar lo mismo que el altavoz "un minuto" pero no se apaga....A parte de eso que sigo sin solucionar observo, mejor dicho, escucho que el altavoz tiene un ruido que algo se acopla antes de empezar a sonar... y el bluetooth funciona un rato y luego dejad de funcionar.... cada vez tengo más problemas, así que he decidido hacer un vídeo para que podáis verlo, poner el código completo y el esquema de montaje, a ver si así consigo solucionarlo con vuestra inestimable ayuda!

vídeo de youtube para que se vean todos los problemas

código usado:

#define INTERVALO 6*1000   // 60 segundos x 1000 milisegundos

int c[5] = {131, 262, 523, 1046, 2093}; // frecuencias 4 octavas de Do
int cs[5] = {139, 277, 554, 1108, 2217}; // Do#
int d[5] = {147, 294, 587, 1175, 2349}; // Re
int ds[5] = {156, 311, 622, 1244, 2489}; // Re#
int e[5] = {165, 330, 659, 1319, 2637}; // Mi
int f[5] = {175, 349, 698, 1397, 2794}; // Fa
int fs[5] = {185, 370, 740, 1480, 2960}; // Fa#
int g[5] = {196, 392, 784, 1568, 3136}; // Sol
int gs[5] = {208, 415, 831, 1661, 3322}; // Sol#
int a[5] = {220, 440, 880, 1760, 3520}; // La
int as[5] = {233, 466, 932, 1866, 3729}; // La#
int b[5] = {247, 494, 988, 1976, 3951}; // Si

void nota(int a, int b);            // declaración de la función auxiliar. Recibe dos números enteros.

int pirPin = 12;    //PIR sensor
int altavoz = 2;    //Altavoz pin
int ledPinrojo = 11;    //pin led rojo
int ledPinverde = 10;    //pin led verde
int cmd;           // declaración de variable INT llamada Data que recibe del bluetooth
bool flag = false; // boolean
int SSR = 9; // Pin al que está conectado el relé SSR para encender la luz
unsigned long start = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(altavoz, OUTPUT);
  pinMode(ledPinrojo, OUTPUT);
  pinMode(ledPinverde, OUTPUT);
  pinMode(SSR, OUTPUT);
  digitalWrite(ledPinrojo , LOW);
  digitalWrite(ledPinverde , HIGH);
  Serial.println("Encendiendo alarma");
}


void loop()
{
    
  if (Serial.available() > 0) {//Envía datos sólo cuando se recibe un dato
      cmd = Serial.read();      //Lee el dato llegado por serial.
      Serial.print("CMD: ");
      Serial.print(cmd);        //Imprime el valor llegado al puerto serie
      Serial.print("\n");        //Nueva línea
  }

  switch (cmd) {
    case 1: Serial.println("pulsando 1");
            flag = true;
            Serial.println("Dentro del flag en true");
            digitalWrite(ledPinrojo , HIGH); //Enciende el led rojo
            digitalWrite(ledPinverde , LOW); //Apaga el led verde
            start = millis();
            break;

    case 2: Serial.println("pulsando 2");
            flag = false;
            digitalWrite(ledPinrojo , LOW);
            digitalWrite(ledPinverde , HIGH);
            digitalWrite(SSR , LOW);
            Serial.println("Sin movimiento");
            break;

    default:  cmd = 4;
              break;
          
  }


  if (flag) {
      if (digitalRead(pirPin) == HIGH) {   //Si el pin del PIR se pone en HIGH hace lo siguiente
          Serial.println("Dentro de que ha detectado movimiento");
          if (millis() - start < INTERVALO){
              Serial.println("Dentro del INTERVALO millis()");
              nota(as[1], 100); noTone(altavoz); delay(0); // Suena un pitido
              digitalWrite(SSR , HIGH); //Enciende el foco
      //      Serial.println("Detectado movimiento");
          } else {
              digitalWrite(SSR , LOW); //Apagar el foco
              Serial.println("Fuera del INTERVALO millis()");
          }
      }
  }
}

void nota(int frec, int t){
    tone(altavoz,frec);      // suena la nota frec recibida
    delay(t);                // para despues de un tiempo t
}

Esquema de fritzing del montaje:

Alguna idea de los problemas surgidos??????

Muchas gracias!

El error es muy simple pero cosas asi te dije que debes cambiarlas tu. Puse por error 6 segundos y no 60

#define INTERVALO 6*1000   // 60 segundos x 1000 milisegundos

dice 6 segundos no 60 asi que cambia 6 x 60

#define INTERVALO 60*1000   // 60 segundos x 1000 milisegundos

Si surbyte ya lo probé y sigue pasando lo mismo... con el código cambiado a:

#define INTERVALO 60*1000   // 60 segundos x 1000 milisegundos

sigue pasando exactamente lo mismo que describí antes... la alarma "altavoz" suena durante 4 segundos... y la bombilla se enciende pero no se apaga nunca.... así que nos da igual dejarlo en

#define INTERVALO 6*1000   // 60 segundos x 1000 milisegundos

que en:

#define INTERVALO 60*1000  // 60 segundos x 1000 milisegundos

Porque la bombilla no se apaga como decía nunca... y el altavoz no suena ni 6 ni 60 segundos... suena 3 ó 4. Alguna idea de porqué no puedo definir el tiempo que tiene que estar la bombilla encendida y el altavoz sonando????

GRACIAS

Alguna idea de cómo poder hacerlo?? sigo peleando con ello sin resolverlo :(

Gracias.

Hola, borre algunas cosas de tu codigo y solo deje el foco porque no tengo mucho tiempo para revisar lo otro se mantiene encendido durante un minuto mientras el sensor pir haya detectado algo si en este sigue en presencia de algo se volverá a activar.

const byte 
pirPin = 12,            //PIR sensor
SSR = 9; // Pin al que está conectado el relé SSR para encender la luz

bool
flagPir = 0, 
flag = false;   // boolean

char
cmd = ' ';      // declaración de variable char llamada Data que recibe del bluetooth

unsigned long 
tiempoActual = 0;
const unsigned long
tiempoEncendido = 60000;

void setup()
{
    Serial.begin(9600);
    pinMode(pirPin, INPUT);
    pinMode(SSR, OUTPUT);
    Serial.println("Encendiendo alarma");
}


void loop()
{

    if (Serial.available() > 0) {       //Envía datos sólo cuando se recibe un dato
        cmd = Serial.read();            //Lee el dato llegado por serial.
        Serial.print("CMD: ");
        Serial.println(cmd);                //Imprime el valor llegado al puerto serie
        switch (cmd) {
        case '1': Serial.println("pulsando 1");
            flag = true;
            Serial.println("Dentro del flag en true");
            break;

        case '2': Serial.println("pulsando 2");
            flag = false;
            digitalWrite(SSR, LOW);
            Serial.println("Sin movimiento");
            break;
        }
    }

    if (flag) {
        if (digitalRead(pirPin)) {              //Si el pin del PIR se pone en HIGH hace lo siguiente
            if (!flagPir) {
                flagPir = 1;
                digitalWrite(SSR, HIGH);        //Enciende el foco
                tiempoActual = millis();
                Serial.println("Dentro de que ha detectado movimiento");
            }
        }
            if (flagPir && millis() - tiempoActual >= tiempoEncendido) {
                digitalWrite(SSR, LOW);         //Apaga el foco
                flagPir = 0;
            }
    }
}

Muchísimas gracias @swift como bien decía @ArduMyth el tema estaba en los if´s anidados... que no daba con la manera correcta! de momento funciona muy bien lo que has corregido, ahora voy a ver si hago funcionar el altavoz!! Ya os iré contando ;)

GRACIAS!!!!