//Crear una pausa sin la función delay
//https://proyectosconarduino.com/curso/tipos-de-variables-en-arduino/?expand_article=1&expand_article=1
//https://www.youtube.com/watch?v=efOdOWtf5aI
/*
int boton1 = 2; // Botón pulsador en pin D2
int boton2 = 3; // Botón pulsador en pin D3
int led = 12; // Led conectado en el pin D12
bool bucle_activado = false; // Estado de un bucle (activado o desactivado)
*/
/*
Creamos un prodrama con la función delay y observamos que el led no
no para de parpadear hasta que que pulse el boton 2 y trascurra el tienpo
if(bucle_activado)
{
digitalWrite(led,HIGH);
delay(1000);
digitalWrite(led,LOW);
delay(1000);
Si el tiempo fuese mayor no podriamos parar hasta que trascurra el tiempo de
los dos delay
*/
/*
void setup()
{
pinMode(boton1, INPUT_PULLUP);
pinMode(boton2, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop(){
if(!digitalRead(boton1))
{
bucle_activado = true;
}
if(!digitalRead(boton2))
{
bucle_activado = false;
}
if(bucle_activado)
{
digitalWrite(led,HIGH);
delay(1000);
digitalWrite(led,LOW);
delay(1000);
}
}
*/
//Segundo caso y correcto consiste en hacer un contador con la función
//de millis
int boton1 = 2; // Botón pulsador en pin D2
int boton2 = 3; // Botón pulsador en pin D3
int led = 12; // Led conectado en el pin D12
bool bucle_activado = false; // Estado de un bucle (activado o desactivado)
unsigned long actual = 0; //almacena un número entero muy largo, entre -2147483648 y
//2147483647 (4 bytes)
//Si añades «unsigned», la variable contendrá sólo números
//positivos, empezando por 0.
//Un unsigned int empezará en 0 y tendrá un valor máximo de 65 535
//Un unsigned long empezará en 0 y tendrá un valor máximo de 4.294.967.295
unsigned long anterior = 0;
bool estado_led = LOW; //queremos eempezar con el estado del led en
//estado bajo.
void setup()
{
pinMode(boton1, INPUT_PULLUP);
pinMode(boton2, INPUT_PULLUP);
pinMode(led, OUTPUT);
anterior = millis(); /*Tiempo trascurrido desde quela placa se inicia.
millis es una función que se usa para medir tiempo.
Está instrucción te da el tiempo en milisegundos desde
que se encendió la tarjeta Arduino. Una de los principales
usos es el determinar el tiempo que ha pasado entre dos o
más procesos del programa principal. Por ejemplo, para evitar
el debouce en un botón de entrada. Es decir, que mide el
tiempo entre el primer pulso de entrada del boton hasta
el tiempo X. Es decir hasta que pase un tiempo X después
del primer impulso, es que se procede a ejecutar la función
del botón.
Otra aplicación de la Arduino millis es la de averiguar el
tiempo de ejecución en etapas criticas del código.
Esto es para asegurar un tiempo real en la aplicación.*/
}
void loop(){
if(!digitalRead(boton1))
{
bucle_activado = true;
}
if(!digitalRead(boton2))
{
bucle_activado = false;
digitalWrite(led,LOW);
}
actual = millis(); //para obtener el valor anterior justo en el momento
//que arranca el código. ¿Cuál es el momento que
//arranca el código. La función dee millis devuelve los milisegundos
//desde que arrancó el código, por eso no podemos usar directamente millis
//porque millis va a llegar a muchos segundos por ejemplo 500.000
//dependiendodel tiempo que se ejecuta el código. Si nosotros
//pretendemos medir un segundo hay que hacer la diferencia entre
//el millis anterior y el millis actual. Ahora lo que se va hacer es unir
//el tiempo actual o sea el tiempo que hemos tomado por ahora menos el
//el tiempo anterior es superior a mil en este caso haz el parpadeo que queremos hacer
if(actual - anterior >1000)
{
anterior = millis(); // o escribir: anterior + 1000;
if(bucle_activado)
{
estado_led = !estado_led;
digitalWrite (led, estado_led);
}
}
}
//Tercer caso y correcto consiste en hacer dos contadores con la función
//de millis
int boton1 = 2; // Botón pulsador en pin D2
int boton2 = 3; // Botón pulsador en pin D3
int led = 12; // Led conectado en el pin D12
bool bucle_activado = false; // Estado de un bucle (activado o desactivado)
unsigned long actual = 0; //almacena un número entero muy largo, entre -2147483648 y
//2147483647 (4 bytes)
//Si añades «unsigned», la variable contendrá sólo números
//positivos, empezando por 0.
//Un unsigned int empezará en 0 y tendrá un valor máximo de 65 535
//Un unsigned long empezará en 0 y tendrá un valor máximo de 4.294.967.295
unsigned long anterior = 0;
bool estado_led = LOW; //queremos eempezar con el estado del led en
//estado bajo.
void setup()
{
pinMode(boton1, INPUT_PULLUP);
pinMode(boton2, INPUT_PULLUP);
pinMode(led, OUTPUT);
anterior = millis(); /*Tiempo trascurrido desde quela placa se inicia.
millis es una función que se usa para medir tiempo.
Está instrucción te da el tiempo en milisegundos desde
que se encendió la tarjeta Arduino. Una de los principales
usos es el determinar el tiempo que ha pasado entre dos o
más procesos del programa principal. Por ejemplo, para evitar
el debouce en un botón de entrada. Es decir, que mide el
tiempo entre el primer pulso de entrada del boton hasta
el tiempo X. Es decir hasta que pase un tiempo X después
del primer impulso, es que se procede a ejecutar la función
del botón.
Otra aplicación de la Arduino millis es la de averiguar el
tiempo de ejecución en etapas criticas del código.
Esto es para asegurar un tiempo real en la aplicación.*/
}
void loop(){
if(!digitalRead(boton1))
{
bucle_activado = true;
}
if(!digitalRead(boton2))
{
bucle_activado = false;
digitalWrite(led,LOW);
}
actual = millis(); //para obtener el valor anterior justo en el momento
//que arranca el código. ¿Cuál es el momento que
//arranca el código. La función dee millis devuelve los milisegundos
//desde que arrancó el código, por eso no podemos usar directamente millis
//porque millis va a llegar a muchos segundos por ejemplo 500.000
//dependiendodel tiempo que se ejecuta el código. Si nosotros
//pretendemos medir un segundo hay que hacer la diferencia entre
//el millis anterior y el millis actual. Ahora lo que se va hacer es unir
//el tiempo actual o sea el tiempo que hemos tomado por ahora menos el
//el tiempo anterior es superior a mil en este caso haz el parpadeo que queremos hacer
if(actual - anterior >1000)
{
anterior = millis(); // o escribir: anterior + 1000;
if(bucle_activado)
{
estado_led = !estado_led;
digitalWrite (led, estado_led);
}
}
}