Calcul durée du jour -lever & coucher du soleil

Bonsoir Gérard,

Merci, c’est gentil de vouloir m’aider, mais je ne suis pas convaincu.

Sauf si ma traduction est mauvaise, cette équation fonctionne sous le tableur de LibreOffice. Et les résultats que j’obtiens de ce fichier sont cohérents et vérifiés. Donc, c’est qu’elle est acceptable au moins par certain langages. Après c’est possible qu’elle dépasse la puissance de calcul ou la mémoire de Python, je ne sais pas.

Je ne peux pas décomposer le calcul de la manière dont tu le dit, les fonction trigo sinus, cosinus, tangente (…) c’est pas comme les multiplications:
sinus(a + b) est différent de sinus(a) + sinus (b)
Mais effectivement, si je garde le fond de ton idée, il doit être possible de décomposer les équation. Hélas, ce n’est pas la seule équation qui soit d’une complexité similaire. Si je dois décomposer pour donner « une simplicité enfantine » à des équations de mécanique céleste alors d’une part je suis pas couché, d’autre part, je peux très certainement faire des erreurs et enfin je serais déçu que la puissance de calcul de python soit aussi faible.

Sauf erreur de lecture de ma part, dans cette équation, il n’y a pas de fonction « accolée » à une autre, mais des fonctions « incrustées » dans une autre.

escuses-moi mais, soit ton copier/coller n’a pas fonctionné, soit dans « math.asin(0,3978math.sin( » 0.3978 argument de math.asin est collé à la fonction math.sin
bon, wète end scie

1 « J'aime »

Pu…n!
Je suis passé à coté de ça!

Tu as raison!!
La multiplication est sous-entendue en écriture « humaine » mathématique et certains langages machine l’acceptent… mon erreur était là. Je le lisait sans le voir.

Merci beaucoup!

Une fausse joie…
C’est le copié collé qui a supprimé les *, il y sont bien dans mon programme.
:disappointed_relieved: :disappointed_relieved: :disappointed_relieved:

Bonjour,

Il doit y avoir 2 arguments retournés par l’expression entre parenthèses au lieu de 1 attendu par la fonction math.asin.
Dans mon cas, pour avancer dans le debug de programme, j’ouvre un interpreteur en ligne de commande dans un terminal et je test une à une mes commandes. Quand ça bloque sur une ligne, je la découpe en morceaux et envoi son résultat dans une variable, et je fais un print sur la variable. Une fois la syntaxe fonctionnelle, je la copie dans mon programme.

Bon courage.

A+

@jelopo
Oui, tu as raison…
J’ai utilisé ta méthode et j’ai compris:
pour écrire mes chiffres, j’ai utilisé des virgules au lieu de mettre des points, le programme a donc interprété ça comme une liste et non comme un chiffre décimal.

je continue la mise au point du programme… :rowing_man: :rowing_man:

Autre conseil, les erreurs Python sont très explicites en général. Un copier/coller de l’erreur dans un moteur de recherche Internet donne toujours de bonne pistes à défaut de la solution.

A+

J’aurais encore besoin de quelques lumières.

Mon programme fonctionne maintenant de façon partielle :yum:

L’idée c’est que ce programme puisse fonctionner « en manuel » pour un utilisateur ou en « automatique » pour le système. Donc, je pensais utiliser un fichier INI pour y stocker la longitude et la latitude, pour ce 1er programme. Il calcule la durée du jour, le lever de soleil, le coucher de soleil et d’autres paramètres, valables pour la journée et utiles pour d’autres programmes.

j’ai prévu que 2 programmes utilisent ses données:
-celui qui calcule la position du soleil (toute les 15minutes)
Celui-là, je le met un peu de coté pour le moment, en plus de la réalisation électronique de mon projet, j’ai pas envie de me taper tout de suite la réalisation mécanique du suiveur solaire + éventuellement le programme de gestion des masques…
-celui qui gère l’alimentation

Je suis en train d’essayer de comprendre, le fonctionnement des fichiers INI avec Python, je m’attendait à ce que se soit hyper-simple mais c’est pas le cas…

Sur la méthode générale et les fichiers d’échanges de données, auriez-vous des conseils?

Bonjour,

Pour lire un fichier de configuration, je conseille configparser configparser — Configuration file parser — Python 3.11.4 documentation.

Remplacer le nom du fichier, des sections et des arguments par des valeurs explicites

  • Le texte du fichier de conf /chemin/fichier.ini

    # Fichier de configuration
    [Section1]
    a=« valeur de a »
    c=15245.122

    [Section2]
    b=10
    d=z

  • Les parties de code du script Python

    # Import
    import configparser
    # Fonctions
    def read_conf ():
    «  »" Chargement du fichier de configuration «  »"
    conf=« /chemin/fichier.ini »
    param = {}
    config = configparser.ConfigParser()
    config.read(conf)
    param[« a »]=config.get(‹ Section1 ›, ‹ a ›)
    param[« b »]=config.get(‹ Section2 ›, ‹ b ›)
    return param
    # Programme
    params=read_conf()
    a = params[« a »]
    b = params[« b »]

    print (a)
    print (b)

Bonne bidouilles
A+

Bon, je m’excuse, mais je n’y arrive pas, voici l’erreur que j’ai:

Traceback (most recent call last):
  File "daylight.py", line 59, in <module>
params=read_conf()
  File "daylight.py", line 51, in read_conf
conf= daylight.cfg
NameError: name 'daylight' is not defined

Ce que j’ai écrit

import configparser
# Fonctions
def read_conf ():
    """ Chargement du fichier de configuration """
    conf= daylight.cfg
    param = {}
    config = configparser.ConfigParser()
    config.read(conf)
    param[latitude]= config.get(cst_locale, latitude)
    param[longitude]=config.get(cst_locale, longitude)
    return param
# Programme
params=read_conf()
latitude = params[latitude]
longitude = params[longitude]

Ce que je ne comprends pas:
tu utilises « param » et ensuite « params » (sans « S » puis avec un « S », pourquoi? « param », c’est ton « conteneur », c’est bien ça?)

note, j’ai préféré utiliser l’extension *.CFG plutôt que *.INI, ça évite que « Wine » (Windows virtuel pour système Linux) ouvre le fichier.

Bonjour,

1 - Pour « NameError: name ‹ daylight › is not defined », il manque les doubles quottes lors de la définition de conf (cf mon exemple)
2 - « param » et « params » sont 2 entités différentes au niveau Python.

  • « param » est un dictionnaire qui contient les clés/valeurs de chaque paramètre interne à la fonction read_conf
  • « params » est le résultat de la fonction read_conf et il contient le dictionnaire param grâce à « return param »
    Au final ils contiennent les mêmes données.
    Pour plus d’explications, se renseigner sur la fonction return dans une fonction et sur la portée des variables dans Python.

A+

Merci, j’ai corrigé, ça fonctionne.

Bonjour à nouveau.

D’autre questions:
1)je n’ai pas réussis à trouver quelle instruction donner pour terminer le programme, j’ai essayé break (mais ça fonctionne que pour « casser » une boucle), « quit() », « exit ». Là, je séche…
2)j’ai réussi à faire accepter des attributs à mon programme, par contre, les chiffres ne sont pas acceptés comme attributs. Donc, j’aimerais bien une idée (si possible) pour pouvoir le commander aussi à partir d’un simple clavier numérique à 20 touches. C’est possible de les piloter comme des claviers téléphoniques SMS peut être? Ou alors, peut être que les écrans LCD + 5 touches pourraient permettre quelque-chose?

