Agregar más sensores a un sistema de alarma.

Buenas Tardes. He cogido en Internet un ejemplo de software para comunicar mis arduinos ( que va muy bien), pero necesito unas mejoras o actualizaciones.

Las mejoras o actualizaciones que necesito son:

-Introducir varios sensores más dentro del módulo de emisión. Los cuales tienen que estar activados a la vez para que se enciendan los led´s y un buzzer ( Sé que tiene que ser muy fácil, pero no consigo sacarlo).

El código del emisor/transmisor es el siguiente:

/*  ----------------------------------------------------------------
    SETISAEDU
    Codigo para la configuracion MultiCeiver con NRF24L01.
    Codigo del PTX1 (Alarma con activacion por final de carrera(pulsador) )
  --------------------------------------------------------------------
*/
#include <SPI.h> //libreria para el uso del modulo SPI
#include "nRF24L01.h" //Libreria del modulos nRF24L01+
#include "RF24.h"

RF24 radio(9, 10); //Declaracion de los pines de control CE y CSN para el modulo, se define el objeto "radio"

/* Lista de direcciones de los transmisores 
direccion1 = 0x7878787878LL (Este nodo) 
direccion1 = 0xB3B4B5B6F1LL 
direccion3 = 0xB3B4B5B6CDLL 
direccion4 = 0xB3B4B5B6A3LL 
direccion5 = 0xB3B4B5B60FLL 
direccion6 = 0xB3B4B5B605LL
*/
const uint64_t direccion1 = 0x7878787878LL; // En esta parte LL significa LongLong para asegurar el dato de 64bits

int Alarm_out =4; //Pin de salida de la alarma
int Alarm_modo =5; //Pin indicador de alarma Armada o Desarmada

bool A_state=0; //Variable de estado logico de la salida del la alarma
bool Alarma=false,modo=true; //Variable de estado de la alarma, variable de modo de actividad
bool armado=1; /*Variable que se usa para discriminar las peticiones de interrupcion 
                *que se hagan mientras la alarma esta Desarmada
                */
void setup()

{

  pinMode(10, OUTPUT); //Iniciar como salida el pin de control CSN
  radio.begin(); //Inicio del modulo nRF24L01+
  //radio.setRetries(15, 15); //Configuracion del numero de intentos
  radio.setPALevel(RF24_PA_LOW);  // Configuracion en modo de baja potencia
  radio.setChannel(100); // Apertura del canal de comunicacion
    //Apertura de la linea de comunicacion, direccion 2
  radio.openReadingPipe(0, direccion1); 
  radio.startListening(); // iniciamos en modo de escucha

  //Configuracion de pines de salida de alarma e indicador
  pinMode(Alarm_out, OUTPUT);
  pinMode(Alarm_modo, OUTPUT);
  digitalWrite(Alarm_out,LOW);
  digitalWrite(Alarm_modo,HIGH); // La alarma inicia activa
  
  //Declaracion de interrupciones de el pulsadores y el sensor 
  pinMode(2, INPUT); //Disparador de la alarmar (Final de carrera, PIR, IR, Luz)
  pinMode(3, INPUT); //Boton de apagado de alarma
  attachInterrupt(digitalPinToInterrupt(2), Alarma_On, RISING);
  attachInterrupt(digitalPinToInterrupt(3), Alarma_Off, RISING);

}

void loop()
{
       radio.startListening(); //Se inicia en modo de escucha para poder recibir ordenes del maestro
      //Espera de peticiones
      if (radio.available())      // Comprobacion de datos recibidos
      {
        char op; //operacion
        bool done = false;
      
        while (!done)   // Espera hasta recibir algo
        {
          radio.read( &op, sizeof(op) );
          if (op > 0)done = true;
          delay(20);            
        }
        //Acciones
        if (op == 'a') //Apagar alarma, pero siempre esta armada
        {
          Alarma = false;
          digitalWrite(Alarm_out,LOW);
        } else if (op == 'O') //Armar la alarma, modo On
        {
          digitalWrite(Alarm_out,LOW);
          digitalWrite(Alarm_modo,HIGH);
          armado=0; //Se pone a cero para obviar las interrupciones
          interrupts();
          delay(100);//Espera aque se den las llamadas a interrupcion pendientes
          armado=1; //Reactivar las acciones de las interrupciones
          Alarma = false;
          modo=true; //Poner modo en Alarma Armada
        } else if (op == 'o') //Desarmar la alarma,modo Off
        {
          digitalWrite(Alarm_out,LOW);
          digitalWrite(Alarm_modo,LOW);
          noInterrupts();
          Alarma = false;
          modo=false; //Poner modo en Alarma Desarmada
        } 
      }

                                           //Verificacion si la alarma a sido disparada y
      if((Alarma==true) &&  (modo==true))  // si esta se encuentra armada (modo = true)                             
      {
        A_state=!A_state;  //Cambio de estado de la variable que controla la salida
        digitalWrite(Alarm_out,A_state); //Escribir el estado en la salida
        delay(500); //Espera para que el cambio de estados sea apreciable
      }
}

