Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Temps d'espera (delay) i càlcul de temps

En molts programes és necessari que el microcontrolador esperi un temps abans d'executar la instrucció següent. Això habitualment es resol amb la instrucció delay. En altres casos ens pot interessar comptar quin temps ha passat entre dos esdeveniments.

Temps d'espera

La funció delay realitza una pausa de la durada que li indiquem. Aquesta durada s'ha d'indicar en mil·lisegons; per tant posarem 1000 quan vulguem un segon.

...
	delay(500);				// Pausa de mig segon
...

Quan necessitem esperes més petites, podem fer servir la gunció delayMicroseconds. Aquesta funció és igual que l'anterior però el temps s'indica en microsegons. Un segon és un milió de microsegons, per tant un retard d'un segon es faria amb un valor d'un milió.

...
	delayMicroseconds(500000);		// Pausa de mig segon
...

Durada d'un pols

La funció pulseIn permet mesurar la durada d'un pols en una pota del microcontrolador. La funció pot tenir dos o tres paràmetres:

	durada = pulseIn(pota, valor); 
	durada = pulseIn(pota, valor, limit);

Li hem d'indicar quina pota ha de mirar (int) i si el que volem mesurar (int) és la durada d'un pols a 1 (HIGH) o a 0 (LOW). Podem també posar un límit màxim de temps (unsigned long) en microssegons que s'ha d'esperar. Si no posem un límit, aquest serà d'un segon. El valor que ens retornarà serà la durada del pols (unsigned long) en microsegons que serà zero si no s'ha pogut veure el pols complet. Per exemple, en el cas següent:

	durada = pulseIn(8, HIGH, 10000);

El microcontrolador esperarà a que l'entrada 8 passi de LOW a HIGH. Llavors començarà a comptar el temps fins que l'entrada passi de HIGH a LOW i guardarà el resultat (en microssegons) a la variable durada. Si passats 10 ms (10000 μs) no ha passat de LOW a HIGH o sí que ho ha fet però no ha retornat a LOW, el valor de la variable durada serà zero. Si quan el programa arriba a aquesta línia l'entrada 8 està a HIGH, s'esperarà primer a que es desactivi ja que no començarà a comptar el temps fins que l'entrada passi de LOW a HIGH.

En forma recíproca, la funció també pot mesurar la durada de polsos LOW.

Càlcul de temps

El microcontrolador té dos comptadors que es van incrementant cada un cert temps. Consultant les funcions corresponents podem saber els mil·lisegons (funció millis) o microsegons (funció micros) des del moment que hem posat en marxa la placa. Restant els valors entre dos esdeveniments podem saber el temps que ha passat.

La funció millis dóna un resultat del tipus unsigned long amb el nombre de mil·lisegons. Cada uns 50 dies el valor resultant ja no hi cap i torna a començar a partir de zero.

unsigned long temps;		// Variable per guardar el temps que ha passat
...
    temps = millis();	// Llegim el temps
...

La funció micros dóna un resultat del tipus unsigned long amb el nombre de microsegons. Cada poc més d'una hora el valor resultant ja no hi cap i torna a començar a partir de zero. El valor que retorna aquesta funció no s'incrementa d'un en un sinó que ho fa a salts; per exemple de quatre en quatre o de vuit en vuit.

unsigned long temps;		// Variable per guardar el temps que ha passat
...
    temps = micros();	// Llegim el temps
...

Per controlar el temps podem restar el valor guardat de l'actual i comprovar si supera el llindar establert. Per exemple:

#define periode 10000UL    // 10 s
unsigned long tempsAnt;		// Variable per guardar el temps de la darrera vegada
...
    if ((millis() - tempsAnt) > periode){
        tempsAnt = millis();	// Guardem el nou valor
        ...
    }
...

Observem que un cop es compleix la condició guardem immediatament el nou valor de millis per assegurar que el temps és el desitjat de la manera més exacta possible.

A la instrucció define hi hem afegit les lletres UL per assegurar que el valor es guarda en format unsigned long.

És important tenir en compte que els valors de millis i micros es reinicien cada un cert temps i això pot donar lloc a funcionaments anòmals que difícilment es detecten durant la fase de proves perquè no tenim el microcontrolador funcionant prou temps. La manera més habitual de tenir-ho en compte és comprovant-ho a l'inici del loop. Per exemple:

unsigned long tempsAnt;		// Variable per guardar el temps que ha passat
void loop() {
    if (tempsAnt > millis()){
        tempsAnt = millis();
    }
...

Així, un cop s'hagi reiniciat millis guardarem el nou valor a l'inici del primer bucle. Potser hi haurà una execució en la que no es farà el temps correctament però si no féssim res no hi hauria cap més execució ja que millis ja no podria ser més gran que el darrer valor guardat a la variable.

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.