bonjour et merci de me lire
mon probleme:
je souhaite generer 5 variables ou commander 5 sorties dans un ordre precis
mise high d'un inter (mise en service)
au temps zero = v1 high pendant 1 minute ensuite v2 high 1 minute puis v3 high 1 minute, v4 high 1 minute, v5 high 1 minute et on recommence jusqu'a la mise low de l'inter
quelqu'un a t'il un bout de code ??
merci a tous
Renseignes toi sur millis
je ne suis que débutant,
mais je verais quelque chose de comme sa
long temps = millis();
if(temps >= 60000)
{
// et là, la fonction
temps = 0;
}
à inclure et a essayer
Ton code n'entrera dans la boucle 60s aprés le démarrage de l'arduino.
Si tu veux attendre ça donne plutôt :
long temps = millis();
if(temps >= temps + 6000) // 6s
{
}
else if( temps >= temps + 8000 ) // 8s
{
}
Bonjour les copains,
Le sujet a déjà été abordé, mais je n'arrive pas à retrouver le lien.
Je peux te proposer trois programmes qui ici m'ont servi comprendre les divers moyens de gérer le temps avec le langage C d'Arduino. Ils ont l'avantage de fonctionner. Tu pourras les télécharger, voir ce qu’il font, puis, décortiquer les instructions pour adapter à tes besoins.
Programme 1
/* Programme pour la gestion du temps sur Arduino sans utiliser dealay(). */
#define LED 13
#define TEMOIN_de_boucle 8
#define DELAI 1000
#define TEMPO_courte 100
// Variables globales.
boolean Etat_LED = false, Bascule_de_boucle = false;
long Ancienne_Horloge = 0 , Ancien_temoin = 0;
unsigned long Horloge_actuelle;
void setup() {pinMode(LED, OUTPUT); pinMode(TEMOIN_de_boucle, OUTPUT); }
void loop() {
Horloge_actuelle = millis();
if(Horloge_actuelle - Ancien_temoin > TEMPO_courte)
{Bascule_de_boucle = 1 - Bascule_de_boucle; Ancien_temoin = Horloge_actuelle;}
digitalWrite(TEMOIN_de_boucle, Bascule_de_boucle);
if(Horloge_actuelle - Ancienne_Horloge > DELAI)
{Etat_LED = 1 - Etat_LED; Ancienne_Horloge = Horloge_actuelle;}
digitalWrite(LED, Etat_LED); }
Programme 2
/* Programme pour tester la génération du temps sur Arduino.
ATTENTION : Toute réactivation de la ligne série USB provoque un redémarrage, donc
la perte de la valeur du Timer 0 qui est remis à zéro. */
// Variables globales.
unsigned long HORLOGE_SYSTEME;
void setup(){ Serial.begin(115200); }
void loop(){
Serial.print("Temps "); Serial.print(char(233));
Serial.print("coul"); Serial.print(char(233)); Serial.print(" : ");
HORLOGE_SYSTEME = millis();
// Affiche sur la ligne série USB le temps écoulé depuis le redémarrage du programme.
Serial.println(HORLOGE_SYSTEME/1000); delay(1000); // Un affichage par seconde.
}
// INFINI: goto INFINI; }
Programme 3
#define TEMPO 600 // Dix minutes = 600 secondes.
// Variables globales.
unsigned long DUREE_ECOULEE, TOP_CHRONO;
void setup(){ Serial.begin(115200); TOP_CHRONO = millis()/1000;}
void loop(){
Traiter_toutes_les_dix_minutes(); }
void Traiter_toutes_les_dix_minutes() {
DUREE_ECOULEE = (millis()/1000) - TOP_CHRONO;
if (DUREE_ECOULEE == TEMPO)
{ Serial.print("Heure systeme = "); Serial.println(millis()/1000);
TOP_CHRONO = millis()/1000;} }
Je n’ai pas le temps actuellement de créer du code pour ton problème spécifique, mais ce qui précède devrait t’aider.
Amicalement : Nulentout.
exact j'ai deja tester sur delay mais effectivement si je fait vos applic je n'obtiens pas le but rechercé
mon apli doit donc sequencer mes sortie un peut comme un cheniillard
v1 immediat pendant 1mn puis v2 pendant 1mn etc arrivé a la fin de la minute de v5 on repart sur v1 et
en gros v1 1mn high puis 4mn low etc n'y a t'il pas une possibilite de code qui une fois v1 lancé demmare v2 sur le front decendant etc
mois aussi je debute
bonjour
suite a un precedent post je modifie ma demande
je souhaite un genre de clignotant et je bute sur divers codes que l'on m'a posté.
une led doit etre alumée 1Mn et eteinte pendant 4Mn puis le cycle recommence.
merci si quelqu'un a un bout de code, sans utilisation de Delay()
Je ne l'ai jamais fait mais je l'ai lu et je pense que cela peut fonctionner.
Si tu as une horloge sauvegardée (RTC) qui délivre un signal à 1 Hz tu peux t'en servir comme horloge extérieure au Timer 2 (c'est le seul qui accepte une horloge extérieure).
Avec un timer 8 bit tu compter jusqu'a 256 * 1 seconde soit 16 seconde de marge pour faire 4mn.
C'est tout ce que j'ai en rayon.
bon c'est vraiment a la grosse mais j'ai pas tester!
#define nb_inter 6
byte i=0;
int temp=0;
int tempo=600;//pour 6s
void setup(){
for (i=0,i<nb_inter,i++){
pinmode(i+x,output);//x etant la sortie a la quel tu met l'inter 1}
void loop(){
digitalwrite(i,HIGH);
if ( millis()>=temp+tempo){
digitalWrite( i,LOW);
temp=millis();
i++;
if(i>=nb_inter){i=0;
}
}
J'ai fait une classe là dessus. Tu peut juste corriger en fonction de ce qu'on m'a indiqué dans le post.
http://forum.arduino.cc/index.php?topic=241441.msg1731713#msg1731713
Il suffit de regarder les exemples qui sont installés avec l'IDE arduino. Il y a un programme qui s'appelle BlinkWithoutDelay qui fait ce que tu veux
merci a tous
toutes les astuces donnees sont le bienvenue
mais pour moi elle donnent toute le meme resultat
la duree HIGH de la led est toujour identique a la duree LOW seule les duree changent
mon besoin je le rappelle est HIGH 1 minute - LOW 5 minutes
mon test
fonctionne 1 cycle
au deuxieme la led reste HIGH
#define TEMPO 360 // 5 minutes = 360 secondes.
unsigned long DUREE_ECOULEE, TOP_CHRONO;
boolean etat_led;
unsigned long temps;
byte et_led1=0;
byte top=0;
int led=11;
void setup(){
pinMode(led, OUTPUT);
etat_led = 1;
digitalWrite(led, etat_led);
TOP_CHRONO = millis()/1000;
}
void loop(){
et_led1=digitalRead(led);
if(top==LOW){
Traiter_une_minute();
}
if(top==HIGH){
Traiter_cinq_minutes();
}
}//fin loop
void Traiter_une_minute() {
// if(et_led1==HIGH){ balise(); }
if(millis()/1000 - temps > 60)
{
etat_led = !etat_led; //on inverse l'état de la LED
digitalWrite(led, etat_led); //on allume ou éteint
temps = millis()/1000; //on stocke la nouvelle heure
top=HIGH;
delay(100);
}
}
//-------------------------------------------------------------------
void Traiter_cinq_minutes() {
// if(et_led1==HIGH){ balise();}
DUREE_ECOULEE = (millis()/1000 - TOP_CHRONO);
if (DUREE_ECOULEE == TEMPO){
TOP_CHRONO = millis()/1000;
delay(100);
top=LOW;
}
}
Voilà la boucle principale de BlinkWithoutDelay
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
Il suffit de changer interval dans les 2 branches du if
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW){
ledState = HIGH;
interval = Temp_Low;
}else{
ledState = LOW;
interval = Temp_High;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
A toi de définir les 2 valeurs de temporisation
merci fdufnews et aux autres
tu m'a bien avancé
cela a l"air de fonctionner, et en utilisant milli() je risque un overflow au bout de combien de temps ?
voici le code que j'ai entré
int ledPin=11;
boolean ledState=0;
#define Temp_Low 60
#define Temp_High 240
int interval=0;
unsigned long previousMillis;
void setup(){
pinMode(ledPin, OUTPUT);
ledState = 0;
}
void loop(){
unsigned long currentMillis = millis()/1000;
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW){
ledState = HIGH;
interval = Temp_Low;
}else{
ledState = LOW;
interval = Temp_High;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
}
Avec millis le compteur du microcontrôleur recyclera tous les 49,71 jours.