[Aide] Probleme avec Librairy Scheduler

Bonjour
j ai un arduino uno (MEGA328P ATMEGA16U2 sur windows

il fonctionne j ai deja fait des blink avec led et autres :slight_smile:

mon soucis est j arrive pas >:( à faire plusieur (void loop)
exemple (void loop1)
(void loop2)
(void loop3)
la console me dit:
error: 'yield' was not declared in this scope

ou

C:\Users\Naunaux\AppData\Local\Temp\ccAW6kCC.s:46: Error: constant value required
Erreur lors de la compilation.

je veut faire ça par exemple

Les fonctions :
startLoop()
yield()
sont marqué comme des erreurs

J ai changer de librairy et d environnement mais toujour idem
merci d avance

Bonjour,

La librairie que tu cites est pour l'Arduino Due (processeur Cortex 32bits), je ne pense pas qu'elle fonctionne sur le UNO.

The Scheduler library enables the Arduino Due to run multiple functions at the same time. This allows tasks to happen without interrupting each other.

chez moi: sous 1.61 avec DUE (1.64 est beaucoup plus "délicat" avec DUE si bien que je ne suis même pas passé en 1.65( pourquoi chercher des emm....s))

l'exemple multiblinks se compile sans prob

// Include Scheduler since we want to manage multiple tasks.
#include <Scheduler.h>

int led1 = 13;
int led2 = 12;
int led3 = 11;

void setup() {
   Serial.begin(9600);

   // Setup the 3 pins as OUTPUT
   pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT);
   pinMode(led3, OUTPUT);

   // Add "loop2" and "loop3" to scheduling.
   // "loop" is always started by default.
   Scheduler.startLoop(loop2);
   Scheduler.startLoop(loop3);
}

// Task no.1: blink LED with 1 second delay.
void loop() {
   digitalWrite(led1, HIGH);

   // IMPORTANT:
   // When multiple tasks are running 'delay' passes control to
   // other tasks while waiting and guarantees they get executed.
   delay(1000);

   digitalWrite(led1, LOW);
   delay(1000);
}

// Task no.2: blink LED with 0.1 second delay.
void loop2() {
   digitalWrite(led2, HIGH);
   delay(100);
   digitalWrite(led2, LOW);
   delay(100);
}

// Task no.3: accept commands from Serial port
// '0' turns off LED
// '1' turns on LED
void loop3() {
   if (Serial.available()) {
     char c = Serial.read();
     if (c=='0') {
       digitalWrite(led3, LOW);
       Serial.println("Led turned off!");
     }
     if (c=='1') {
       digitalWrite(led3, HIGH);
       Serial.println("Led turned on!");
     }
   }

   // IMPORTANT:
   // We must call 'yield' at a regular basis to pass
   // control to other tasks.
   yield();
}

Tu peux essayer ceci : Arduino Playground - Scheduler Library

Donc en gros la Librairy Scheduler n est pas faite pour mon arduino?

Et il n'y a pas un autre moyen pour faire plusieurs loop ?

Ben si :

bricoleau:
Tu peux essayer ceci : Arduino Playground - HomePage

Tu peux faire plusieurs choses à la fois en utilisant millis() plutôt que delay()
Voici comment j'aurai codé le programme Multiblinks sans scheduler

// Multiblinks (sans scheduler)

int led1 = 13;
int led2 = 12;
int led3 = 11;

void setup() {
   Serial.begin(9600);

   // Setup the 3 pins as OUTPUT
   pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT);
   pinMode(led3, OUTPUT);
}

void loop() {
  static unsigned long temps1=0,temps2=0;
  static bool etat1=false,etat2=false;
  
  unsigned long temps=millis();
  
  // traitement led 1 toutes les secondes
  if (temps>=temps1)
  {
    digitalWrite(led1,etat1 ? HIGH : LOW);
    etat1=!etat1;
    temps1=temps+1000;
  }
  
  // traitement led 2 toutes les 0.1 secondes
  if (temps>=temps2)
  {
    digitalWrite(led2,etat2 ? HIGH : LOW);
    etat2=!etat2;
    temps2=temps+100;
  }

  // Task no.3: accept commands from Serial port
  // '0' turns off LED
  // '1' turns on LED
  if (Serial.available()) {
    char c = Serial.read();
    if (c=='0') {
      digitalWrite(led3, LOW);
      Serial.println("Led turned off!");
    }
    if (c=='1') {
      digitalWrite(led3, HIGH);
      Serial.println("Led turned on!");
    }
  }
}

Tu peux aussi utiliser les interruptions. Il y a des tutoriaux sur le net

merci sa met plus les erreurs
je tester sur l arduino plus tard et je te dirai
merci

@kamill : attention ton code va dysfonctionner au bout de 49 jours, lorsque millis() va revenir à zéro

  unsigned long temps=millis();
  
  // traitement led 1 toutes les secondes
  if (temps>=temps1)
  {
    digitalWrite(led1,etat1 ? HIGH : LOW);
    etat1=!etat1;
    temps1=temps+1000;
  }