Bonjour,

  1. Il n’y a pas d’instruction particulière pour terminer un programme séquentiel, on arrive à la fin et voilà.
    Pour un programme qui tourne en boucle, (while true) on interrompt la boucle avec break.
    Enfin pour gérer un code retour de fin de programme, on peut utiliser sys.exit(n) , il faut penser à importer la bibliothèque sys en début de script.

2)« j’ai réussi à faire accepter des attributs à mon programme ». Comment as-tu fait ? Quelles fonctions ? Quelles instructions? Je ne suis pas sûr de bien comprendre ta demande, je ne voudrait pas t’envoyer sur une fausse piste.

N.B. : Prends un peu de temps pour parcourir les liens donnés dans le topic de « Codeur incrémental et raspberry », ce sont des mines d’infos Python.

A+

  1. Ok, je vais utiliser sys.exit(n) (ouf! sauvé. Le début de ta réponse m’a fait peur :grin: )

  2. et bien si je tape:
    « daylight --manu » le programme m’affiche les résultats
    « daylight --conf » le programme stockera les coordonnées (longitude et latitudes)
    « daylight » « sans rien » le programme fait les calculs et stockera les résultats, pour le programme chargé de calculer la position du soleil (qui servira pour suivre le soleil avec les panneaux solaires) et pour éventuellement d’autres programmes
    +d’autres options, mais je simplifie.

J’ai utilisé « argparse.ArgumentParser() »
il me refuse « –chiffres », « –/chiffres » comme « attributs » (si ça s’appelle comme ça), donc je me demande comment je pourrais modifier les paramètres de fonctionnement de mon régulateur, une fois qu’il sera installé avec un petit écran LCD et un clavier numérique sur USB.

J’étais en train de regarder les livres en téléchargement libre (et légal)
Sujet: Sites FR sur Python
Et je vais me replonger dedans :wink: tout de suite…

Bonjour,

plutôt que d’utilsier cette syntaxe “daylight --chiffre”, appeler l’argement avec une valeur numérique
daylight --valeur n
avec n = un chiffre

Dans le programme ça devrait donner un truc du genre (choisir le type en fonction du type de variable numérique attendue).

parser.add_argument("-v", "--valeur", type=int, dest="chiffre", help="traite chiffre ")

Puis plus loin dans le programme gestion de l’option --valeur en vérifiant si la variable args.chiffre existe alors il affecte cette valeur à la variable chiffre.

   if args.chiffre
      chiffre=args.chiffre

Pas sûr de mon coup à 100% mais ça doit donner une bonne piste…

Edit : Lien sur la Doc en ligne

A+

Bon,j’ai essayé sans réussir, mais je crois que je suis parti sur une mauvaise piste en voulant utiliser des chiffres comme arguments. Je poursuis la mise au point du programme…

Encore besoin d’un petit coup de main sur un détail, apparemment, je n’utilise pas bien les « chemins relatifs ».

J’utilisais cette instruction

if os.path.isfile("daylight.cfg")    

mais cela ne fonctionne plus maintenant que mes fichiers sont « rangés » dans un dossier spécifique, que dois-je faire?

Bonjour,

Si le fichier cfg n’est plus dans le même répertoire, il faut le chemin complet du fichier, non ?

A+

Dans ce cas là, ça serait probable.

Mais mon fichier cfg est toujours dans le même répertoire que le fichier *.py, simplement, ces 2 fichiers ne sont plus dans le répertoire « user » mais dans un dossier commun.