Arduino nano et servomoteur

Bonjour les amis.
J’ai un servomoteur (attach 9;) qui tourne de 0 à 45• tous les 30 minutes.
Ma question est, est-ce que c’est possible de créer un code qui va fait en sorte qu’il choisisse entre 29 minutes et 50 secondes et 30 minutes et 10 secondes?

Exemple:

Il est 6 heures du matin et je branche mon arduino nano sur un secteur de 5 volt et mon servomoteur commence sa rotation.
Tempo 1: ~ 6 heures ok
Tempo 2: 29 min et 54 sec~ 6 heures 29 min et 54 sec
Tempo 3: 30 min et 2 sec~ 6 heures 59 min et 56 sec
Tempo 4: 30 min et 7 sec~ 7 heures 30 min et 3 sec
Etc…

Ce que je veux dire par là, je veux que le servomoteur face un (high) entre 29 minutes 50 secondes et 30 minutes 10.
J’espère que j’ai été un peu clair.

S’il vous plaît les amis.

D’autres mon parlé de millis main ne m’ont jamais su donner les codes.

Je vous remercie d’avance.

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

——
Si vous ne souhaitez pas apprendre le Jobs and Paid Consultancy forum est plus adapté (écrire en anglais), et il faut prévoir un budget…

J'avoue pour moi c'est un peu clair. Un chronogramme aurait été plus compréhensible.

─  C'est un servo 270° ou un servo à rotation continu?
─  Si il commence sa rotation à l'heure H, il s'arrête quand?
─  Quel est son cycle? Aller retour? Aller + pause +retour....
─  Le temps est choisi par qui? Le pseudo hasard?
─  Le programme ne fait que cela (delay possible) ou doit-il faire autre chose pendant la demi-heure?
─  l'horloge de l'arduino est-elle suffisamment précise?

Bonjour,

la durée est choisie comment? Durée aléatoire?
Si c'est la cas il suffit de faire

  int duree=random(29*60+50,30*60+10);
  delay(1000l*duree);

Si ton programme ne fait rien d'autre, tu peux utiliser delay(), sinon il faut utiliser millis()

Quand le servo revient à 0 après avoir tourné à 40°?

Soit 20 s de battement.
Sur quelle période de temps ces 20 secondes doivent être garanties ?
L'horloge des cartes arduino n'est pas très stable -> delay() ou milli() mêmes défauts.
L'organe qui assure la précision de l'horloge n'est pas un quartz, mais un simple résonateur.

Sur des espaces de temps courts, c'est sûrement gérable, mais sur le long terme, il y aura obligatoirement des dérives.

Tant que tu ne descends pas au-dessous de la seconde, il faudra peut-être envisager une RTC DS3231 (fuir la DS1307).

Pour faire un choix entre ces diverses possibilités, il faut que tu donnes plus de détail sur ce que tu veux faire.
En l'état actuel de la description, il est très difficile de répondre.

Il n'y a pas code clé en main.
Par contre, il y a fourni avec l'IDE un exemple nommé "Blink without delay" qui explique très simplement l'utilisation de milli().

En gros :
On affecte le contenu de millis dans une variable.
A intervalle régulier on lit millis, on affecte son contenu dans une deuxième variable.
On fait la différence de ces deux variables. On fait les tests que l'on a à faire.

Note :
Voir dans l'exemple le choix de déclaration des variables qui est à respecter.
Il faut absolument passer par des variables intermédiaires avant de faire la différence.

pas compris le absolument ?

on peut faire

if (millis() - previousMillis >= interval) {
  previousMillis = millis();
  ...
}

Le "risque" étant limité à avoir franchi un seuil de 1ms entre la première et seconde lecture mais ça présente au moins l'avantage d'avoir arrondi dans ce cas à la ms réelle où le traitement est exécuté

Ben j'avais compris qu'en passant par des variables intermédiaires on évitait les soucis au débordement de millis().
Aurai-je rien compris, c'est tout à fait possible.

Le débordement est évité si on fait: millis() - previousMillis >= interval
Il ne l'est pas si on fait millis() > nextsMillis

On peut aussi faire

if (millis() - previousMillis >= interval) {
  previousMillis += interval;
  ...
}

Qui économise un appel à millis() et qui permet d'avoir une moyenne plus juste et marche mieux pour les tout petits intervalles

Oui ajouter interval permet de rattraper parfois un peu de retard et de garder le tempo

@68tjs ce qui compte c’est de faire une soustraction, pas une addition

Je voudrais au moins qu’il y ait 25 cycles.


