Proyecto- Temporizacion finita

Hola Comunidad,

Espero me puedan ayudar. Resulta que estoy trabajando en un proyecto en donde necesito que el arduino pueda leer varias entradas al mismto tiempo y me habilite varias salidas al mismo tiempo, temporizadas con una senal pulsante.

En si mi proyecto esta conformado por un circuito RF de 4 canales y un iteaduino nano. Necesito que el iteaduino tenga la capacidad de poder leer los 4 canales de un circuito RF controlado por un control remoto y que me permita ver cada canal a traves de un pin de salida diferete.

Se que Arduino no puede hacer dos cosas a la vez, sin embargo a traves de una explicacion en la pagina de adafruit, logre encontrar que con la funcion millis(), el sistema pueda procesar varias entradas y habilitar salidas al mismo tiempo de forma temporizada. En la salida de cada pin tendre un led y necesito que ese led se encienda y apague por un tiempo no mayor a 30s y si utilizo la funcion "delay", no sera posible leer las demas entradas al mismo tiempo.

Este es el codigo que hasta el momento llevo escrito. No conozco mucho de programacion, asi que algunas cosas las he copiado de otros proyectos y de fijo por eso es que no logro hacer que funcione como yo quisiera.

/*Proyecto HospRF
Este codigo tiene como objetivo el permitir que el sistema logre captar varias entradas activas al mismo tiempo y que permita habilitar varias salidas en forma temporizada y que la senal sea
un pulso variable, en donde un led parpadeara por un tiempo "x" establecido. Las entradas estaran pegadas a un circuito RF de 315MHz. */


//Declaracion de los nombres y pines asociados de entrada y salida
const int RF1 = 9; 
const int RF2 = 10;
const int RF3 = 11;
const int RF4 = 12;
const int ledPin1 = 3;
const int ledPin2 = 4;
const int ledPin3 = 5;
const int ledPin4 = 6;

int ledState1 = LOW;
unsigned long previousMillis1 = 0;        // guardara el ultimo dato del tiempo cuando el LED estuvo activo, para la salida 1
long OnTime1 = 250;           // tiempo de la senal activa en alto, para la salida 1
long OffTime1 = 750;          // tiempo de la senal activa en bajo, para la salida 1

int ledState2 = LOW;  
unsigned long previousMillis2 = 0;        // guardara el ultimo dato del tiempo cuando el LED estuvo activo, para la salida 2
long OnTime2 = 330;           // tiempo de la senal activa en alto, para la salida 2
long OffTime2 = 400;          // tiempo de la senal activa en bajo, para la salida 2

int ledState3 = LOW;
unsigned long previousMillis3 = 0;        // guardara el ultimo dato del tiempo cuando el LED estuvo activo, para la salida 3
long OnTime3 = 250;           // tiempo de la senal activa en alto, para la salida 3
long OffTime3 = 750;          // tiempo de la senal activa en bajo, para la salida 3

int ledState4 = LOW;
unsigned long previousMillis4 = 0;        // guardara el ultimo dato del tiempo cuando el LED estuvo activo, para la salida 4
long OnTime4 = 250;           // tiempo de la senal activa en alto, para la salida 4
long OffTime4 = 750;          // tiempo de la senal activa en bajo, para la salida 4

void setup() {
  
  // Definiciion de los pines de entrada y salida
pinMode (ledPin1, OUTPUT); //Pin de Salida 1
pinMode (ledPin2, OUTPUT); //Pin de Salida 2
pinMode (ledPin3, OUTPUT); //Pin de Salida 3
pinMode (ledPin4, OUTPUT); //Pin de Salida 4

  pinMode (RF1, INPUT); //Pin de entrada 1
    pinMode (RF2, INPUT); //Pin de entrada 1
      pinMode (RF3, INPUT); //Pin de entrada 1
        pinMode (RF4, INPUT); //Pin de entrada 1
}

