Medindo o tempo 1

cristal_oscilador_arduino
[By oomlout CC By-SA from wikimedia]

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

  1. 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.
  2. 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.
  3. 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.

 


Deixa un comentario