
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.