//Rutinas de interrupcion
void Alarma_On() //Alarma disparada
  {
    if((armado==1)&&(Alarma==false)) //Verificacion si se deben obviar o no las peticiones de interrupcion
    {
    radio.stopListening(); //Paramos el modo de escucha para poder escribir
    Alarma = true; //Se enciende la funcion de la alarma
    char fun = 'A';
    radio.openWritingPipe(direccion1); //Se abre el puerto de escritura
    radio.write(&fun, 1); //Se envia la notificacion de que la alarma fue activada.
    //delay(200);
    }
  }

void Alarma_Off() //Boton de apagado de alarma disparado
  {               
    //Verificacion si se deben obviar o no las peticiones de interrupcion
    if((armado==1)&&(Alarma==true)) // y a la vez, sí la la alarma esta encendida
    {
    radio.stopListening(); //Paramos el modo de escucha para poder escribir
    Alarma = false; //Se apaga la funcion de la alarma
    digitalWrite(Alarm_out,LOW); //Se pone la salida apagada
    char fun = 'D'; //Letra para informar que la alarma se desactivo manualmente
    radio.openWritingPipe(direccion1); //Se abre el puerto de escritura
    radio.write(&fun, 1); //Se envia la notificacion de que la alarma fue activada.
    //delay(200);
    }
  }

Creo que la problemática está la declaración de los interruptores y pulsadores en concreto en el "attachInterrupt(digitalPinToInterrupt(2), Alarma_On, RISING)" ,
porque no consigo meter más sensores a parte del interruptor del pin2.

-La otra problemática es con el sketch del receptor donde necesito otras variables, para que se enciendan buzzer y LED´s independientes para cada emisor.
Por ejemplo:
La alarma 1 --> Buzzer 1, LED´s rojos.
La alarma 2 --> Buzzer 2, LED´s verdes.
La alarma 3 --> Buzzer 3, LED´s azules.

El código del receptor lo subo en otro post, porque excede el máximo de caracteres.

Agradeceré toda la ayuda posible, porque ando bastante perdido.

No puedo subir el código entero, lo voy a hacer por partes:

/*  ----------------------------------------------------------------
    SETISAEDU
    Codigo para la configuracion MultiCeiver con NRF24L01.
    Codigo del PRX (Receptor Maestro y controlador de las alarmas y operaciones)
  --------------------------------------------------------------------
*/

#include <SPI.h> // Libreria de SPI para la comunicacion con el modulo nRF24L01
//Librerias para el control del modulo nRF
#include <nRF24L01.h> 
#include <RF24.h>


RF24 radio(9, 10);//Declaracion de los pines de control CE y CSN para el modulo, se define "radio"

//Se crean las 6 direcciones posibles para las Pipes P0 - P5; 
//Las direcciones es un numero de 40bits para este caso se usa uint_64_t de 64bits
const uint64_t direccion[] = {0x7878787878LL, 0xB3B4B5B6F1LL, 0xB3B4B5B6CDLL, 0xB3B4B5B6A3LL, 0xB3B4B5B60FLL, 0xB3B4B5B605LL };
                             // En esta parte LL significa LongLong para asegurar el dato de 64bits
//Variables de estado de las alarmas
bool Alarma1 = false, Alarma2 = false, Alarma3 = false;

void setup()
{

  Serial.begin(115200);  //Se inicia el puerto serial
  Serial.println("Iniciando modulo receptor");
  Serial.println();

  radio.begin(); //Inicio del modulo nRF24L01+
//  radio.setRetries(15, 15);// Cinfiguracion del numero maximo de reintentos
  radio.setPALevel(RF24_PA_MAX);  // Se configura a la maxima potencia
  radio.setChannel(100); // Apertura del canal especifico
  
  //Apertura de las lineas de comunicacion con un maximo de 6 direcciones
  radio.openReadingPipe(0, direccion[0]);
  radio.openReadingPipe(1, direccion[1]);
  radio.openReadingPipe(2, direccion[2]);
  //para el caso de tenes mas modulos
  radio.openReadingPipe(3, direccion[3]); 
  radio.openReadingPipe(4, direccion[4]);
  radio.openReadingPipe(5, direccion[5]);

  radio.startListening(); //Se inicia en modo de escucha, a la espera de alertas de las alarmas
}

manuelo94:
Creo que la problemática está la declaración de los interruptores y pulsadores en concreto en el "attachInterrupt(digitalPinToInterrupt(2), Alarma_On, RISING)", porque no consigo meter más sensores a parte del interruptor del pin2.

Estas en lo correcto, Arduino UNO solo es capaz de manejar 2 interrupciones. En los pines 2 y 3.

Pero que sentido tiene usar interrupciones ? existen metodo simples para detectar los flancos en un boton como este:

