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).
: 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
}
}
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.
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
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
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
}
}
}
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.
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
}
}
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 ???