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
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.
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);
}
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:
00 60 a 75 minutos
10 30 a 45 minutos
01 10 a 15 minutos
11 60 a 90 segundos
Elegi estas opciones pero pueden ser cualquier otras
Este es el circuito que ya arme y esta funcionando: