distributeur croquettes avec un servo comment faire une boucle avec pause 4h00

Bonjour , j'ai besoin de votre aide , j'ai ce programme qui tourne pour faire un allé retour de servo afin de faire tomber via une guillotine horizontale une dose de croquette dans la gamelle des chats.L'idee est de refaire cette sequence toute les 4 h par exemple , je seche , la fonction delay pourraie fonctionner mais je la trouve pas pratique et surtout impresice. (carte uno et carte mega).

::slight_smile: merci


// CROQUETIME CATS
// projet distribution croquette pour chat avec servo
// il faut faire une sequence toute les 4 heures par exemple

#include <Servo.h>

Servo myservo;

int pos = 0; // variable pour la position du servo

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
for(pos = 0; pos <= 180; pos += 1) // va de 0 degrees a 180 degrees
{ // avec des pas de 1 degre
myservo.write(pos); // dit au servo d aller en position en fonction de la variable 'pos'
delay(15); // pause 15ms
}
for(pos = 180; pos>=0; pos-=4) // va de 180 degres a 0 degrees
{ // avec des pas de 4 degrees donc retour rapide
myservo.write(pos); // dit au servo d aller en position en fonction de la variable 'pos'
delay(15); // pause 15ms
}
}

SAlut,

malheureusement c'est inhérent au materiel et tu ne pourras pas avoir plus précis. Il te faut une horloge temps réel (acronyme anglais = RTC) si tu veux être plus exact.

ARTNOW:
... la fonction delay pourraie fonctionner mais je la trouve pas pratique et surtout impresice. (carte uno et carte mega).

bonjour
si tu veux actionner à des heures precises , comme indiqué par B@tto il faut en passer par une RTC (en ayant aussi à l'esprit que les RTC basiques dervent pas mal aussi).

si c'est juste une durée de temps , tu peux utiliser millis() et tester sa derive sur une periode longue pour ajuster la precision en introduisant un facteur correctif.
en theorie il y a 3600000 millis() par heure , en pratique çà peut allegrement varier selon la BdT utilisée sur ton arduino

En même temps pour nourrir le chat on a pas besoin d'avoir 4h à la seconde près.
Il vaut mieux utiliser millis() pour faire la temporisation (cela ne rendra pas plus précis mais autorise des ajustements en interactif). Il suffit ensuite d'affiner le temps en fonction de l'usage pour coller au délai que tu veux.

Hors sujet, la guillotine n'est pas très fiable pour contrôler la sortie des croquettes.
Une vis sans fin risque moins de se bloquer.

Dans les RTC, Un DS3231 ne coûte que quelques euros et fera parfaitement l'affaire, avec une très faible dérive dans le temps.

fdufnews:
En même temps pour nourrir le chat on a pas besoin d'avoir 4h à la seconde près.

On voit bien que tu ne connais pas mon chat ;D

C'est un coup à se faire rappeler à l'ordre

Même si ton chat est exigeant, je pense que la précision obtenue avec millis() est suffisante

Si la carte est équipée d'un quartz precis à 10ppm ça fait une erreur potentielle de 0.14s si c'est un résonateur céramique à 100 ppm ça fait une erreur de 1.4s

Merci pour vos reponses .

Je vais surment partir sur un systeme de goulotte avec cylindre camenbert pour fractionner les doses de croquettes, je reviens vers vous si besoin , merci à tous :wink:

Bonsoir , pouvez vous me dire ou ecrire la fonction millis() , eventuellement en corigeant mon proramme , cela serait sympas , merci

https://www.arduino.cc/en/Reference/Delay

essaye ça pour voir
en fait millis() est égale à une valeur qui augmente toutes les millisecondes

// CROQUETIME CATS 
// projet distribution croquette pour chat avec servo 
// il faut faire une sequence toute les 4 heures par exemple

#include <Servo.h> 
 
Servo myservo;  
              
int t1=0;       // mémoriser le temps 
int pos = 0;    // variable pour la position du servo 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  t1=millis();        // la distribution se fera dans 4h apres la mise sous tension 
} 

 
void loop() 
{ 
  int time=millis(); // lecture du temps qui passe
  
  if (time > t1+(1000*3600*4) ) { t1=time;  // 1000=1s 3600=1h 4 pour 4h, toutes les 4h on exécute le prog suivant
  
    for(pos = 0; pos <= 180; pos += 1) // va de 0 degrees a 180 degrees 
      {                                  // avec des pas de 1 degre 
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos' 
        delay(15);                       // pause  15ms  
      } 
    for(pos = 180; pos>=0; pos-=4)     // va de  180 degres a  0 degrees 
      {                                  // avec des pas de 4 degrees donc retour rapide
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos' 
        delay(15);                       // pause  15ms
      } 
   }

}

fifi82:
essaye ça pour voir
en fait millis() est égale à une valeur qui augmente toutes les millisecondes

  int time=millis(); // lecture du temps qui passe

if (time > t1+(100036004) ) { t1=time;  // 1000=1s 3600=1h 4 pour 4h, toutes les 4h on exécute le prog suivant

bonsoir
ça ne peut pas fonctionner
tes variables time et t1 seront debordées

Il faut utiliser des unsigned long pour utiliser millis() et les constantes doivent être typées long aussi sinon la constante sera calculée sur un int.

(1000L*3600L*4L)

oui j'avais pas pensé au débordement j'ai modifier en fait toute les secondes j'incrémente t2 au lieu de travailler avec les millisecondes,

avec "int" t2 peut supporter un peu plus de 9h...

// CROQUETIME CATS 
// projet distribution croquette pour chat avec servo 
// il faut faire une sequence toute les 4 heures par exemple

#include <Servo.h> 
 
Servo myservo;  
              
int t1=0;       // mémoriser le temps 
int pos = 0;    // variable pour la position du servo 
int t2=0;       // compte les secondes qui passe
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  t1=millis();        // la distribution se fera dans 4h apres la mise sous tension 
} 

 
void loop() 
{ 
  int time=millis(); // lecture du temps qui passe
  if (time > t1+1000 ) { t1=time; t2++; } // toute les secondes on incremente t2
  
  if (t2=4*3600) ) { t2=0;  // 4 pour 4h, 3600 pour 1h, toutes les 4h on exécute le prog suivant
  
    for(pos = 0; pos <= 180; pos += 1) // va de 0 degrees a 180 degrees 
      {                                  // avec des pas de 1 degre 
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos' 
        delay(15);                       // pause  15ms  
      } 
    for(pos = 180; pos>=0; pos-=4)     // va de  180 degres a  0 degrees 
      {                                  // avec des pas de 4 degrees donc retour rapide
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos' 
        delay(15);                       // pause  15ms
      } 
   }

}

fifi82:
oui j'avais pas pensé au débordement j'ai modifier en fait toute les secondes j'incrémente t2 au lieu de travailler avec les millisecondes,

avec "int" t2 peut supporter un peu plus de 9h...

// CROQUETIME CATS 

// projet distribution croquette pour chat avec servo
// il faut faire une sequence toute les 4 heures par exemple

#include <Servo.h>

Servo myservo;  
             
int t1=0;       // mémoriser le temps
int pos = 0;    // variable pour la position du servo
int t2=0;       // compte les secondes qui passe
void setup()
{
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 t1=millis();        // la distribution se fera dans 4h apres la mise sous tension
}

void loop()
{
 int time=millis(); // lecture du temps qui passe
 if (time > t1+1000 ) { t1=time; t2++; } // toute les secondes on incremente t2
 
 if (t2=4*3600) ) { t2=0;  // 4 pour 4h, 3600 pour 1h, toutes les 4h on exécute le prog suivant
 
   for(pos = 0; pos <= 180; pos += 1) // va de 0 degrees a 180 degrees
     {                                  // avec des pas de 1 degre
       myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
       delay(15);                       // pause  15ms  
     }
   for(pos = 180; pos>=0; pos-=4)     // va de  180 degres a  0 degrees
     {                                  // avec des pas de 4 degrees donc retour rapide
       myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
       delay(15);                       // pause  15ms
     }
  }

}

