Pages: [1] 2   Go Down
Author Topic: Timer  (Read 1502 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je cherche a créer un programme, je souhaite lancer un timer a un moment donné qui compte 90 seconde et qui s arrete.

En gros

If moncapteur = true
Elese wait
If moncapteur = false
compte 90 sec

quelqu'un peut il me donner un ptit coup de main ?
Logged

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 863
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

tu a:

delay(90000); //(qui attend 90sec)bloquante

ou

Code:
unsigned long time1,time2;

time1=milis();

if (time1>=(time2+90000)) // non bloquante !
{time2=millis();}


Logged

Un tien vaux mieux que deux tu l'auras !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'utilisation de delay() pour ce genre de chose est a proscrire car tu bloques ton CPU à ne rien faire pendant ce temps.
Tu ne peux pas utiliser ce temps perdu pour une autre tâche.

Regarde la bibliotheque SoftTimer que j'ai publié dans la partie Tuto du forum. Elle permet de gérer facilement des timeout, taches repetitives,.. Et autres fonctions basées sur le temps sans utiliser de timer hardware.

Sinon après si tu préfère utiliser un timer hardware, tu peux chercher la bibliotheque TimerOne sur le playground.


@skizoh
Ton code part sur une bonne idée mais il est faux. Tu compare avec milli2 qui est lu après.
De plus ton if va poser un problème au moment ou millis() va reboucler. Il faut écrire la comparaison comme ci dessous.
Je suggère :
Code:
unsigned long time_start;
enum { ATTENTE, EN_COURS } etat = ATTENTE;
void loop()
{
  switch( etat )
  {
  case ATTENTE:
    if ( mon_capteur() == false )
    {
      // demarrage du comptage de 90 secondes
      time_start = millis();
      etat = EN_COURS;
    }
    break;
  case EN_COURS:
    if ( (millis() - time_start) >= 90000 )
    {
      // fin des  90 secondes
      etat = ATTENTE;
      // faire ce qu'il y a a faire au bout des 90 secondes
      // ....
    }
    break;
  }
}

Oups, j'ai encore réussi à coller un exemple basé sur une machine d'état smiley-wink
« Last Edit: April 27, 2012, 03:03:00 am by barbudor » Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je cherche a créer un programme, je souhaite lancer un timer a un moment donné qui compte 90 seconde et qui s arrete.

En gros

If moncapteur = true
Elese wait
If moncapteur = false
compte 90 sec

quelqu'un peut il me donner un ptit coup de main ?
Regarde cest deux tutoriels du playground :
http://arduino.cc/en/Tutorial/Blink
http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 863
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lol, non sérieux sa marche ce truc je m'en sert pour l'heure et moyennant +6 secondes par heure je ne prend pas de retard, mais le tien est nettement plus propre on est d'accord surtout que je partage ton avis sur les machines d'états, c'est "LA BASE !" ^^' bref aujourd'hui j'ai testé mon système de gestion de ronde sur le terrain, je vais en faire le résumé, mais en tout cas tout c'est bien passé ! smiley-grin

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si tu dois gérer un évenement périodique, il ne faut pas reprendre l'heure de départ a chaque fois.

Par exemple ce code est mauvais :
Code:
unsigned long temps_ref;
#define PERIODE 10000

void setup()
{
  temps_ref = millis();
}

void loop()
{
  if ( (millis() - temps_ref) >= PERIODE )
  {
    // Evenement !
    // .... faire ce qu'il y a a faire ...
    // pour le prochain
    temps_ref = millis();
  }
  // Autre tâches
  // .....
}

Pourquoi ce code là n'est-il pas bon ?
Par ce que tu reprend le temps de référence de manière absolue.
Or si tu perd un peu de temps dans les autres tâches tu viendras traiter l'évenement en retard.
Et donc tu reprend une nouvelle date de départ décalée.
Ce qui implique une dérive permanente, une horloge qui retarde.

Dans ma lib SoftTimer c'est écrit de la manière suivante :

Code:
void loop()
{
  if ( (millis() - temps_ref) >= PERIODE )
  {
    // Evenement !
    // .... faire ce qu'il y a a faire ...
    // pour le prochain
    temps_ref += PERIODE;
  }
  // Autre tâches
  // .....
}

Ce principe permet de toujours garder une période moyenne égale à PERIODE, parce que tu recalcule un nouveau temps de référence qui est décalé de la valeur exacte de ta période.

A+
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 863
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lol ok ok, bref tant fait je n'utilise pas trop millis en général c'est trop peux précis puis en plus au bout des 70h ou je sais plus combien ça boucle et revient donc à 0 donc petit problème a ce moment la :s bref merci de tes explications smiley

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Interro écrite.
Dis moi exactement au bout de combien de temps reboucle millis() et au bout de combien de temps reboucle micros().
Calculatrice autorisée.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Interro écrite.
Dis moi exactement au bout de combien de temps reboucle millis() et au bout de combien de temps reboucle micros().
Calculatrice autorisée.
millis() : rollover aprés 4294967296 millisecondes, soit 4294967 secondes, soit 1193 heures, soit 49,71 jours  smiley-mr-green
micros() : rollover aprés 4294967296 microsecondes, soit 4294967 millisecondes, soit 4294 secondes, soit 71,58 minutes smiley-mr-green

J'ai droit à un cookies ? smiley-razz

Ps: au passage il existe plein de méthodes pour détecter un rollover de millis() ou de micros(), exemple : http://www.faludi.com/2007/12/18/arduino-millis-rollover-handling/
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Skywodd, tu n'es pas dans cette classe !
Laisse les petits répondre  smiley-grin
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Skywodd, tu n'es pas dans cette classe !
Laisse les petits répondre  smiley-grin
Mais heu ... faut bien que je trouve une utilité à la calculette windows !
T'as pensé à tout les dév µsoft qui ont passé des semaines à débugger (sans sucées) la calculette Windows ? smiley-mr-green
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci pour vos reponses j essaye ce code :

seulement ca ne fonctionne pas

Code:
#include <NXTTouch.h>
#include <Wire.h>
#include <NXShield.h>
#include <NXTTouch.h>
#include <NXTLight.h>
#include <SumoEyes.h>
#include <ACCLNx.h>
#include <NXTUS.h>

//
// declare the NXShield(s) attached to your Arduino.
//
NXShield    nxshield;

//
// declare the i2c devices used on NXShield(s).
//

//
// declare analog devices attached to nxshields.
//
NXTTouch    touch1;

 
 

unsigned long time_start;
enum { ATTENTE, EN_COURS } etat = ATTENTE;
void loop()
{
  switch( etat )
  {

  nxshield.init( SH_SoftwareI2C );
  touch1.init( &nxshield, SH_BBS1 );

 
  case ATTENTE:
    if ( touch1() == false )
    {
      // demarrage du comptage de 90 secondes
      time_start = millis();
      etat = EN_COURS;
    }
    break;
  case EN_COURS:
    if ( (millis() - time_start) >= 90000 )
    {
      // fin des  90 secondes
      etat = ATTENTE;
      // faire ce qu'il y a a faire au bout des 90 secondes
      // ....
    }
    break;
  }
}
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Qu'est-ce qui ne marche pas ?
Soit plus précis.

Où est setup() ?
Pourquoi les fonctions d'init ne soit pas dans setup() au lieu d'être dans loop() ?

Où est le reste du code ?
Par ce que le peu que tu en montre va pas faire grand chose à part compter 90 secondes....
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En fait je débute dans la programmation.

J explique mon cas, j'encadre une equipe de jeune qui va participer a la coupe de france de robotique. Moi meme je participe depuis quelques années, cependant je m'occupe de la mécanique et pas de la programmation.

Nous avons monté une structure en lego, et nous souhaitons la programmer avec une carte arduino : http://www.generationrobots.com/carte-arduino-mega-adk-pour-android,fr,4,ARDUINO-MEGA-ADK.cfm

et un nxt shield : http://www.generationrobots.com/nxshield-m-pour-arduino-mega-ou-arduino-adk-mindsensors,fr,4,NXShield-M-Arduino.cfm




le programme que je souhaite créer serait de la sorte :


Code:
- Programme en attente
- Choix de la couleur avec le bouton de nxt-shield - allumage de la led selon la couleur choisis
- si couleur = bleu -> programme bleu sinon -> programme rouge

Code:

- Programme Bleu
- Programme en attente
- Si touch 1 = true else :

- démarrage chrono 90 seconde (si chrono = 90 seconde alors on arrête tout)
- sous programme détection avant on
- sous programme avancer de 100 pas
- sous programme detection off
- sous programme tourner a droite de 45°
- sous programme détection avant on
- sous programme reculer de 20 pas
etc ...

si touch1 = false else on arrête tout : arrêt d'urgence

Code:
Void(détection avant on)

allumer le capteur sonar et vérifier tout les 10 ms que la distance de détection est inférieur a 30 cm sinon mettre programme en attente jusqu’à a que détection fini

Code:
- Void (avancer de x pas)

allumer les moteur en marche avant a vitesse 2
compter x pas sur les codeurs
a x pas -20% rallentir les moteur a vitesse 1
 a x pas arreter les moteur

Code:
- Void ( programme détection off)

éteindre le capteur sonar

Code:
- Void (tourner a droite de 45°)

allumer moteur 1 en marche avant et moteur 2 en marche arrière
compter x pas sur codeur 1 et -x pas sur codeur 2
a x pas -20% ralentir les moteur a vitesse 1
a x pas sur codeur 1 et -x pas sur codeur 2


Code:
- Void( reculer de X pas)

allumer les moteur en marche arriere a vitesse 2
compter -x pas sur les codeurs
a -x pas -20% ralentir les moteur a vitesse 1
a -x pas arrêter les moteur
« Last Edit: May 02, 2012, 01:45:49 am by SuPeRBaLoO » Logged

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 863
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

barbudor: et mince il ma pris de cour je serais plus le chouchou du prof euhh smiley-sad lol

Et SuperBaloO euh.. comment te dire que ton programme est faisable mais qu'on te ne le fera pas? on aide mais on fait pas ici !! lool ^^ essaye de faire des premières version et viens vers nous avec des problèmes concret pas des je voudrais faire ça.. et je sais pas le faire ^^ mais je comprend tes soucis les début en C c'est jamais onctueux :p, reviens avec une vrai problématique la tu en est a la phase conception pas dépannage, nous on sera la pour corrigé ton code une fois fait ^^

ps: le copier coller bête et méchant ça na rien de bon !!

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

Pages: [1] 2   Go Up
Jump to: