Input con 3 estados para seleccionar

Como estan, estuve buscando en los archivos y encontre poco y no me funciona lo que quiero hacer, tampoco se si es posible. el tema es, tengo un "boton de hombre vivo" quew arme con un Nano, ahora me solicitan que tenga opcines en los rangos temporales, entonces a traves de una entrada elijo una de las opciones, el tema es que queria usar HIGH, LOW y Default (Tristate) y no me funciona, se queda en low. Les pego el codigo de esta parte:

int inputPin = 9; //elijo la entrada de eleccion
int inputState = 0; //establezco la variable de entrada
 //
//
void iniciarTimer() {
  // Genera un numero aleatorio en segundos
  inputState = digitalRead(inputPin);
  
 switch (inputState) {
    case HIGH:
      randomTime = random(1800, 2700);
        break;
    case LOW:
      randomTime = random(3600, 4500);
         break;
    default:
      randomTime = random(600, 900);
        break;
  }
  

solo cambia entre las dos primeras.
Espero sus comentarios. Gracias

La función digitalRead solo tiene 2 estados, HIGH o LOW.

Necesitas usar el contador de pulsos.

Algo así:

void iniciarTimer()
{
  // Genera un numero aleatorio en segundos
  inputState = digitalRead(inputPin);

  if(inputState == HIGH)
  {
    cont++;

    if(cont > 2)
    {
      cont = 0;
    }
  }

  switch (cont)
  {
    case 0:
      {
        randomTime = random(1800, 2700);
        break;
      }
    case 1:
      {
        randomTime = random(3600, 4500);
        break;
      }
    case 2:
      {
        randomTime = random(600, 900);
        break;
      }
    default:
      {

        break;
      }
  }
}

Ok, entiendo es limite de la funcion, entonces asi no me es util, necesitaria utilizar 2 entradas entonces, pero se me mezclan las cosas, serian opciones por eejmplo:
1 - input 1 HIGH
2 - input 2 HIGH
3 - input 1 y 2 LOW

Para lograr lo que pides necesitas dos entradas y una condicion no usada.
Dos entradas te dan 4 combinaciones posibles. Cubres 3 y resuelves de algun modo que haces con la 4ta.
Ya lo resolviste con dos switches o interruptores.

Si, ahora la consulta es tengo que generar un contador como en el ejemplo de Fernando por cada pin de entrada verdad, ahi me pierdo un poco. o sea un if por cada entrada

No, no hace falta.
Solo lees las dos entradas y decidis.

Algo asi

int inputPin1  =  9; 	// switch 1
int inputPin2  = 10; 	// swtich 2
int inputState1, inputState2, entrada; 		// establezco la variable de entrada
int randomTime;
//
//
void iniciarTimer() {
	// Genera un numero aleatorio en segundos
	inputState1 = digitalRead(inputPin1);
	inputState2 = digitalRead(inputPin2);
	entrada = inputState2<<1 + inputState1;

	switch (entrada) {
	case 0:
		randomTime = random(1800, 2700);
		break;
	case 1:
		randomTime = random(3600, 4500);
		break;
	case 2:
		randomTime = random(600, 900);
		break;
	default:
		break;
	}
}

No quiero marearte esto solo arma una variable con los tres posibles estados que tu indicaste
Los dos en 0, uno en 1 o el otro en 1.
Si los dos estan en 1 no haces nada

	entrada = inputState2<<1 + inputState1;

primeros lees los bits con inputState1 o inputState2
esto inputState2<<1 desplaza el valor del bit a la izquierda 1 posición asi que tendras 10 o 00 pero mira solo el bit mas significativo
lo dema se completa con inputState1
Entonces tienes
00 los dos en LOW = 0
01 inputState2 en LOW y inputState1 en HIGH = 1
10 inputState2 en HIGH y inputState1 en LOW = 2
11 si los dos estuvieran en HIGH = 3 pero no existe este estado.

Perfecto voy a probar con esa solucion a ver como resulta. Gracias a todos. Les cuento cuando ya lo tenga completo, me falta una funcion mas luego de esto.

Buenas tardes, he aplicado esta solucion y no hay variacion, eljo cualquiera de las 3 combinaciones de entrada solo toma la primera.
Tambien probe con if + int else y peor, se me van los tiempos a 0, 1, -2.

Modifica asi

inputState1 = digitalRead(inputPin1);
	inputState2 = digitalRead(inputPin2);
	entrada = inputState2<<1 | inputState1;

Sigo con el fracaso, ya probe de 4 formas distintas, incluso con el Cont que propuso Fernando, siempre se queda con la ocpion de arranque, etoy pensando en que deberia elgirmo en el setuop, ya que no va a ser dinamica la eleccion sino para faciltar la eleccion del usuario.
Lo que observe que memoriza la ultima opcion y no cambia, en la ultima prueba arranco en el case 0 (ambas entradas en LOW), cambio al case 1 ( una entrada en HIGH) y no hubo mas cambios a partir de ahi.
Probe tambien una opcion eleigiendo el rango de tiempos en setup pero no esta funcinando tampoco, les dejo este codigo:

int inputState1 = 0;
int inputState2 = 0; 
int opcionRandom;

void setup()
inputState1 = digitalRead(inputPin1);
inputState2 = digitalRead(inputPin2);

//establece el rango del tiempo random
   	if (inputState1 == LOW && inputState2 == LOW) {
      opcionRandom == 60, 90;
    }
   	if (inputState1 == HIGH && inputState2 == LOW) {
      opcionRandom == 600, 900;
    }
	if (inputState1 == LOW && inputState2 == HIGH) {
      opcionRandom == 1800, 2700;
    } 
    if (inputState1 == LOW && inputState2 == LOW) {
      opcionRandom == 3600, 4500;
      }
void loop()
iniciarTimer();

void iniciarTimer() {
  // Genera un numero aleatorio en segundos
	randomTime = random(opcionRandom); 	
  Serial.print("Opcion random : ");
  Serial.println(randomTime);

}

Concentrémosnos en los switches.
Yo los probé y funcionan bien
Estan con INPUT_PULLUP los mios.
Revisa acá

FUNCIONO! increible que algo tan simple no lo haya probado pero bue, lo importante es que anduvo y muy bien. Solo faltaba declarar las PULLUP en las entradas.
Dejo todo el codigo completo por si alguno le sirve el proyecto, cualquier duda me preguntan. Este equipo se utiliza para el personal de vigilancia que no pierda la atencion de su funcion. Habia un fabricante pero el equipo se le encarecia y lo dejo de hacer, con esto solucionamos el tema con pocos pesos. Muchas gracias Surbyte y Fernando Garcia tambien por su aporte.

#include <Config.h>
#include <EasyBuzzer.h>

int inputPin1 = 7;                      // Primer entrada de opcion de tiempo
int inputPin2 = 9;                      // Segunda entrada de opcion de tiempo
int ledPin = 12;                        // Pin Led Aviso
int resetButtonPin = 8;                 // Pin del pulsador
int AvisoPin = 11;                      // Pin del buzzer de aviso
int SalidaPin = 10;                     // Pin salida de relay
long randomTime;                        // tiempo aleatorio en segundos
long currentTime;                       // hora actual
signed long remainingTime;              // tiempo restante en el timer
int resetButtonState = 0;               // Declara la variable para el estado del pulsador de
int inputState1, inputState2, entrada;  // establezco la variable de entrada

void setup()  // Bloque de Configuración
{
  EasyBuzzer.setPin(11);             // Pin de conexion del buzzer
  EasyBuzzer.beep(1);                //Frecuencia del beep en Hz
  EasyBuzzer.setOnDuration(200);     // Set On duration.
  EasyBuzzer.setOffDuration(200);    // Set Off duration.
  EasyBuzzer.setPauseDuration(200);  // Set Pause duration.

  Serial.begin(9600);          // Inicializa el puerto serial para depurar
  randomSeed(analogRead(A0));  // Toma entrada analogica como referencia del Random

  pinMode(ledPin, OUTPUT);       // Fija pin 13 como salida
  pinMode(AvisoPin, OUTPUT);     // Fija pin 11 como salida
  pinMode(SalidaPin, OUTPUT);    // Fija pin 12 como salida
  digitalWrite(ledPin, LOW);     // inicia salida led como apagada
  digitalWrite(AvisoPin, LOW);   // inicia salida Aviso como apagada
  digitalWrite(SalidaPin, LOW);  // inicia salida Salida como apagada
  // Inicializa el pin del pulsador de reinicio como entrada
  pinMode(resetButtonPin, INPUT_PULLUP);
  // inicializa las entradas de opcion de random como enclavadas a +
  pinMode(inputPin1, INPUT_PULLUP);
  pinMode(inputPin2, INPUT_PULLUP);

  // Establece la hora de inicio del timer
  iniciarTimer();
  Serial.print("Tiempo aleatorio generado: ");
  Serial.println(randomTime);
}

void loop()  // Bloque de ejecución cíclica
{
  // Lee el estado del pulsador de reinicio
  // El input esta invertido por el INPUT_PULLUP, lo invertimos para tener el valor correcto.
  resetButtonState = !digitalRead(resetButtonPin);

  // Si el pulsador de reinicio está presionado, reinicia el timer
  if (resetButtonState == HIGH) {
    // Reinicia el timer generando un nuevo tiempo aleatorio y estableciendo una
    // nueva hora de inicio
    Serial.print("PULSADO :");
    EasyBuzzer.stopBeep();
    iniciarTimer();
  }
  // Calcula el tiempo restante en el timer
  currentTime += 1;
  remainingTime = randomTime - currentTime;

  // Si el tiempo restante es menor que 30 segundos, emite una alarma
  if (remainingTime <= 30) {
    //digitalWrite(AvisoPin, HIGH);  // Emite una alarma
    EasyBuzzer.update();  // Emite una alarma intermitente
    digitalWrite(ledPin, HIGH);
  }
  if (remainingTime == -5) {
    EasyBuzzer.stopBeep();
    iniciarTimer();
  }

  // Si el tiempo restante es menor o igual a cero, emite la alarma final
  if (currentTime > randomTime) {
    digitalWrite(SalidaPin, HIGH);  //Dispara relay de alarma
  }

  // Muestra el tiempo restante en el puerto serial
  Serial.print("Tiempo restante: ");
  Serial.println(remainingTime);
  Serial.print(", Tiempo random: ");
  Serial.println(randomTime);

  // Espera un segundo antes de volver a calcular el tiempo restante
  delay(1000);
}
void iniciarTimer() {

  // Genera un numero aleatorio en segundos
  inputState1 = digitalRead(inputPin1);
  inputState2 = digitalRead(inputPin2);
  // Elige segun las entradas que rango de tiempo cuenta
  entrada = inputState2 << 1 | inputState1;

  switch (entrada) {

    case 0:
      randomTime = random(60, 90);
      // código para utilizar el tiempo aleatorio
      break;
    case 1:
      randomTime = random(600, 900);
      // código para utilizar el tiempo aleatorio
      break;
    case 2:
      randomTime = random(1800, 2700);
      // código para utilizar el tiempo aleatorio
      break;
    case 3:
      randomTime = random(3600, 4500);
      // código para utilizar el tiempo aleatorio
      break;
  }

  currentTime = 0;
  digitalWrite(AvisoPin, LOW);
  digitalWrite(SalidaPin, LOW);
  digitalWrite(ledPin, LOW);
}

De esta forma quedo las siguientes opciones:

  1. 00 60 a 75 minutos
  2. 10 30 a 45 minutos
  3. 01 10 a 15 minutos
  4. 11 60 a 90 segundos
    Elegi estas opciones pero pueden ser cualquier otras
    Este es el circuito que ya arme y esta funcionando:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.