void loop() {
   
       unsigned long currentMillis = millis();
       
       // Funcion While, Si la senal RF1 esta en alto, se debera inicializar el temporizador de la salida 1
while (digitalRead(RF1) == HIGH) {

  
    if((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OnTime1))
  {
    ledState1 = LOW;  // Turn it off
    previousMillis1 = currentMillis;  // Remember the time
    digitalWrite(ledPin1, ledState1);  // Update the actual LED
  }
  else if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OffTime1))
  {
    ledState1 = HIGH;  // turn it on
    previousMillis1 = currentMillis;   // Remember the time
    digitalWrite(ledPin1, ledState1);  // Update the actual LED
  
  }
}
 // Funcion While, Si la senal RF2 esta en alto, se debera inicializar el temporizador de la salida 2
while (digitalRead(RF2) == HIGH) {  

  if((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2))
  {
    ledState2 = LOW;  // Turn it off
    previousMillis2 = currentMillis;  // Remember the time
    digitalWrite(ledPin2, ledState2);  // Update the actual LED
  }
  else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2))
  {
    ledState2 = HIGH;  // turn it on
    previousMillis2 = currentMillis;   // Remember the time
    digitalWrite(ledPin2, ledState2);  // Update the actual LED
  } 
    
}
 // Funcion While, Si la senal RF3 esta en alto, se debera inicializar el temporizador de la salida 3
while (digitalRead(RF3) == HIGH) {  

  if((ledState3 == HIGH) && (currentMillis - previousMillis3 >= OnTime2))
  {
    ledState3 = LOW;  // Turn it off
    previousMillis3 = currentMillis;  // Remember the time
    digitalWrite(ledPin3, ledState3);  // Update the actual LED
  }
  else if ((ledState3 == LOW) && (currentMillis - previousMillis3 >= OffTime2))
  {
    ledState3 = HIGH;  // turn it on
    previousMillis3 = currentMillis;   // Remember the time
    digitalWrite(ledPin3, ledState3);  // Update the actual LED

}
}
 // Funcion While, Si la senal RF4 esta en alto, se debera inicializar el temporizador de la salida 4
while (digitalRead(RF4) == HIGH) {  

  if((ledState4 == HIGH) && (currentMillis - previousMillis4 >= OnTime2))
  {
    ledState4 = LOW;  // Turn it off
    previousMillis4 = currentMillis;  // Remember the time
    digitalWrite(ledPin4, ledState4);  // Update the actual LED
  }
  else if ((ledState4 == LOW) && (currentMillis - previousMillis4 >= OffTime2))
  {
    ledState4 = HIGH;  // turn it on
    previousMillis4 = currentMillis;   // Remember the time
    digitalWrite(ledPin4, ledState4);  // Update the actual LED
  }
}
}}

Mi idea es que en el momento que se lea cualquiera de las entradas nombradas como RF1, RF2, RF3 y RF4, se inicie el temporizador y a la salida logre obtener una senal pulsante por cada led conectado, sin embargo hasta el momento este codigo unicamente reconoce las senales de entrada, me habilita las salidas con una senal fija y la desactivacion no es por tiempo "x", sino que mas bien si vuelvo a activar la salida del circuito RF (con un control remoto), la salida tiende a desactivarse.

Alguien por aca sabra como puedo corregir el programa para hacerlo funcionar como yo necesito.

Saludos

