Pages: [1]   Go Down
Author Topic: Alternative a la fonction Delay  (Read 935 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Voila, supposons un programme destiné a fonctionné 24/h24, 365j/365 et qui doit afficher sur un afficheur lcd des données toutes les 5 minutes (cest un exemple, pas grand intérêt).

On peut utiliser la fonction delay dans la boucle :

debut de la boucle

delay(300000);
affichage de l'info

fin de la boucle

mais le problème c'est que lorsque la fonction delay est en train de se dérouler, plus aucune action n'est possible.

Or, je voudrais qu'en appuyant sur un pushbutton, le programme affiche les données, donc "débloque" en quelque sorte l'attente de 5 minutes.

J'ai vu qu'il y a avait la fonction milli() qui donne le temps écoulé depuis le lancement du programme. Est-ce le temps depuis que le board est branché ou bien le temps depuis le début de la boucle (void loop) ?

Car si cest le temps depuis le branchement du Arduino, un programme avec la fonction milli() va bloquer au bout de 50 jours.

Bref, quelle alternative a Delay (= permettre un déblocage de l'attente)

D'avance merci !
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

En enfermant ton programme dans un boucle comme ça :


void loop{
time=millis()-oldtime;

if (time>300000){

ton programme;

oldtime=millis();

}
}
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui ok mais le pb cest que milli() au bout de 50 jours retourne a 0 donc il y aura bug, non ?



Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ya pas moyen de remettre milli() à zero au debut de chaque boucle ? ;D
Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

lorsque millis() passe à 0, oltime sera plus grand que millis().

Fait une fonction de test qui te remettra oltime à 0 zéro dans ce cas.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le plus simple est d'utiliser un timer pour gérer les secondes, minutes, heures écoulées. La librairie MsTimer2 est faite pour ça (voir le playground) : il y aura deux boucles. La boucle du timer qui va incrémenter les compteurs, et la boucle classique "loop" qui va tester s'il est temps d'agir et ne sera pas bloquante.

Mais j'ai dit "le plus simple" et pas "le mieux" car il y aura une dérive du fait que l'horloge de l'Arduino ne divise pas parfaitement le temps. Il est donc préférable pour un projet qui doit fonctionner pendant 1 an d'utiliser une horloge externe RTC (Real Time Clock). Il en existe de très simple en I2C (exemple : http://www.pobot.org/Horloge-et-calendrier-I2C.html)


Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est une bonne solution la RTC, je n'y pensais pas.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Full Member
***
Karma: 0
Posts: 207
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, merci pour l'info RTC c'est sympa. Ya du boulot en perspective pour moi !
Logged

Pages: [1]   Go Up
Jump to: