besoins d'aide pour utiliser la fonction millis();

bonjour je souhaite utiliser la fonction millis(); dans un programme sauf que celle ci ne fonctionne pas ou alors je la code mal, j’ai regarder pleins de vidéo et de forum expliquant comment faire mais je n’y arrive toujours pas

Can you show your best attempt?

Pouvez-vous montrer votre meilleure tentative?

Il faudrait quand même être plus précis là ^^'

Bienvenue,

Montre ton code :slight_smile:

Voici mon code :

#include <Servo.h>
Servo servo;

long temps_reference;
int angle_initial = 0;
int angle_final = 180;
bool servo_pos = digitalRead(9);

void setup() {
Serial.begin(9600);
servo.attach (9);
servo.write(angle_initial);
temps_reference = millis();
}

void loop() {
if (millis()>(temps_reference + 10000)){
if (servo_pos = 0){
servo.write(angle_final);
temps_reference = millis();
}
else {
servo.write(angle_initial);
temps_reference = millis();
}

}

}

Et donc le problème est ?

le code ne fonctionne pas mon cerveau moteur ne fait pas le tour complet de 0 à 180 ou de 180 à 0.
il fait seulement un mouvement avant arrière très faible

ou alors pouvez vous juste me proposer un autre programme mon but est juste de positionner le servo sur une position (0 degré) d'attendre 10 seconde puis que le servo se positionne sur une deuxième position (180 degré), qu'il attende encore 10 sec pour retourner à 0 degré etc.

if (servo_pos = 0)

La comparaison se fait avec ==

if (servo_pos == 0)

Et pour millis, il est préférable de faire comme ça:

if (millis() - temps_reference >= 10000UL){

Et changer la variable

long temps_reference;

en

unsigned long temps_reference;
// ou
uint32_t temps_reference;

Merci beaucoup mais même après ces modification le problème persiste :confused:

Mais le plus gros problème de ton code, c’est que ta variable servo_pos ne change jamais de valeur, tu l’assignes au tout début du programme et c’est tout (d’ailleurs il ne faut pas faire ça, il faut utiliser digitalRead à l’intérieur d’une fonction), et quel est le but de cette variable?

Essaie ça:

#include <Servo.h>
Servo servo;

uint8_t const angle_initial = 0;
uint8_t const angle_final = 180;
uint8_t servo_pos = angle_initial;

void setup()
{
  Serial.begin(9600);
  servo.attach (9);
  servo.write(servo_pos);
}

void loop()
{
  static uint32_t temps_reference = millis();

  if (millis() - temps_reference >= 10000UL)
  {
    if (servo_pos == angle_initial)
    {
      servo_pos = angle_final;
    }
    else
    {
      servo_pos = angle_initial;
    }
    
    temps_reference = millis();
    servo.write(servo_pos);
  }
}

j'ai mis le digitalRead pour dire que quand le servo est a telle position attendre 10 sec et le renvoyer à telle position

en gros mon programme avec la fonction delay() est tout simplement :

void loop() {

servo.write(angle_initial);
delay(10000);
servo.write(angle_final);
delay(10000);
{

Je ne sais pas si tu as vu mais j’ai mis un exemple dans mon précédent message

oui j'au vu merci mais toujours le même problème mon serco fait des mouvement toute les 10 secondes mais il fait un avant arriere comme si on lui demadais d'executer servo.write(angle_initial) et servo.write(angle_final) en meme temps

Bonjour,
Est-ce que ça ça fonctionne?

void loop() {
servo.write(angle_initial);
delay(10000);
servo.write(angle_final);
delay(10000);

parceque le code proposé par Guix devrait être fonctionnel.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.