bool actualAlarma_ON,anteriorAlarma_ON,actualAlarma_OFF,anteriorAlarma_OFF;

void setup(){
   Serial.begin(9600);
   pinMode(2, INPUT);   
   pinMode(3, INPUT);   
}
void loop(){
   actualAlarma_ON = digitalRead(2);
   if (actualAlarma_ON && !anteriorAlarma_ON){
      Serial.println("Alarma ON");
   }
   anteriorAlarma_ON = actualAlarma_ON;

   actualAlarma_OFF = digitalRead(3);
   if (actualAlarma_OFF && !anteriorAlarma_OFF){
      Serial.println("Alarma OFF");
   }
   anteriorAlarma_OFF = actualAlarma_OFF;
}

El otro problema que veo son los delay(), asi no funcionara. Usa millis().

Muchas gracias kike por contestar,

El ejemplo es de internet y lo unico que hice fue cambiarlo un poco.

¿Lo unico que tengo que hacer es ponerlo como tu y funcionara el emisor ?

El tema de los delays no me preocupa, el programa se conecta bien, no obstante cambiare los delays por millis.

Otra cosa, ¿como puedo hacer que en el receptor se active una señal para cada alarma(como puse en el primer post)?

Un abrazo, espero tu respuesta.

Kike, es que no entiendo mucho de programacion la verdad y ando muuuuyy perdido, ¿podrias coger mi sketch y decirme que debo cambiar?

Ya se que estais todos muy liados. ¿pero alguien podría ayudarme con la programacion que se ha puesto en el post? (Es bastante urgente).
Un fuerte abrazo a todos y gracias de antemano.

Te aconsejo que leas las normas del foro y controles tu ansiedad.

Si no sabes debes esperar y si la espera se hace larga porque no estudiar Arduino y hacerlo uno mismo?

Ahhh da mucho trabajo, bueno, ya te plantee los caminos.

El otro camino es pedir que alguien lo haga y pagarle por ello.

No hago mas que resumir lo dicen las normas del foro.

Sin embargo te daré una ayuda, existe una librería que se llama RF24Network de Tmrh20 que tiene simples ejemplos y permite conectar a un master con sus N esclavos nRF24 (mas de los que tu alarma necesite).

Mirala y mas alla que te pueda resultar mas compleja es fantasticamente mas simple de manejar cuando se trata del agregado de mas nodos.

Si tu objetivo son mas sensores a los que ya tienes, tienes libros por todos lados. Nosotros en Documentación Indice de temas Tutoriales tenemos una sección Cursos de youtube y libros.
Ve y mira a ver si son de ayuda.

Muchas gracias Surbyte por contestar, buscare información en los libros y en youtube.
La comunicación entre los módulos Nrf24l01 me va bien, lo que pasa es que en el momento de agregar mas sensores(para que estos esten condicionados para activar la alarma), no se como hacerlo y no he encontrado ejemplos parecidos.

Un fuerte abrazo.

Lo que ocurre es que has tomado algo ya armado y cuando lo quieres modificar chocas con tu desconocimiento del concepto de programación Arduino.
Entonces lo mejor es que retrocedas, leas y entiendas mejor Arduino y como se programa y luego comprendas que lo que intentas hacer es complicado para alguien que empieza.

Agregar un sensor requiere saber ponerlo en funcionamiento no en este código ya hecho, sino en otro mas simple primero.
Cuando domines eso entenderás qué librerías, variables, cómo se inicializa y cómo se lee dicho sensor.

Imaginemos que le quieres agregar un sensor de temperatura y Humedad del tipo DHT22.
Bueno hay una librería DHT.h, luego debes crear un objeto, indicarle con que pin vas a leer, y luego leer sus datos.

Esto se repite con cada sensor. Por eso los pasos mas simples son entender cada sensor y luego saber que agregar.

Sigue este camino y podrás resolverlo por tu cuenta.

Para mas ayuda, dinos que sensores piensas usar y hablemos de ellos.

Los sensores que quiero utilizar ( y que estoy utilizando), son los Fc-51.

Todo va bien, pero como tu bien dices Surbyte, mi desconocimiento de programación en arduino es apreciable.

He hecho pequeñas pruebas con los módulos y me han ido correctamente, lo que pasa es que este ejemplo es más complicado(pero me gusta el manejo que usa para programar los emisores desde el receptor al emisor mediante el monitor serie).

No he visto que haya que usar librerías con este módulo.

Muchas gracias por responder, espero tu respuesta.

Si practicas con un simple interruptor o pulsador harás exactamente lo mismo que este sensor.

Gracias Surbyte por responder tan rapidamente.

No he entendido muy bien el post.
He hecho pequeños programas con el fc-51 y todos muy bien.

Tengo una pregunta:
¿Puedo mantener el sketch inicial y cambiar como se activan los sensores de los emisores?

Gracias de antemano