Le test doit se faire comme ceci, pour ne pas être perturbé par le rollover de millis() :

  unsigned long temps=millis();
  
  // traitement led 1 toutes les secondes
  if (temps - temps1 >= 1000)
  {
    digitalWrite(led1,etat1 ? HIGH : LOW);
    etat1=!etat1;
    temps1=temps+1000;
  }

De plus, il y a une autre petite subtilité à prendre en compte.
Le if ne se déclenche par forcément au bout de 1000 ms.
Il peut y avoir un léger retard.
Si le programme comporte d'autres portions qui prennent un peu de temps, on peut par exemple revenir dans le if au bout de 1050 ms.
Dans ce cas, il y a deux options de fonctionnement, selon le besoin :
a) l'itération suivante doit être programmée pour 1000 ms plus tard : on accumule les retards
b) l'itération suivante doit être programmée pour 950 ms plus tard : on rattrape les retards

ton code correspond au cas a)
le cas b) n'est guère plus compliqué à coder :

 temps1 += 1000;

bricoleau:
attention ton code va dysfonctionner au bout de 49 jours, lorsque millis() va revenir à zéro

Oui, mais je pense qu'il en aura marre de voir les leds clignotter avant 49 jours :slight_smile:

Certes oui.

Ma remarque était plutôt d'ordre général, car c'est le genre de fonctionnalité dont on a un besoin régulier, et pour laquelle chacun adopte une manière de coder reproduite un peu partout par automatisme.
Donc autant prendre les bonnes habitudes dès le départ.

Voici ce que j'avais trouvé il y a quelque temps sur la gestion du temps, multi thread etc.

http://www.siliciumcorp.com/developpement/arduino/gestion-du-temps/

J'ai jamais testé cette librairie mais en l'ayant parcouru elle me paraissait intéressante !

Bon courage.

c'est pas pour faire blink
plutôt plusieurs des pull down par exemple( effet télérupteur et autre chose) sans a avoir re-coder à chaque fois.
qui tourne en meme tempss

bricoleau:
Certes oui.

Ma remarque était plutôt d'ordre général, car c'est le genre de fonctionnalité dont on a un besoin régulier, et pour laquelle chacun adopte une manière de coder reproduite un peu partout par automatisme.
Donc autant prendre les bonnes habitudes dès le départ.

Edit 12/08
merci

mais j arrive avec l histoire du temp ( if (temps>=temps1) )

exemple

// Multiblinks (sans scheduler)

#define LED 12 //
#define LDR 0 //la LDR sur A0
int luz = 0;
int valor_sensor = 0;
int led1 = 13;
int led2 = 10;
int led3 = 9;

void setup() {
Serial.begin(9600);

// Setup the 3 pins as OUTPUT
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(LED,OUTPUT);
pinMode(LDR,INPUT);
}

void loop() {
static unsigned long temps1=0,temps2=0;
static bool etat1=false,etat2=false;

unsigned long temps=millis();

// traitement led 1 toutes les secondes
if (temps>=temps1)
{
valor_sensor = analogRead(LDR);
lum = (5.0 * valor_sensor * 100.0)/1024.0;

delay(300);

if (lum <= 490)
{
digitalWrite (LED, LOW);
}
if (lum > 490) /
{
digitalWrite (LED, HIGH);
}

temps1=temps+1000;
}

// traitement led 2 toutes les 0.1 secondes
if (temps>=temps2)
{
digitalWrite(led2,etat2 ? HIGH : LOW);
etat2=!etat2;
temps2=temps+100;
}

// Task no.3: accept commands from Serial port
// '0' turns off LED
// '1' turns on LED
if (Serial.available()) {
char c = Serial.read();
if (c=='0') {
digitalWrite(led3, LOW);
Serial.println("Led turned off!");
}
if (c=='1') {
digitalWrite(led3, HIGH);
Serial.println("Led turned on!");
}
}
}

sa fonctionne pa

Bonjour,

Ton programme ne se compile pas

  • ta variable lum est déclarée comme luz
  • sur la ligne if (lum > 490), il y a un / à la fin

A oui j ai renommer pour le post faire plus simple...

donc sa ce compil mais sa fonctionne pas
Seulement la led2 qui clignote. .

tu n a pas un code un peu plus simple. .
pour simuler

void loop()
Void loop2()
Void loop3()

merci

Ton test me parait douteux.
Même par forte luminosité, ça m'étonnerait que ça dépasse 4.9V.
Qu'est ce que le delay(300) vient faire là?
Supprime le délai et met un Serial.println(lum) après la lecture pour voir la valeur mesurée.
De plus indente correctement ton programme si tu veux y comprendre qqchose.

Mon code fonctionne mais pas en multitache..
je veux juste aprenddre a faire du multitache sans scheduler c est tout.. tu peut prendre un exemple plus simple sinon.
edit:
Ok sa fonctionne
un dark sensor + un blink
mais j ais pas compris le calcul du temps.