Se ve que copiaste para el caso 3 y 4 las sentencias del 2 y no cambiaste Ontime2 por 3 y 4 según corresponda.
Corrige.

  // Funcion While, Si la senal RF3 esta en alto, se debera inicializar el temporizador de la salida 3
  while (digitalRead(RF3) == HIGH) {  
        if((ledState3 == HIGH) && (currentMillis - previousMillis3 >= OnTime3))    {
        ledState3 = LOW;  // Turn it off
        previousMillis3 = currentMillis;  // Remember the time
        digitalWrite(ledPin3, ledState3);  // Update the actual LED
        }
        else if ((ledState3 == LOW) && (currentMillis - previousMillis3 >= OffTime3))
        {
        ledState3 = HIGH;  // turn it on
        previousMillis3 = currentMillis;   // Remember the time
        digitalWrite(ledPin3, ledState3);   // Update the actual LED

        }
        }
        
  // Funcion While, Si la senal RF4 esta en alto, se debera inicializar el temporizador de la salida 4
  while (digitalRead(RF4) == HIGH) {  

        if ((ledState4 == HIGH) && (currentMillis - previousMillis4 >= OnTime4)) {
            ledState4 = LOW;  // Turn it off
            previousMillis4 = currentMillis;  // Remember the time
            digitalWrite(ledPin4, ledState4);  // Update the actual LED
        }
        else 
        if ((ledState4 == LOW) && (currentMillis - previousMillis4 >= OffTime4)) {
            ledState4 = HIGH;  // turn it on
            previousMillis4 = currentMillis;   // Remember the time
            digitalWrite(ledPin4, ledState4);   // Update the actual LED
        }
  }

Ahora te lo modifico para que sea mas fácil de ver

Aca va la versión mejorada y simplificada. Cabe señalar que tambien podrias leer por puerto enmascarando entradas en uso y luego escribir por puerto PORT todo en dos pasos.
Se lo dejo a Lucario que le encanta!!

/*Proyecto HospRF
Este codigo tiene como objetivo el permitir que el sistema logre captar varias entradas activas al mismo tiempo y que permita habilitar varias salidas en forma temporizada y que la senal sea
un pulso variable, en donde un led parpadeara por un tiempo "x" establecido. Las entradas estaran pegadas a un circuito RF de 315MHz. */

//Declaracion de los nombres y pines asociados de entrada y salida
const byte RF[4]      = {9, 10, 11, 12};
const byte ledPin[4]  = {3, 4, 5, 6};

typedef struct {
    int ledState;                   //  guardara el ultimo dato del tiempo cuando el LED estuvo activo, para la salida 
    unsigned long previusMillis;    // guardara el ultimo dato del tiempo cuando el LED estuvo activo, para la salida 
    unsigned long OnTime;           // tiempo de la senal activa en alto, para la salida
    unsigned long OffTime;          // tiempo de la senal activa en bajo, para la salida
} Estado;

Estado estado[4];

void setup() {
  
  // Definiciion de los pines de entrada y salida
 
  for (byte i=0; i<4; i++) {
      pinMode(RF[i], INPUT);            //Pin de entrada
      pinMode (ledPin[i], OUTPUT);      //Pin de Salida
      estado[i].ledState      = LOW;
      estado[i].previusMillis = 0;
      estado[i].OnTime        = 250;
      estado[i].OffTime       = 750;
  }
}

void loop() {
   
  unsigned long currentMillis = millis();

  // Funcion While, Si la senal RF1 esta en alto, se debera inicializar el temporizador de la salida 1
  for (byte i=0; i<4; i++) {
      while (digitalRead(RF[i])) {
              if (estado[i].ledState && currentMillis - estado[i].previusMillis >= estado[i].OnTime)  {
                  estado[i].ledState = LOW;                   // Lo apago
                  estado[i].previusMillis = currentMillis;   // Recuerdo el tiempo
                  digitalWrite(ledPin[i], estado[i].ledState);  // Actualizo el estado del LED
              }
              else 
              if (!estado[i].ledState && currentMillis - estado[i].previusMillis >= estado[i].OffTime)  {
                  estado[i].ledState = HIGH;                      // Lo enciendo
                  estado[i].previusMillis = currentMillis;       // Recuerdo el tiempo
                  digitalWrite(ledPin[i], estado[i].ledState);    // Actualizo el estado del LED
              }
      }
  }
}