Je suis obligé de définir moi-même les millis secondes alors que j’ai entendu parler de millis

Tu sais qu'il existe une documentation sur les fonctions arduino ?
https://www.arduino.cc/reference/en/

Il existe aussi plein de tutos et il existe aussi des moteurs de recherche, dont un sur ce forum.
Si tu tapes millis() dans la zone de recherche tu obtiens des réponses.

L'exemple "blink without delay" me semble assez clair.
Il existe aussi la fonction micro().

Pour revenir à ton sujet sur une période de 25 cycles de 20 s il n'y aura strictement aucun problème de dérive.

Merci beaucoup 68tjs. Je vais regader le lien.:pray:t3:

Bonjour Kamill,
Lorsque je mets mon arduino sous tension à 6h00 le servo fait de 0 à 45• puis revient à la position 0 en 1 seconde à peu près. Delay (1000). À 6h30, il refait la même chose. De 0 à 45• puis 0• et le tout en seconde etc… j’utilise mon servomoteur pour appuyer sur un bouton pour enclencher mon arrosoir puis l’éteindre toutes les demis heures.

Mon père fonctionne à l’ancienne car nous avons un grand champs de fleur sous serres.
Le truc c’est que mon père à un témoin qui affiche l’heure d’activation et l’heure de désactivation et il se demande comment je peux activer toutes les demi heures à la même seconde?
C’est pour ça que je demande votre aide pour savoir comment varier l’activation et désactiver toutes les demis heures en variant entre 29 et 31 minutes à peu près.:sweat_smile:.
S’il vous plaît et merci pour votre aide

Je ne veux pas que mon père sache que j’utilise un Arduino pour enclencher et désactiver. Il n’est presque jamais là! Il passe tous les dimanches. C’est difficile de travailler dans un champs car il yna de l’entretien, ramassage de feuilles mortes, labourées la terre et toutes les demis heures, je me tape 500m pour enclencher ou désactiver ce bouton. C’est une routine qui n’en fini pas.
J’ai choisi ce métier oui, mais je n’avais pas le choix.

Je veux juste un exemple de code avec millis pour varier les secondes d’appuies.
:pray:t3:
S’il vous plaît.

Avec ton cahier des charges simple. Redémarrage de la carte chaque jour, il n'y a pas d'accumulation de dérives et tu n'es pas à 2 mn près, tu peux réaliser avec milli().
Mais si tu veux aller plus loin avec des fonctions supplémentaires tu risques d'être vite bloqué, il me semble que le mieux est d'utiliser une horloge dite "RTC".

Je t'ai proposé une DS3231 et conseillé de ne surtout pas prendre une DS1307 qui est maintenant complètement dépassée, mais que l'on voit encore dans de nombreux tutos..

C'est un module qui fonctionne en commande I2C et dont il existe des bibliothèques qu'il suffit d'utiliser.
Surtout avant de partir dans ton programme, il faut commencer par faire quelques-uns des exemples fournis avec la bibliothèque pour t'assurer que les branchements sont bons et que le module fonctionne.

Ce produit (DS3231) est doté de deux alarmes programmables qui pourrait te simplifier le travail.

Vu que le montage est hors tension la nuit et qu'il n'y a rien d'autre, C'est pas la peine d'aller chercher loin. Les delay( ) suffisent.

Tout est dit.

Expliquez à votre père que vous avez automatisé cette tâche et que le temps gagné vous permet d’être plus sur le terrain… je ne vois pas le problème…

(Il a automatisé le contrôle on dirait…)

Au vu du projet, il y a deux façons de voir la 1/2 heure:
‐ soit la temporisation est entre 29 minutes et 50 secondes et 30 minutes et 10 secondes, mais avec un risque de cumul: si pas de chance, et que plusieurs fois on a le temps le plus court (ou le plus long), le départ est à 6h, mais 25 cycles après on a décalé de 250s
‐ soit la base est de 30 mn mais le déclenchement se fait à +/-10s

 

A la mise sous tension, la série , par défaut, est toujours la même. On a alors si on démarre toujours à 6h00mn00s exactement les mêmes déclenchement les jours suivants (par exemple 6 heures / 6 heures 29 min et 54 sec / 6 heures 59 min et 56 sec / 7 heures 30 min et 3 sec TOUS les jours).

Pour éviter cela, avec une RTC, on peut utiliser l'heure pour avoir une série différente chaque jour, sans TTC, on utilise une lecture d'une broche analogique mais il va y avoir que quelques séries, il est alors probable que ce soit les mêmes intervalles plusieurs jours de suite.

 

A réfléchir...