Schema machine a état

bonjour,
je souhaite modifier le programme d une trappe en ajoutant des sécurités. il s agit d une trappe qui s ouvre quand on appuie sur un bouton vert et qui se ferme en appuyant sur un bouton rouge. Il y a par ailleurs une cellule photoelectrique qui détecte la nuit afin de fermer la trappe si oubli. Il y a une butée haute et une butée basse pour arrêter le moteur en fin de course. J avais fait un programme basique a l époque avec uniquement des if.... Je souhaite intégrer des sécurités, c est a dire si la trappe se ferme que le fil se bloque et que la butée basse n est pas atteinte, il faut que le moteur se coupe sinon la trappe fini par remonter et tout se casse. Je vais donc utiliser la fonction millis(). On m avait conseillé de suivre le tuto des machines a états et de faire un schéma avant toute chose. Je voulais avoir votre avis si le schéma est correct, pas trop de boucles ou de choses qui s avereront impossible a coder? J ai un doute sur la securité je ne sais pas ou la mettre, pour sortir de la securité il faut appuyer soit sur bouton vert pour ouvrir ou bouton rouge pour fermer. C est la première fois que je fais cela, soyez indulgent svp. J ai mis en vert les actions a chaque état et en rouge les conditions pour changer d état. Merci d avance pour votre aide
schema etats trappe.pdf (242,8 Ko)

ça sent le poulailler automatisé :slight_smile:
postez l'image directement dans le forum - on ne va pas télécharger un document... (enfin pas moi depuis mon iPhone)

Oui c est bien une trappe de poulailler que j avais fait il y a 2 ans.

je ne comprends pas trop cette transition

image

night illumination threshold?
illuminare du seuil de nuit

Je voudrais éviter que la trappe se ferme si jamais la luminosité baissait passagèrement comme avec le passage d un nuage par exemple. Alors j ai temporisé avec millis et si entre temps la luminosité réaugmente alors on retourne à l état précédent :grimacing:

@xfpd
Je suis français - je sais lire ce qui est écrit :slight_smile: (et votre traduction Google est fausse)

@jeanlouis54
La question est plus sur la pertinence de cette transition lorsque on est en début de fermeture par appui du bouton rouge

Il me selmbke qu’il faudrait des états pour les commandes utilisateurs qui prennent le pas sur les automatismes

J ai beaucoup de mal a retranscrire sur ces schémas ce que je souhaite faire, mais je pense que c est la base pour écrire un programme de cohérent.
Est ce que si je fais comme cela c est plus cohérent ?

Le schéma est une bonne idée mais il faut vraiment définir tous les états possibles

Je pense que “en fermeture” et “en fermeture forcée” (idem ouverture) sont des états distincts puisque les automatismes doivent être désactivés

Concernant les seuils - on met généralement un hysteresis pour éviter que la porte fasse le yoyo si La lecture analogique oscille juste autour du seuil.

Il vaut mieux tenir compte uniquement de la RTC et de l’heure théorique du lever et coucher de soleil pour la porte des poules plutôt que de la luminosité qui dépend de la météo

Tout à fait. C'est la solution que j'ai retenue et elle fonctionne très bien.
Avec une RTC et les fonctions standard sun_rise() sun_set().

Merci pour les conseils. Je ne sais pas ce que c est rtc. Je vais faire des recherches ainsi que pour la réalisation d un hysteresis. Je suis vraiment débutant. Cette trappe c est le seul projet que j ai fait pour le moment. En attendant il faut que je cherche bien tous les états possible.

RTC = real time clock. c'est un petit circuit qui donne l'heure (et qui marche avec une petite pile donc même si vous éteignez l'arduino l'heure est conservée). Par exemple une DS3231 est pas mal. J'utilise la bibliothèque Adafruit RTCLib avec ce module. il y' a deux classes additionnelles qui aident à gérer le temps (DateTime pour représenter un moment dans le temps et faire des opérations sur le temps et TimeSpan pour représenter une durée )

je dirais

  • ouvert
  • fermé
  • en ouverture
  • en ouverture forcée
  • en fermeture
  • en fermeture forcée
  • en erreur (nécessite l'intervention d'un opérateur)

Ah ok si je comprend bien il ne faut pas que je mette de OU dans les conditions pour changer d état. Il vaut mieux tout différencier.

Merci tout plein pour les conseils. Je vais pouvoir avancer. Je vous tiendrai au courant de l avancement.

En général, lorsque la porte se ferme, ou s'ouvre, un mécanisme de contrôle de porte n'a rien d'autre à faire qu'à attendre l'activation d'un contact de fin de course, ou un timeout.
Pour ma part j'ai simplement implémenté une fonction bloquante :

start = millis()
activer moteur
tant que fin de course non activé :
    si millis() - start > timeout :
        break
désactiver moteur

Je n'ai donc pas à gérer d'autres états que ouvert ou fermé.

on peut, à condition que les conditions de sortie de l'état ne dépendent pas de ce qui vous a emmené dans cet état.

Dit autrement, dans votre cas je n'imagine pas que si je demande de fermer en appuyant sur le bouton rouge (une des transitions :one:), le système commence puis s'arrête parce qu'il fait encore jour (transition :two:)

un schéma comme cela peut-être pour commencer à réfléchir aux transitions (je vous laisse réfléchir aux instructions à réaliser lors de la transition d'état)
(vite fait - je n'ai pas envisagé tous les cas sans doute)


(lors de l'allumage du système on ne sait pas trop dans quel état on est donc on va vers un état connu, par exemple ici on fait un "Homing" ouverture de porte.)

Merci je comprend mieux. Je sais maintenant comment démarrer :+1:t2:

au fait je viens de voir que sur mon dessin j'ai inversé fermeture et fermeture forcée

notez aussi ici que je n'ai pas d'autres moyen de sortie de ces états que le timeout ou la bonne arrivée de la porte à destination, donc ça pourrait n'être qu'un seul état. Mais si vous voulez tenir le bouton rouge tout le long de la fermeture par exemple ou pouvoir appuyer sur le bouton rouge pour arrêter la descente et garder la porte à moitié ouverte, alors avoir les 2 états séparés ça peut servir

C est pas grave je voulais déjà comprendre le principe. Au départ je ne savais pas qu on pouvait imbriquer les états comme cela ….
Après j utiliserai la fonction switch avec les états que j aurai mis dans enum. J essaierai sur simulateur. Vais y aller pas à pas. J ai souvenir d avoir voulu tout faire d un coup et après je ne trouvais pas ce qui ne marchait pas …..

Oui, je comprends que traduire le sens, en particulier les expressions familières, n'est pas la même chose que traduire des mots, mais j'espère que le sens peut être compris par le locuteur natif. ( : visage gêné : )

(Je voulais vous envoyer ceci par MP, mais vous l'avez désactivé.)