bonsoir
tu a toujours int t1 qui reçois millis()
pourquoi ne pas simplement passer en unsigned long ?

j'ai modifier avec unsigned long, c'est effectivement mieux, après c'est un exemple il y à certainement d'autre moyen de faire

j'ai mis aussi unsigned int pour t2 ce qui permet de régler la tempo à plus de 18h largement suffisant pour cette utilisation.

// CROQUETIME CATS 
// projet distribution croquette pour chat avec servo 
// il faut faire une sequence toute les 4 heures par exemple

#include <Servo.h> 
 
Servo myservo;  
              
unsigned long t1=0;       // mémoriser le temps 
int pos = 0;    // variable pour la position du servo 
unsigned int t2=0;       // compte les secondes qui passe
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
  t1=millis();        // la distribution se fera dans 4h apres la mise sous tension 
} 

 
void loop() 
{ 
  unsigned long time=millis();    // lecture du temps qui passe
  if ( time > t1+1000 ) { t1=time; t2++; } // toute les secondes on incremente t2
  
  if (t2=4*3600) ) { t2=0;  // 4 pour 4h, 3600 pour 1h, toutes les 4h on exécute le prog suivant
  
    for(pos = 0; pos <= 180; pos += 1) // va de 0 degrees a 180 degrees 
      {                                  // avec des pas de 1 degre 
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos' 
        delay(15);                       // pause  15ms  
      } 
    for(pos = 180; pos>=0; pos-=4)     // va de  180 degres a  0 degrees 
      {                                  // avec des pas de 4 degrees donc retour rapide
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos' 
        delay(15);                       // pause  15ms
      } 
   }

}

fifi82:
j'ai modifier avec unsigned long, c'est effectivement mieux, après c'est un exemple il y à certainement d'autre moyen de faire

j'ai mis aussi unsigned int pour t2 ce qui permet de régler la tempo à plus de 18h largement suffisant pour cette utilisation.

// CROQUETIME CATS 

// projet distribution croquette pour chat avec servo
// il faut faire une sequence toute les 4 heures par exemple

#include <Servo.h>

Servo myservo; 
             
unsigned long t1=0;      // mémoriser le temps
int pos = 0;    // variable pour la position du servo
unsigned int t2=0;      // compte les secondes qui passe
void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  t1=millis();        // la distribution se fera dans 4h apres la mise sous tension
}

void loop()
{
  unsigned long time=millis();    // lecture du temps qui passe
  if ( time > t1+1000 ) { t1=time; t2++; } // toute les secondes on incremente t2
 
  if (t2=4*3600) ) { t2=0;  // 4 pour 4h, 3600 pour 1h, toutes les 4h on exécute le prog suivant
 
    for(pos = 0; pos <= 180; pos += 1) // va de 0 degrees a 180 degrees
      {                                  // avec des pas de 1 degre
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
        delay(15);                      // pause  15ms 
      }
    for(pos = 180; pos>=0; pos-=4)    // va de  180 degres a  0 degrees
      {                                  // avec des pas de 4 degrees donc retour rapide
        myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
        delay(15);                      // pause  15ms
      }
  }

}

Salut , merci beaucoup je teste et je vous dit ce que cela done .cool

hello , j'ai tester , cela ne fonctionne pas , le servo tourne en boucle , sans pause , il y avait aussi une erreur sur une ligne je pense à cause d'une parenthese en trop , j'ai ajouter quelques lignes pour lire les valeur sur com5 , pourtant l'incrementation se fait bien , je ne vois pas pourquoi cela ne fonctionne pas ???

Bonjour,
remplace

if (t2=4*3600)

par

if (t2 == 4*3600)

ou

if (t2 >= 4*3600)

ça devrait mieux fonctionner...