Descrición
Agora non imos falar dun reloxo deses que conectamos externamente, senón que se trata de utilizar o reloxo interno do Arduíno para poder medir o tempo e realizar algunha acción en función desa medida. Arduíno leva un cristal que oscila a 16 MHz ou 16.000.000 veces por segundo e a través da función milis() (referencia) podemos medir o tempo transcorrido desde que se acendeu a placa.
Se utilizamos un delay(tempo); para realizar esperas, o Arduíno non poderá facer nada durante ese intervalo de tempo, nin medir un sensor, nin mover un servo, … nada! estará esperando, e iso pode que non nos interese en determinados programas.
Imaxina o caso do proxecto da porta de garaxe. Queremos que, despois de aberta, a porta se peche automaticamente cando transcorreu un determinado tempo ou cando lle damos ao pulsador de pechar. Se programamos un delay(tempo); xa podemos pulsar no mando o que queiramos que a porta non se vai pechar, pois o Arduíno estará agardando e non executará nese tempo ningunha outra acción. Unha solución sería iniciar a medida do tempo cando a porta estea aberta e detectar o tempo transcorrido desde entón para proceder ao peche.
Montaxe
Imos programar os exemplos cun LED e un pulsador. Logo deberás adaptar ti os programas en función do que necesites facer.
Programas
1. Medir o tempo
1. Medir o tempo: Nesta práctica imos ver como medir o tempo desde que a placa está acesa e mostralo na consola serie.
// Declaración de variables: unsigned long tempo; int segundos; int minutos; // Configuración: void setup(){ Serial.begin(9600); while(!Serial); } // Programa: void loop(){ tempo = millis(); // Tempo transcorrido desde o inicio da placa en ms segundos = (tempo/1000) % 60; // segundos de 0 a 59 minutos = (tempo/1000) / 60; Serial.println(String (tempo) + " = " + String(minutos) + ":" + String(segundos)); delay(1000); // Mostramos o tempo cada segundo }
2. Despois dun tempo
2. Despois dun tempo: Mediante un pulsador imos acender un LED. Despois dun intervalo de tempo (5 segundos) vaise apagar. Creamos unha variable para visualizar o cronómetro na consola cando se activa.
Utilizamos “int” e non “unsigned long” porque imos pasar o tempo a segundos.
// Declaración de variables: int led=13; int pulsador=2; int estado; // Variable que garda o estado do pulsador int tempoActual; // A medida do tempo cando a miramos int tempoAnterior; // A última vez que se acendeu o LED int intervalo = 5; // intervalo en segundos int crono=0; // Variable para a visualización do cronómetro // Configuración: void setup() { Serial.begin(9600); //Inicia comunicación serial pinMode (led, OUTPUT); } // Programa: void loop() { tempoActual= millis()/1000; // É o tempo actual en s transcorrido desde o inicio. estado = digitalRead(pulsador); if ( estado == 1 ) { digitalWrite(led, HIGH); // Acende o LED tempoAnterior= tempoActual; // Iniciamos o cronómetro crono=1; } if(tempoActual- tempoAnterior > intervalo){ // Se pasou o intervalo de tempo apaga o LED digitalWrite(led, LOW); tempoAnterior=tempoActual; crono=0; // desactivamos o cronómetro } if (crono == 1){ // Mostra o cronómetro na consola cando está activado int datoCrono = intervalo -(tempoActual-tempoAnterior); Serial.println(datoCrono); } }
3. Escintileo sen delay
3. Escintileo sen delay: Nesta práctica imos programar o escintileo dun led sen utilizar a función delay(tempo);. Pode ser útil no caso de necesitar que non se deteña a execución doutros programas debido á presencia do delay.
const int led = 13; int estadoLED = LOW; // Estado do led long tempoAnterior = 0; // A última vez que se acendeu o LED long intervalo = 1000; // intervalo en milisegundos void setup() { pinMode(led, OUTPUT); } void loop() { unsigned long tempoActual = millis(); // É o tempo actual transcorrido desde o inicio. if(tempoActual - tempoAnterior > intervalo) { // se xa pasou o intervalo... tempoAnterior = tempoActual; // asignamos a tempoAnterior o tempo actual if (estadoLED == LOW){ estadoLED = HIGH; } else{ estadoLED = LOW; } } digitalWrite(ledPin, estadoLED); // cambiamos o estado do LED }
Propostas
- Segundo pulsador: No programa “Despois dun tempo” engade un segundo pulsador de xeito que o LED se apague cando transcorra o intervalo de tempo establecido ou premamos no segundo pulsador, independentemente do tempo.
- Cronómetro: Fai un cronómetro cun pulsador de marcha e outro de parada. Empezará en 0 e mostrará o tempo ata a parada. Os datos deben mostrarse na consola no formato minutos:segundos (mm:ss). Cando funcione móstrao nunha pantalla LCD.
- Conta atrás: Podes facer unha versión do cronómetro conta atrás. Incorpora un pulsador de axuste de xeito que cada vez que prememos aumenta o intervalo 10 segundos. Unha vez seleccionado o tempo a descontar, prememos no pulsador de marcha e vai descontando segundos ata chegar a cero. Nese intre soa unha alarma. Faino tamén para unha pantalla LCD.