astrolivier
Membre-
Compteur de contenus
124 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Téléchargements
Blogs
Boutique
Calendrier
Noctua
Tout ce qui a été posté par astrolivier
-
Encore une station météo sous Ascom.... mais avec son petit plus!
un sujet a posté astrolivier dans Logiciels
Update 5 du 10/08/2025: Voici la version finale de ce projet que vous pouvez telecharger ici: esp32AstroV6.1.3_finale.zip PS: Ne pas oublier de renseigner correctement les champs SSID et Mot de passe dans l'onglet 'variablesWIFI' afind'éviter d'avoir à reflasher l'esp32 via le port USB! Cette dernière update vise uniquement à modifier le comportement du programme en cas de défaillance d'un des capteurs. En effet, en cas de panne de l'un des composants, tout le programme tombe à l'eau, plus de visiblilité sur la page web, et cela sans savoir explicitement quel capteur est défaillant. Avec cette update, si un capteur tombe en panne ou n'arrive pas à se connecter pour une raison ou une autre, alors il renvoi une indication (-999) sans affecter le comportement des autres capteurs. Cela évite de bloquer tout le programme et permet en plus d'identifier quel capteur est défaillant simplement en visualisant la page web. Ce projet touche à sa fin. Il me semble que ce projet est suffisament abouti, qu'il permet d'être modifié, upgradé etc... par qui conque le souhaite. Ce projet m'a permis d'apprendre bien des choses, tant sur la programmation, le comportement de l'esp32, et tout un autre tas de choses. En espérant que ce projet puisse servir à certains Ne pas hésitez à venir poser des questions en cas de nécessité, je me ferai un plaisir d'aider. Olivier ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ UPDATE 4 du 08/10/2025: Je vous propose une nouvelle version du firmware de l'esp32, que vous pouvez telecharger ici: PS: Ne pas oublier de renseigner correctement les champs SSID et Mot de passe dans l'onglet 'variablesWIFI' afind'éviter d'avoir à reflasher l'esp32 via le port USB! 1) Reprise complète du mode de gestion de l'économie d'énergie. Malgré une nette amélioration je n'étais pas encore satisfait. J'ai donc encore poussé le vice un peu plus loin. Pour les capteurs BME280, MLX90614 et SHT3x, j'ai implémenté le mode sleep qu'ils permettent par le protocole i2c. Cela n'était pas implémenté au paravant. Cela implique que les capteurs sont réveillés uniquement lors de la lecture puis rééteints. Cela permet d'avoir une utilisation energetique que sur une phase de 100ms sur une période de 20s, ce qui a pour conséquence une énorme diminution de la consommation et donc une augmentation drastique de la durée de vie de la batterie. Seul le TSL2591 ne dispose pas de cette fonctionnalité. Pour pouvoir couper le capteur on peut simplement relier l'alimentation du capteur à une sortie de l'esp32 et de passer à l'état haut ou bas selon l'effet voulu. Je n'ai pas fait cette modification sur ma platine, donc si vous souhaitez faire cela, n'oubliez pas dans le code principal de supprimer le pin utilisé à la ligne 155, sinon la pin restera inutilisable puisque désactivée par défaut. Par ailleurs, lorsque l'esp32 est en mode sleep, tous les websockets, MQTT et autres protocoles sont désactivés, améliorant encore la consommation inutiles dans ces phases là. 2) Implémentation de la sonde SHT3x. Le BME280, bien que permettant l'ensemble des mesures de température ambiante, pression, humidité et donc après calcul du point de rosée, je n'étais à l'aise de laisser ce capteur dans le bouclier exterieur. Un ami m'a donné une sonde SHT3x qui ne permet de connaitre que la température ambiante et l'humité, et donc après calcul du point de rosée. Cependant cette sonde est réellement faite pour aller en milieu "extérieur". J'ai donc déplacé le BME280 dans mon boitier "quasi étanche" pour mesurer la pression atmosphérique, et mis la SHT3x dans le bouclier. Si l'on ne dispose pas de ce capteur, il suffit de commenter la ligne au début du programme #define SHT, ainsi seul le BME280 sera utilisé. Attention toutefois, les calculs intervanants avec le MLX90614 pour la detection de nuages utilisent en fonction de la sonde choisie, la température ambiante du BME280 ou du SHT3x et non celle du MLX90614. Cela car mon MLX90614 se trouve dans mon boitier "quasi étanche" et que cette valeur intervient directement dans le calcul de la présence de nuages. Dans le boitier la température qui grimpe la journée en cas de soleil fausse complètement les données. C'est un parti pris ici et chacun pourra modifier la température voulue puisque dans la gestion du MLX90614, la fonction de prise de température ambiante est implémentée. Il faudra alors simplement dans la fonction "updateSensorCache()" du code principal modifiée la source ainsi que dans le fichier MLX90614. 3) Reprise du code pour la partie WebSocket. J'ai repris le code pour harmoniser les fonctions des gestions des valeurs entre les parties WEB, Websocket, MQTT et ASCOM. Cela est beaucoup plus cohérent. Pour la partie interface web, j'ai priviligié le Websocket. Cela permet une communication entre le serveur web et l'esp32 bilatérale sans délai. J'ai toutefois laissé la partie HTTP présente en tant que communication de secours. Ainsi, si pour une raison ou une autre le Websocket échoue, le HTTP prend le relai. Cela rend plus sécurisant l'utilisation notamment lors des sessions de nuits 4) Amélioration globale de la fonction anémomètre. J'avais parfois des bizarreries lors de la lecture du vent (par exemple des vitesses de vents à plus de 300 km/h alors qu'il n'y avait de vent chez moi!). J'ai donc renforcé drastiquement la partie concernant les mesures de la vitesse du vent. Ces étrangetés ne devraient donc plus survenir. 5) Calcul de la présence de nuages. Comme mentionné à plusieurs reprises, pour le calcul de la présence de nuages, je me suis complètement inspiré de l'approche faite par Lunatico avec le AAG Cloudwatcher. Ils donnent sur leur site toutes les formules et explications concernant les équations pour le calcul de la correction à appliquer à la tempéarature "brute" fournie par le capteur. Je m'étais pour le moment contenter des constantes K1 à K5 même si sur la page web on pouvait renseigner ces valeurs. Toutefois, elles n'étaient donc pas utilisées dans le calcul. C'est maintenant chose faite. par ailleurs, J'ai également implémenter le facteur qu'ils nomment T76 qui intervient de manière complètement transparente pour l'utilisateur, ajuster les coefficients en cas de "grand froid", donc quis'applique lorsque les températures ambiantes sont <-5°C. 6) Page WEB. Reprise du code pour accepter le nouveau format Websocket avec HTTP en secours. J'ai également ajouter des champs sous les coefficients K1 à K7 pour pouvoir modifier à la volée les constantes tempéature ciel clair et température ciel couvert, intervenant dans le calcul du pourcentage de nuages. Voilà, j'spère que cette nouvelle mouture vous conviendra. Je pense en rester là avec ce projet qui me semble pour le coup suffisament abouti. je reste disponible ici pour échanger. Amicalement. Olivier ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ UPDATE 3 du 18/09/2025: Après avoir du lâché le projet durant plusieurs mois, j'ai pu reprendre le developpement de ma station météo spéciale ASTRO et Observatoire. Le code original en V4 fonctionnait bien mais j'avais envie de l'améliorer sur plusieurs points. Cette version du code reste compatible avec le drriver ASCOM V2. Vous pouvez telecharger le firmware ici: Ne pas oublier de renseigner correctement les champs SSID et Mot de passe dans l'onglet 'parametreWIFI' afi nd'éviter d'avoir à reflasher l'esp32! Voici la liste des principales évolutions du firmware: 1) Modification de la partie firmware - Ajout d'un mode DEBUG: Le fait d'avoir des Serial.print(ln) augmente la durée d'un tour de loop. Je voulais un système plus réactif. Une fois que tout est OK on peut supprimer les Serial en commentant la ligne //DEFINE DEGUG_MODE en haut du fichier *.ino. Cela fait gagner environ 50% de réactivité. Bien penser à le commenter quand tout est OK. - Ajout d'un mode "simulation": Cela permet de tester le code et la page web en simulant des données sans que les capteurs ne soient physiquement connecté. - Utilisation d'un MUTEX: Cela evite des écritures et lectures simultannées qui pourraient poser problème. - Utilisation d'un cache pour les données: Toutes les données collectées sont stockées dans un cache. Le cache est par défaut remis à jour toutes les 20s. Ce sont les données dans le cache qui sont lues par la page web ou le driver ASCOM. - Ajout du code nécessaire pour l'utilisation avec MQTT, donc pour ceux qui utilisent Home Assistant ou d'autres application MQTT. - Ajout du code nécessaire pour l'utilisation de WebSocket: bien plus rapide pour la communication entre la page WEB et l'esp32. - Modification du code pour les interruptions dans le comptage des 'ticks' intervenant dans le calcul du vent et de la pluviomètrie. - Ajout d'un Watchdog: Redémarre l'ESP32 si le système se bloque (ex: boucle infinie, plantage logiciel). - Utilisation d'un heartbeat: Maintien le système en vie en effectuant des tâches périodiques (ex: vérifier le WiFi, réinitialiser le watchdog, envoyer un signal de vie). - Ajout d'une vérification de la mémoire: evite les fuites mémoire et évitera bien des plantages. - Ajout d'un reboot systèmatique tous les 7 jours: Cela prends moins de 2s et permet la réinitialisation de tous les compteurs, notament pour millis(). - Amelioration du mode MODEM SLEEP : Le code a été remanié pour offrir une plus grande économie en terme energetique. Concretement, si aucune requete n'est reçue par l'esp32, alors il passe en mode éco. La puissance du wifi est mise au minium afin d'avoir la meilleure économie. Ce mode garde l'aventage de pouvoir reveiller instantanément l'esp32 si une requete est reçue. Complétement transparent pour l'utilisateur, cela préserve également les capteurs. Pour une meilleure réactivité, un cache de données avec le minimum est mis à jour. Cela permet au reveil d'avoir des données fraiches. - Amélioration de la gestion du wifi: l'esp32 analyse les performances de la connexion au wifi et ajuste sa puissance de transmission / réception pour une fois de plus améliorer le coté energetique. - Diverses modifications du code (liste non exhaustive!): suppression des Serial, modification des String pour utiliser des tableaux, ce qui est beaucoup plus efficace et évite des défragmentations, suppression des différents 'delay' pour utiliser du FreeRTO non bloquant, ajout de beaucoup de texte pour la compréhension et modification par d'autres personnes. Création d'un onglet utilisateur qui permet de modifier quelques paramètres. Attention, certains paramètres sont à ajuster dans les fichiers *cpp tels que les SSID, mot de passe... - Améliortion de l'autonomie sur batterie + panneau solaire: Toutes les modifications apportées permettent, en plus de proteger les capteurs dans le temps, d'avoir une meilleure efficacité energetique. En comparant par rapport au code précédent, l'autonomie a été multipliée par 3. On ne peut pas faire mieux puisque le wifi doit rester actif en permanence pour pouvoir être le plus réactif. De ce fait on oublie les mode light sleep et deep sleep. A titre d'information, les estimations sont les suivantes: avec une batterie 3000mAh, un panneau solaire 5V 10W, on obtient: sur une période de 1 mois, avec une utilisation complète équivalente à 1 semaine, on obtiens une charge possible jusqu'à 350 Wh pour une consommation de 75 Wh. On est largement exedentaire et donc auto suffisant, même avec des journées courtes et couvertes. 2) Modification de la partie WEB: - Refonte en partie de la page WEB: Nouvelle mise en page avec de nouvelles gauges, plus attractives à l'oeil. Modification du script pour utiliser le WebSocket au lieu d'une requête web. - Meilleure gestion des coefficients K1 à K7 intervant dans le calcul de la température du ciel (présence de nuages). Ne pas hésiter à me dire si vous rencontrer un problème. Amicalement. Olivier ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ UPDATE 2 du 04/07/2024: IMPORTANT: Si vous avez déjà installé l'ancienne version du driver ASCOM, il faut d'abord le désinstaller via l'utilitaire de desinstallation des programmes Windows. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ UPDATE 1 du 02/07/2024: Pour répondre à la demande d'un astram du forum, j'ai repris une très grande partie du développement de ce projet. La demande initiale était simple: ajouter la prise en charge d'un anémomètre, d'un pluviomètre et d'un détecteur de gouttes. Le pluviomètre et l'anémomètre m'ont été chaleureusement offert par le demandeur afin de pouvoir tester en vrai les différents codes. Ces deux capteurs proviennent du site Lextronic: - Le pluviomètre: https://www.lextronic.fr/pluviometre-a-godet-27641.html - l'anémomètre: https://www.lextronic.fr/anenometre-a-sortie-reed-27644.html - Capteur de gouttes: 1) Afin de me simplifier la vie, j'ai repris l'architecture du code de l'ESP32. J'avais initialement construit un firmware où tout était dans le même fichier. J'ai du coup créé les fichiers .CPP et .h pour chaque capteur et chaque fonctionnalité. Cela permet une maintenance plus facile et l'ajout de fonctionnalités plutôt facilement. 2) La mise à jour du firmware de l'ESP32 peut maintenant se faire via une mise à jour OTA (over ther air). Dans le cadre d'une station météo c'est plus pratique puisque dans de nombreux cas celle ci sera alimentée par un panneau solaire et donc bien loin du port USB. Sur la page web qui affiche les données des divers capteurs, un bouton en haut de la page permets d'accéder à la page de mise à jour de l'ESP32. Arès avoir sélectionner le fichier .bin crée par l'IDE arduino ou autre IDE, puis cliqué sur le bouton "Mise à jour", une barre de progression se remplie. Une fois fini un message de succès apparait pour confirmer l'upload. En cas d'erreur un autre message d'echec apparait. Une fois le telechargement sur l'ESP32 terminé, un bouton "retour vers l'acceuil" apparait sous la barre de progression. 3) L'adresse IP fixe de l'ESP32 doit être renseignée dans le fichier "WIFI.cpp" et les SSID et mot de passe wifi doivent être renseignés dans le fichier "variablesWIFI.cpp". Ces données sont utilisées dans le cas de la mise à jour par OTA mais aussi dans la gestion "cachée" des pages web. Sans rentrer dans le détails cela permet de rendre dynamique les variables nécessaires afin que les infos utilisées dans l'ESP32 soient réutilisées par les pages web. Cela évite d'avoir à modifier les fichier html pour y modifier les adresses IP. Tout est automatique dorénavant. 4) La gestion en économie d'énergie a été améliorée. Initialement il n'y avait pas de gestion d'énergie. Sur cette version, après 5 minutes d'inactivité, l'ESP32 se met en mode "Modem Sleep" (le WiFi et le Bluetooth sont donc désactivés). Ce n'est pas le mode d'économie le plus avancé (il aurait fallu pour cela mettre un "Deep Sleep") mais le "reveil" de l'ESP32 serait bien plus délicat. Une activité est soit une requete de la page web soit une requete du driver NINA. Donc, si aucune requête arrive à l'ESP32, celui ci rentre en "Modem Sleep". L'ESP32 arrête toutes les lectures des capteurs. Si une nouvelle requête est faite alors l'ESP32 reprends sa routine durant 5 minutes. A chaque nouvelle requête le timer de 5 minutes se remet à 0. Cela garantie une économie d'énergie ceratine ainsi qu'une plus grande longévité des capteurs puisque, ce projet se destinant à une météo astro, il va de soit que les requêtes ne seront que peu fréquentes en cas d'inutilisation prolongée à cause de la météo ou tout autre évenement :). 5) NINA communique avec l'ESP32 grâce au driver MeteoESP32 Setup V2.exe que je joins dans ce post -> ajout des paramètres anémomètre et pluviomètre. 6) Je recommande de laisser la gestion du Safety Monitor à l'execllent driver "Environment Safety Monitor" ici: https://www.dehilster.info/astronomy/ascom_environment_safetymonitor.php Cela permettra une gestion bien plus pointue sur cet aspect que mon premier driver joins ici. Je le laisse pour les gens curieux qui veulent voir comment est fait un driver ascom en utilisant le projet. 7) Mise à jour de la page index.html. Couleurs retravaillées, ajout de la date et de l'heure, ajout du bouton pour la mise à jour par OTA, ajout de la version actuelle sur l'ESP32 en bas de page. Diverses modifications du code notamment pour integrer la gestion dynamique des adresses IP. Pour tester le projet, je joins le fichier esp32AstroV4.0.0finale.zip Il y a tous les codes dedans. Pour la partie web j'utilise un IDE arduini 1.8.X car le plugin "sketch upload data" ne fonctionne pas avec les versions 2 et plus. Telechargement ici:https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/ Pour les librairies il suffit de les récupérer depuis le gestionnaire de librairie de l'IDE. Bien astronomiquement à vous, Olivier MeteoESP32 Setup V2.exe Fin UPDATE 1 du 02/07/2024 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Bonjour à tous, Voilà de cela plusieurs années j'ai fais un rêve. Construire un observatoire. Pour y parvenir j'ai mis en route pleins de petits projets qui sont plus ou moins finis, le dernier grand pas étant l'abris en lui même..... arf.... un jour Mais à dire vrai, il y eu en parallèle du rêve de la conception d'un abris, la réflexion sur la facilité de la création d'un driver de type ASCOM. Moi qui ne suis pas ingénieur, me lancer dans la programmation était sommes toute difficile. Puis, quelques années plus tard, de petits modules facilement programmables sont apparus: les arduino. Aujourd'hui il existe énormément de variantes mais j'ai le plaisir de "jouer" avec cela depuis quelques années maintenant. Sans être expert, le langage C++ me fait un peu moins peur. Encore loin de la création d'un projet ASCOM j'ai par la suite participé à divers projets et j'ai de mon coté personnalisé certains petits projets notamment sur INDI, le ASCOM Linuxien, qui m'ont permis de touché un peu au code HTML (le code pour la création de page web entre autre), javascript ou CSS. Le temps passe, l'idée toujours en tête, mais voilà....une révolution a commencé il y a de cela quelques mois: l'IA générative. Pour les autres, ChatGPT. Cet outil, oui oui c'est simplement un outil, permet de faire des choses remarquables, comme aider à la réalisation d'un driver ASCOM!! Je m'explique: Il y a quelques années, j'avais réalisé un boitier météo pour Linux, basé sur une solution existante nommée Weatherradio. Le principe est simple: un arduino sur lequel étaient branchés les capteurs suivants: - un BME280 de chez Velleman: il s'agit d'un petit module permettant de connaitre la température ambiante, la pression atmosphérique, l'humidité relative, et par quelques petites formules, le point de rosée. - un TLS2591 chinois: un capteur de luminosité (en lux) extrêmement sensible qui, par simple calcul, permet de connaitre la qualité d'un site, le fameux SQM. Je vous laisse aller voir sur le net, mais en gros, on peut facilement comparer deux sites en mesurant la "noirceur" du ciel. - un MLX90614 chinois: c'est un capteur de température infra rouge (les fameux thermomètres à distances pour enfant, ceux qui sont en rupture de stock depuis la COVID 19 😕 ), capteur qui permet donc de mesurer la température du ciel, et au moyen d'une formule tirée du boitier AAG Cloudwatcher, la quantité de nuages dans le ciel. En gros si le ciel est chaud c'est qu'il y a des nuages, s'i lest plus froid il n'y a pas de nuages et donc il fait beau. Bon c'est assez empirique mais après quelques réglages cela sera assez précis. J'y reviendrais. Ce petit monde donc était connecté à un petit arduino nano, qui est dans l'obligation d'être connecté à un port USB du pc pour communiquer toutes les mesures transmises. Sans rentrer dans les détails, j'avais installé le firmware weatherradio dessus et tout allait bien. Mais voilà, le temps est passé et la révolution en marche. J'ai acheté un module arduino, enfin pas vraiment arduino, mais on va rester simple, qui s'appelle un ESP32. Petite carte électronique donc qui permet de faire la même chose que l'arduino nano, donc d'y connecter des capteurs, mais il offre surtout deux avantages supplémentaires en plus de sa puissance de calcul: - il offre une connectivité sans fil, donc parfait pour le mettre loin de tout sur une petite batterie solaire (à venir), - il offre une mémoire flash sur laquelle on peut y programmer un serveur web. Ca devient très intéressant. Concrètement, que cela veut il dire: Ce petit module permet d'installer à l’intérieur de sa mémoire différents fichiers (un peu comme sur un pc) et il peut par la sorte générer des pages internet. Pages que l'on peut visiter depuis n'importe quel périphérique disposant d'un accès internet et connecté sur le même réseau wifi que celui du module. A partir de la, on peut afficher les valeurs des capteurs sur une page web. Vous commencez à sentir le truc 8-) Je me suis donc dit, si avec ce petit module si puissant, un peu d'IA qui offre une aide génialissime et beaucoup d'envie, je me lançais dans la création de mon premier driver ASCOM pour une station météo Astro. Attention, ici je ne fais pas de suivi météo comme les stations du commerce, même si en réalité cela est tout à fait possible avec ce module ( quand je vous dit qu'il est puissant ce machin ^^) Tout feu tout flamme, je me lance dedans. ChatGPT offre une aide précieuse. On peut lui demander à peu près tout et j'avoue que sans cet outil je n'y serais surement pas arrivé. Il connait tous les langages de programmation et pour peu qu'on sache l'utiliser c'est extrêmement puissant. Après plusieurs heures à triturer les codes C++ de l'arduino et C# d'ASCOM le résultat tombe. Ça fonctionne aux petits oignons. Donc, petit résumé de la chose: J'ai un ESP32 sur lequel sont branchés plusieurs capteurs. les valeurs mesurées sont renvoyées sur une page internet générée par l'ESP32. Le driver ASCOM que j'ai conçu permet, via NINA par exemple, d'envoyer une requête internet (basiquement il ouvre une page internet sans que vous le voyez) et reçois les valeurs de la page web. Le drivers traite l'info et NINA affiche les valeurs. Enfin, dans un soucis d’esthétisme, j'ai crée une interface sur la page internet avec des petites gauges affichant les valeurs. Les valeurs sont rafraichies toutes les 10 secondes. On peut changer cela facilement dans le fichier script.js qui accompagne le code HTML de la page internet. Mais ce que je souhaitais avant tout, c'était de pouvoir paramétrer quelques valeurs importantes que je vais exposer juste après, sans avoir besoin de rebrancher l'ESP32 à l'ordinateur et de renvoyer une mise à jour du firmware de l'ESP32. Petite explication. Le module MLX90614, comme je l'évoquais plus tôt, est un module qui sert à mesurer la température d'une portion de ciel. Si il y a des nuages ou non, la température mesurée (via le capteur infrarouge) va en être modifiée. Le but ici n'est pas d'expliquer comment cela fonctionne car cela alourdirait inutilement cette page déjà bien remplie ^^. Le truc, c'est que la valeur brute mesurée n'est a elle seule pas suffisante pour être pertinente. Le fabriquant du boitier AAG cloudwatcher, qui dispose du même module, a mis en ligne dans sa notice les équations qui permettent de corriger la valeur mesurée par le capteur. En gros, à la valeur mesurée, on doit appliquer une correction que l'on va soustraire à la valeur brute. On obtiendra une valeur corrigée. Le problème, c'est que cette correction peut varier en fonction des saisons. En gros, la valeur de correction à appliquer sera différente si on regarde la température du ciel en hiver ou en été. L'équation qui génère la valeur de la correction est constituée de 7 coefficients sur lesquels ont peut agir. On comprends dès lors que pour éviter de devoir modifier les valeurs des coefficients en dur dans le firmware de l'ESP32 et ne pas avoir à recharger le firmware tous les x temps, il me fallait trouver un autre moyen. Et l'ESP32 permet cela assez facilement!! J'ai créé un fichier dans la mémoire de l'ESP32 dans lequel sont stockés ces coefficients. Ensuite, (merci ChatGPT) dans le code de la page web j'ai généré un formulaire dans lequel on peut à la volée donner de nouvelles valeurs aux différents coefficients. Ces valeurs sont donc stockées en dur sur l'ESP32 et elles ne seront ainsi pas perdues même après un reboot de l'ESP32 (panne d’électricité par exemple, ou batterie à plat ^^). C'est donc depuis la page web générée par l'ESP32 que l'on peut modifier les valeurs facilement en fonction des saisons. Un vrai bonheur. Voilà, je suis arrivé au terme de ce petit projet qui m'aura permis de toucher du doigt plusieurs domaines: - l'apprentissage sur un module ESP32 que je ne connaissais mais que je vais réutiliser pour d'autres sujets que l'astro (pour 3€ les 2 modules sur Ali.... ce serait dommage de ne pas le faire), - apprentissage de l'outil ChatGPT pour obtenir les résultats souhaités, - apprentissage de divers langages: HTML, javascript, C# et d'autres!! - démystification de la création d'un driver ASCOM que je croyais réservé à une élite d'ingénieur en informatique, du moins pour des projets simples Petit plus!!! En plus d'un driver méteo je vous propose le driver Safety Monitor qui se connecte aussi sur le même module afin de savoir si les conditions météo sont favorables, mis à part le vent que je n'ai pas intégré. Aussi, je vous propose de partager mon travail afin que chacun puisse soit s'y essayer ou s'en inspirer. je fourni: - l'executable du driver météo pour NINA en tant qu'ObservingConditions, - l'executable du driver météo pour NINA en tant que Safety Monitor, SafetyMonitorESP32 Setup.exe -le firmware ESP32 avec son repetoire pour la partie WEB, -les projets visual studio pour ceux qui veulent aller plus loin ou integrer de nouvelles fonctionnalités comme un anémomètre par exemple. visual studio - MeteoESP32Driver.rar visual studio - SafetyMonitorESP32.rar Voilà, j'espère avoir pu partager avec vous quelques petits choses. Je répondrais aux questions, s'il y en a, A très vite Olivier @bemoBonjour, je sais que cela fais maintenant très très longtemps que j'avais promis ce driver!! il est enfin là... vaut mieux tard que jamais PS: Un grand merci aussi à @Raphael_OD et @Antiath sans qui je n'aurais tout bonnement pas essayer non plus!! des conseils avisés et utiles!!! un grand merci- 107 réponses
-
- 11
-
-
-
NGC1931 petite nébuleuse du Cocher
astrolivier a répondu à un sujet de Raphael_OD dans Astrophotographie
Une bien jolie image!! j'aimerais tant pouvoir imager....si j'habitais loin de cette belle Normandie plutôt couverte un leger bruit qui peut surement être enlevé sans perte de détails. J'imagine que le detecteur dont tu fais reference c'est un vieux post que j'avais fais avec Bemo il y a de ça quelques années!! J'ai fini le driver Météo et je viens de finir le driver SfetyMonitor. Je vais publier ici l'ensemble du projet dans les heures à venir. j'en profite pour te remercie à nouveau j'espère voir de belles images comme celles ci bientot -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Bonjour à @Raphael_OD et aux autres, je reviens avec de bonnes nouvelles. Concernant la désérialisation du JSON, j'ai absolument tout essayé sans succès. Le debug fonctionnait avec la librairie json.net mais cela ne fonctionnait pas en mode release. J'ai du coup essayé avec Newtonsoft.json mais là rien ne fonctionnait. Bon, après avoir essayé jusqu'à 4h du matin sans succès samedi soir j'ai décidé de revenir aux sources!! je réalise moi même la désérialisation! J'intègre les bases de mon tout premier code en port COM mais avec des requetes HTTP. J'intègre un timer et je test!! le restultat tant attendu s'affiche, et même avec le fichier exe fraichement créé!! que du bonheur!!! Me voilà arrivé au terme de ce driver qui va en appeler d'autres dans pas longtemps Je vais faire quelques petits ajustements (surtout esthéthiques) de la page web. Je vais aussi revoir le code arduino pour qu'il soit plus clair au coummun des mortels et pas juste à son concepteur ^^. Je dois aussi verifier que l'ajustement des constantes K1 a K7 sur la page web en cours d'utilisation du driver ne pose pas de soucis -> MAJ: j'ai vérifié, c'est OK les constantes peuvent être modifiées à la volée même avec NINA en cours d'execution!! ca c'est cool :), merci le JSON. Je publierai alors une version définitive Un grand merci pour tous vos précieux conseils -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
-
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Hmmm j’avoue que je ne sais pas trop. Je l’ai mis dans using en haut du driver mais VS m’a dit que c’etait inutile. donc je l’ai supprimé, mais avec ou sans meme pb. il faudrait que je regarde ou pour savoir cela? -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Je vais recréer complètement un nouveau driver en utilisant le code actuel mais mon log une fois l'exe crée et différent de celui en mode debug. J'ai par exemple créé un logmessage pour afficher la requête web juste après le "connection to esp32" et affiche http://192.168.1.100/ascom. Cela fonctionne en mode debug mais n'apparait pas dans le log après installation de l'exécutable ... Il doit y avoir quelque chose qui m'échappe. refaire ne devrais pas prendre énormément de temps -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
re, je ne me rappelle plus quand j'ai compilé pour le nano cela avait fonctionner aussitot. Bon, j'ai un problème de tracelog: En mode debug le fichier trace bien tout et dedans je vois chaque variable avec sa valeur. en mode debug: Après création de l'exe et test je n'ai plus que des "connected" et sans valeurs.... comprends pas. par contre je n'ai pas l'arborescence comme toi: Project\bin\x64\releases Moi je n'ai que Project\bin\releases ma config: Après avoir générer la release j'ouvre le generateur de script: Inno s'est ouvert et je clique sur compile: Dans le repertoire j'obtiens ceci avec l'exe créer dedans: ensuite dans VS 2019 je clique sur nettoyer la solution en mode release et je recommence en mode debug afin que dans NINA aucune trace du driver n'existe. J'installe l'exe et j'ai toujours des valeurs à 0: Et le fichier log en cours d'execution: ObservingConditionsDriver.cs -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Ba c’est ce que je fais 😕 je vais essayer ce soir. c’est enfin le weekend -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Petit edit: sur la première version avec le nano j’avais deja un problème de ce type la. Seulement c’était apparu pendant le debug. je vais essayer en remplaçant les points par des virgules, sait on jamais 😕 -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Je ne suis pas sur de comprendre. tu veux bien me dire comment tu procèdes de ton coté? -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
En effet, je ne sais pas pourquoi je fais cela, histoire de faire les choses dans l'ordre, même si inutile J'ai regardé mais il ne semble pas y avoir de soucis. Je vais mettre plus de log. Ba disons qu'en mode debug en effet toutes les valeurs sont reconnues. Et avec la verison arduino nano que j'avais faite pas de soucis. je comple en x64 et dans les propriétés de la solution j'avais mis aussi x64 (un conseil de antiath à la 1ere page) car lorsque je me connecté NINA refusait et tout à fonctionné après le passage en x64 (et mon pc est en x64 core I5 12400); je ne vois pas comment essayer autrement. j'avoue ne pas avoir compris la phrase. Qu'entends tu par src? Si après l'installation de l'executable je regenere un debug les valeurs reviennent. Pour la création du driver exe je suis la tuto de la vidéo sur WDRoof que j'ai posté à la page 1. Je pense aussi que c'est l'exe qui se fait mal mais je ne sais pas trop. Je vais voir pour mettre plus de log dans la trace on -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
@Raphael_OD Salut, j'ai un problème, peut être arriveras tu à m'aider: J'ai fini mon driver et tout fonctionne bien en mode debug. J'ai même rajouté le SQM. Comme tout est fonctionnel je me dis que je vais créer l'installateur. Dans VS je passe de debug à release, et je génère la solution. Je lance ensuite le script generator et renseigne les différents champs. Une fois fini Inno s'ouvre et je build la solution. J'obtiens un beau fichier exe. Dans VS je nettoie la solution puis je réinstalle proprement le driver à l'aide de l'executable. Je lance NINA et me connecte à mon ESP32, sauf que la aucune valeur ne fonctionne, tout reste à 0. Tu aurais une idée? je n'ai eu aucun message de bug ou autre 😕 -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Merci. J'ai pas mal galérer mais à la fin le code est pas si compliqué. J'ai juste du passer par beaucoup d'étapes d'apprentissage et je ne suis qu'au balbutiment J'ai mis en oeuvre le driver ascom en parallèlle avec la page web ouverte et fais des modifs en live. Tout est très stable. pas de bug rencontré. exactement ce que j'attendais. Dans le moniteur série je peux voir les nouvelles valeurs je K1 a K7 prisent en compte. Pour créer un dossier conf je n'y ai pas pensé. Je viens de modifier le code pour le faire, c'est pas bête du tout ça j'ai ajouté la fonction de création du dossier config C'est sur que le fait que le MLX soit sur un pi augmente le champs des possibilités. Mais dans mon cas je souhaite alimenter ce boitier étanche d'élétricien avec un petit panneau solaire 5V 250 mAh et une petite batterie. D'où être passé par cette solution Je dois encore ajouter la fonction du SQM. Il s'agit d'un simple calcul qui convertit les lux et dans mon code le gain est automatique. J'ai le code dans un autre firmware que je n'ai pas encore mis ici. -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
J'ai ajouté une option sur la page de l'ESP32 pour modifier en live les valeurs de K1 à K7. En rafraichissant la page on voit les nouvelles valeurs à droites qui sont enregistrées en dur dans le SPIFFS afin de les avoir en dur si jamais l'ESP32 doit rebooter C'est pas du python mais ca reste toujours plus facile que de re uploader le firmware -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
@Raphael_OD @Antiath Bonjour, je viens de finir l'écriture du driver ASCOM pour la partie wifi de l'ESP32 avec son server web. Pour le moment le projet s'arrête à la diffusion d'une page web rafraichie lorsque l'on recharge la page. Il ne s'agit pas la de faire de la météorologie avec des graphiques avec des données enregistrées dans une base de données mais plutôt comme la possibilité de voir visuellement les conditions quand on a envie sans que cela interfère dans la nuit avec le driver ASCOM. Ce n'est pas une station météo au sens propre donc. Pour le moment seuls les visuels sur quelques paramètres sont présents sur la page web. Cela est facilement modifiable par des personnes qui souhaiterait en changer. Cela ressemble à ceci: Le driver ascom envoie une requete sur l'ESP32 et l'ESP32 lui répond l'ensemble des valeurs en format json. Dans NINA nous obtenons le même résultat que si nous étions connecté par port COM. Je vais continuer a bosser un peu sur l'aspect visuel de la page web et faire un autre driver en Safety qui récupérera la valeur safe ou non sur le même fichier json Une fois tout cela fait je publierai les fichiers dans l'espace logiciel du forum principal. Je vais aussi voir pour appréhender python et voir comment gérer cette histoire de k1 K2 etc... sans avoir à recompiler à chaque fois le firmware de l'ESP32!! je vais potasser ca même si j'avoue que je suis encore loin du compte En tout cas gros progrès pour moi, un amusement mais surtout une petite fierté d'avoir réussi ç faire tout cela. Clairement sans votre aide cela aurait été impossible donc un grand merci. PS: si tu veux me dire comment un programme python peut envoyer des valeurs à un firmware arduino sans passer par un pi (je souhaite être le plus basique possible dans ma boite étanche) je suis preneur Olivier -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
en effet c'est ultra enrichissant je n'hésiterai pas à poster ici la progression :). Un grand merci. -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Un grand merci. Avec toutes ces infos je devrais m’en sortir je ne suis pas encore la de faire un programme python!! Apres c++ il m’a fallu apprivoiser le C#, le html, le javascript entre autre!! Pour les saisons je vais tenter en auto avec les coefficients k6 et k7 dans la variable de correction de température dédié justement au changement de saisons! A voir!! je vais regarder cela la semaine prochaine encore merci -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Aurais tu la gentillesse de partager ton code pour te connecter a l’esp32 avec le driver ascom? j’ai suivi la video pour la creation du driver ascom wdroof: je souhaite juste comparer la maniere de faire histoire d’en apprendre toujours plus le reste de la routine est deja faite ps: comment interagis tu entre le driver, le firmware et ton logiciel pour les valeurs de k1, k2… impressionnant -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Bonjour, Désolé de ne répondre que maintenant j'ai été un peu éloigné du forum. J'avais regardé le tuto de Tommy (et pas que sur l'ESP32 ^^). Je me suis en train de m'amuser avec les tutos de rapberryme.com comme celui ci: https://www.raspberryme.com/serveur-web-esp32-afficher-les-lectures-des-capteurs-dans-les-jauges/ histoire d'apprendre à manipuler les fichiers. J'ai crée un premier sketch qui me crée des graphiques sur la page index et il y a une autre qui renvoie la string nécessaire au driver ascom. Mais je n'ai pas encore fait la modification du driver car il faut que je trouve le moyen de remplacer la partie connected pour ne pas écouter le port COM mais demandé une adresse ip et envoyer la requete sur l'ESP. J'ai regardé ton message précédent où tu me donnes la référence. Je n'ai juste pas eu le temps de faire cela. Je reviendrais certainement te demander conseil d'ici quelques jours -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Merci beaucoup. ESP32 reçus hier, je vais m'amuser J'ai commencé à regarder cette hsitoire de HTML + CSS +firmware arduino en forme se server web. Les données y'a pas de soucis. Je vais essayer de créer une page web avec un affichage des données d'où l'utilisation de 3 fichiers json, un sera dédié à cela. Mais ce ne sera clairement pas la priorité, donc on verra plus tard On va déjà refaire la partie ASCOM avec ce nouvel appareil. Merci en tout cas -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Bonjour à tous, @Raphael_OD je me permet de te soliciter. J'ai entrepris de faire le firmware arduino pour l'envoyer dans l'ESP32 dès son arrivé chez moi d'ici demain Je poste donc ici le code pour l'ESP, le driver ASCOM n'étant pas encore modifié pour faire la requete sur l'ESP32. Donc le principe du firmware est le suivant: On effectue les mesure tous les X délais choisis au début du code. On crée un 1er fichier JSON (jsonASCOM) qui comprend l'ensemble des valeurs afin de fournir la chaine au driver ASCOM. Ce fichier est réécrit tous les x délais. On crée un 2ème fichier JSON (JsonMETEO) qui comprends les données météo mais ui eux serviront plus tard dans la conception d'une petite interface (au cas où plus tard....) On crée un 3eme fichier json(JsonIsSafe) qui sert à un futur driver ASCOM de type SafetyMonitor. Pour un premier jet qu'en penses tu? le code: // librairies de base #include <Wire.h> #include <Adafruit_Sensor.h> #include <ArduinoJson.h> #include <ArduinoJson.hpp> #include <SPIFFS.h> #include <ESPAsyncWebServer.h> AsyncWebServer server(80); const char* ssid = "Votre_SSID"; // Remplacez "Votre_SSID" par le nom de votre réseau WiFi const char* password = "Votre_Mot_de_Passe"; // Remplacez "Votre_Mot_de_Passe" par le mot de passe de votre réseau WiFi #define delais 5000 //temps entre deux maj des valeurs en ms #define SerialSpeed 115200 // vitesse de communication sur le port série // utilisation d'un BME280 Velleman WPSE335 #include <BME280I2C.h> BME280I2C bme; float temperature_ambiante_BME =0.00; float pression_locale =0.00; float correction_altitude_pression = 0.00; //facteur de correction lié à l'altitude locale float humidite =0.00; float dewpoint =0.00; float nuages =0.00; float lux = 0.00; int Safe = 0; // utilisation d'un MLX90614 #include <Adafruit_MLX90614.h> Adafruit_MLX90614 mlx = Adafruit_MLX90614(); float temperature_ambiante_MLX; float temperature_ciel; float correction_temperature; float temperature_ciel_corrigee; #define K1 33. #define K2 0. #define K3 4. #define K4 100. #define K5 100. #define K6 0. #define K7 0. float CWT; //CWT = Cold Weather correction en cas de basse temperature (<1°C) // température ciel completement clair #define temperature_ciel_clair -8 // température ciel completement couvert #define temperature_ciel_couvert 0 //Activation treshold for cloudFlag (%) // utilisation d'un TSL2591 #include <Adafruit_TSL2591.h> Adafruit_TSL2591 tsl = Adafruit_TSL2591(); struct { bool status; uint32_t full; uint16_t ir; uint16_t visible; int gain; int timing; float lux; } tsl2591Data {false, 0, 0, 0, 0, 0, 0.0}; /** tsl.begin() always returns true, hence we need to check the I2C adress */ bool isTSL2591Present() { Wire.beginTransmission(TSL2591_ADDR); byte error = Wire.endTransmission(); return (error == 0); } void configureSensorTSL2591(tsl2591Gain_t gainSetting, tsl2591IntegrationTime_t timeSetting) { // You can change the gain on the fly, to adapt to brighter/dimmer light situations tsl.setGain(gainSetting); // Changing the integration time gives you a longer time over which to sense light // longer timelines are slower, but are good in very low light situtations! tsl.setTiming(timeSetting); } // calibrate TSL2591 gain and integration time bool calibrateTSL2591() { if (tsl2591Data.visible < 100) { //Increase GAIN (and INTEGRATIONTIME) if light level too low switch (tsl2591Data.gain) { case TSL2591_GAIN_LOW : configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_MED : configureSensorTSL2591(TSL2591_GAIN_HIGH, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_HIGH : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_MAX : switch (tsl2591Data.timing) { case TSL2591_INTEGRATIONTIME_200MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_300MS); break; case TSL2591_INTEGRATIONTIME_300MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_400MS); break; case TSL2591_INTEGRATIONTIME_400MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_500MS); break; case TSL2591_INTEGRATIONTIME_500MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_600MS); break; case TSL2591_INTEGRATIONTIME_600MS : // no higher sensitivity level available return false; break; default: configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_600MS); break; } break; default: configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; } // calibration changed return true; } if (tsl2591Data.visible > 30000) { //Decrease GAIN (and INTEGRATIONTIME) if light level too high switch (tsl2591Data.gain) { case TSL2591_GAIN_LOW : switch (tsl2591Data.timing) { case TSL2591_INTEGRATIONTIME_500MS : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_400MS); break; case TSL2591_INTEGRATIONTIME_400MS : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_300MS); break; case TSL2591_INTEGRATIONTIME_300MS : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_INTEGRATIONTIME_200MS : // no higher sensitivity level available return false; break; default: configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_200MS); break; } break; case TSL2591_GAIN_MED : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_HIGH : configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_MAX : configureSensorTSL2591(TSL2591_GAIN_HIGH, TSL2591_INTEGRATIONTIME_200MS); break; default: configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; } // calibraton changed return true; } // no calibration change necessary return false; } void setup() { Serial.begin(SerialSpeed); Wire.begin(); bme.begin(); mlx.begin(); if(!SPIFFS.begin(true)) { Serial.println("An Error has occurred while mounting SPIFFS"); return; } // Connexion au réseau WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connexion au WiFi en cours..."); } Serial.println("Connecté au réseau WiFi"); if (!SPIFFS.begin(true)) { Serial.println("Une erreur s'est produite lors du montage de SPIFFS"); return; } // Serveur web server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ File file = SPIFFS.open("/data.json", "r"); if(file){ request->send(SPIFFS, "/data.json", String(), true); file.close(); } else { request->send(404); } }); server.begin(); } void updateBME() { float temp(NAN), hum(NAN), pres(NAN); BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); BME280::PresUnit presUnit(BME280::PresUnit_hPa); bme.read(pres, temp, hum, tempUnit, presUnit); temperature_ambiante_BME = temp; pression_locale = pres+correction_altitude_pression; humidite = hum; } void updateMLX() { temperature_ambiante_MLX = mlx.readAmbientTempC(); temperature_ciel = mlx.readObjectTempC(); } void updateTSL2591() { tsl.begin(); // Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum tsl2591Data.full = tsl.getFullLuminosity(); tsl2591Data.ir = tsl2591Data.full >> 16; tsl2591Data.visible = tsl2591Data.full & 0xFFFF; tsl2591Data.lux = tsl.calculateLux(tsl2591Data.visible, tsl2591Data.ir); tsl2591Data.gain = tsl.getGain(); tsl2591Data.timing = tsl.getTiming(); bool changed = calibrateTSL2591(); if (changed) updateTSL2591(); } void loop() { updateBME(); updateBME(); updateMLX(); correction_temperature = (K1 / 100) * (temperature_ambiante_MLX - K2 / 10) + (K3 / 100) * pow((exp (K4 / 1000* temperature_ambiante_MLX)) , (K5 / 100))+CWT; temperature_ciel_corrigee = temperature_ciel - correction_temperature; dewpoint = ((sqrt(sqrt(sqrt(humidite/100))))*(110+temperature_ambiante_BME))-110; updateTSL2591(); lux = tsl2591Data.lux; if (temperature_ciel_corrigee < temperature_ciel_clair ) { nuages = 0.0; Safe = 1; } else if (temperature_ciel_corrigee > temperature_ciel_couvert) { nuages = 100.0; Safe = 0; } else { nuages = map(nuages,-8.0,-0.0,0,100); if(nuages <= 25) { Safe = 1; } else { Safe = 0; } } // Création d'un objet JSON DynamicJsonDocument jsonMeteo(2000000); jsonMeteo["T"] = temperature_ambiante_BME; jsonMeteo["C"] = temperature_ciel_corrigee; jsonMeteo["P"] = pression_locale; jsonMeteo["H"] = humidite; jsonMeteo["D"] = dewpoint; jsonMeteo["L"] = lux; jsonMeteo["N"] = nuages; // Sérialisation de l'objet JSON dans une chaîne de caractères String jsonStringMeteo; serializeJson(jsonMeteo, jsonStringMeteo); // Affichage sur le moniteur série Serial.println(jsonStringMeteo); // Ouvrir le fichier "DataMeteo.json" en mode écriture (efface le contenu existant) File fileMeteo = SPIFFS.open("/DataMeteo.json", "a"); if (!fileMeteo) { Serial.println("Failed to open DataMeteo.json for writing"); return; } // Formater les données dans le fichier "DataMeteo.json" fileMeteo.print("C:"); fileMeteo.print(temperature_ciel_corrigee, 2); fileMeteo.print("|P:"); fileMeteo.print(pression_locale, 2); fileMeteo.print("|H:"); fileMeteo.print(humidite, 2); fileMeteo.print("|D:"); fileMeteo.print(dewpoint, 2); fileMeteo.print("|L:"); fileMeteo.print(lux, 2); fileMeteo.print("|N:"); fileMeteo.print(nuages, 2); // Fermer le fichier fileMeteo.close(); // Création d'un objet JSON DynamicJsonDocument jsonASCOM(200); jsonASCOM["T"] = temperature_ambiante_BME; jsonASCOM["C"] = temperature_ciel_corrigee; jsonASCOM["P"] = pression_locale; jsonASCOM["H"] = humidite; jsonASCOM["D"] = dewpoint; jsonASCOM["L"] = lux; jsonASCOM["N"] = nuages; // Sérialisation de l'objet JSON dans une chaîne de caractères String jsonStringASCOM; serializeJson(jsonASCOM, jsonStringASCOM); // Affichage sur le moniteur série Serial.println(jsonStringASCOM); // Ouvrir le fichier "DataMeteo.json" en mode écriture (efface le contenu existant) File fileASCOM = SPIFFS.open("/DataASCOM.json", "w"); if (!fileASCOM) { Serial.println("Failed to open DataASCOM.json for writing"); return; } // Formater les données dans le fichier "DataMeteo.json" fileASCOM.print("C:"); fileASCOM.print(temperature_ciel_corrigee, 2); fileASCOM.print("|P:"); fileASCOM.print(pression_locale, 2); fileASCOM.print("|H:"); fileASCOM.print(humidite, 2); fileASCOM.print("|D:"); fileASCOM.print(dewpoint, 2); fileASCOM.print("|L:"); fileASCOM.print(lux, 2); fileASCOM.print("|N:"); fileASCOM.print(nuages, 2); // Fermer le fichier fileASCOM.close(); // Création d'un objet JSON pour le fichier "IsSafe.json" DynamicJsonDocument jsonIsSafe(200); jsonIsSafe["T"] = Safe; // Ouvrir le fichier "IsSafe.json" en mode écriture (efface le contenu existant) File fileIsSafe = SPIFFS.open("/IsSafe.json", "w"); if (!fileIsSafe) { Serial.println("Failed to open IsSafe.json for writing"); return; } // Sérialisation de l'objet JSON dans le fichier "IsSafe.json" serializeJson(jsonIsSafe, fileIsSafe); fileIsSafe.println(); fileIsSafe.close(); delay(delais); } -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Nouveau code arduino qui fabrique un JSON. Je poursuivrais lors de la réception des ESP32. Il me faudra alors juste faire en sorte d'envoyer le fichier JSON crée sur un Raspbery en mode server (ou une autre manière de le faire plus simplement avec une carte SD sur le nano. Pour le moment je suis très heureux du résultat et surout le principal: Ca fonctionne avec NINA!! // librairies de base #include <Wire.h> #include <Adafruit_Sensor.h> #include <ArduinoJson.h> #include <ArduinoJson.hpp> //#include <math.h> #define delais 5000 //temps entre deux maj des valeurs en ms #define SerialSpeed 9600 // vitesse de communication sur le port série // utilisation d'un BME280 Velleman WPSE335 #include <BME280I2C.h> BME280I2C bme; float temperature_ambiante_BME =0.00; float pression_locale =0.00; float correction_altitude_pression = 0.00; //facteur de correction lié à l'altitude locale float humidite =0.00; float dewpoint =0.00; float nuages =0.00; float lux = 0.00; // utilisation d'un MLX90614 #include <Adafruit_MLX90614.h> Adafruit_MLX90614 mlx = Adafruit_MLX90614(); float temperature_ambiante_MLX; float temperature_ciel; float correction_temperature; float temperature_ciel_corrigee; #define K1 33. #define K2 0. #define K3 4. #define K4 100. #define K5 100. #define K6 0. #define K7 0. float CWT; //CWT = Cold Weather correction en cas de basse temperature (<1°C) // température ciel completement clair #define temperature_ciel_clair -8 // température ciel completement couvert #define temperature_ciel_couvert 0 //Activation treshold for cloudFlag (%) // utilisation d'un TSL2591 #include <Adafruit_TSL2591.h> Adafruit_TSL2591 tsl = Adafruit_TSL2591(); struct { bool status; uint32_t full; uint16_t ir; uint16_t visible; int gain; int timing; float lux; } tsl2591Data {false, 0, 0, 0, 0, 0, 0.0}; /** tsl.begin() always returns true, hence we need to check the I2C adress */ bool isTSL2591Present() { Wire.beginTransmission(TSL2591_ADDR); byte error = Wire.endTransmission(); return (error == 0); } void configureSensorTSL2591(tsl2591Gain_t gainSetting, tsl2591IntegrationTime_t timeSetting) { // You can change the gain on the fly, to adapt to brighter/dimmer light situations tsl.setGain(gainSetting); // Changing the integration time gives you a longer time over which to sense light // longer timelines are slower, but are good in very low light situtations! tsl.setTiming(timeSetting); } // calibrate TSL2591 gain and integration time bool calibrateTSL2591() { if (tsl2591Data.visible < 100) { //Increase GAIN (and INTEGRATIONTIME) if light level too low switch (tsl2591Data.gain) { case TSL2591_GAIN_LOW : configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_MED : configureSensorTSL2591(TSL2591_GAIN_HIGH, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_HIGH : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_MAX : switch (tsl2591Data.timing) { case TSL2591_INTEGRATIONTIME_200MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_300MS); break; case TSL2591_INTEGRATIONTIME_300MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_400MS); break; case TSL2591_INTEGRATIONTIME_400MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_500MS); break; case TSL2591_INTEGRATIONTIME_500MS : configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_600MS); break; case TSL2591_INTEGRATIONTIME_600MS : // no higher sensitivity level available return false; break; default: configureSensorTSL2591(TSL2591_GAIN_MAX, TSL2591_INTEGRATIONTIME_600MS); break; } break; default: configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; } // calibration changed return true; } if (tsl2591Data.visible > 30000) { //Decrease GAIN (and INTEGRATIONTIME) if light level too high switch (tsl2591Data.gain) { case TSL2591_GAIN_LOW : switch (tsl2591Data.timing) { case TSL2591_INTEGRATIONTIME_500MS : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_400MS); break; case TSL2591_INTEGRATIONTIME_400MS : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_300MS); break; case TSL2591_INTEGRATIONTIME_300MS : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_INTEGRATIONTIME_200MS : // no higher sensitivity level available return false; break; default: configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_200MS); break; } break; case TSL2591_GAIN_MED : configureSensorTSL2591(TSL2591_GAIN_LOW, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_HIGH : configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; case TSL2591_GAIN_MAX : configureSensorTSL2591(TSL2591_GAIN_HIGH, TSL2591_INTEGRATIONTIME_200MS); break; default: configureSensorTSL2591(TSL2591_GAIN_MED, TSL2591_INTEGRATIONTIME_200MS); break; } // calibraton changed return true; } // no calibration change necessary return false; } void setup() { Serial.begin(SerialSpeed); Wire.begin(); bme.begin(); mlx.begin(); } void updateBME() { float temp(NAN), hum(NAN), pres(NAN); BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); BME280::PresUnit presUnit(BME280::PresUnit_hPa); bme.read(pres, temp, hum, tempUnit, presUnit); temperature_ambiante_BME = temp; pression_locale = pres+correction_altitude_pression; humidite = hum; } void updateMLX() { temperature_ambiante_MLX = mlx.readAmbientTempC(); temperature_ciel = mlx.readObjectTempC(); } void updateTSL2591() { tsl.begin(); // Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum tsl2591Data.full = tsl.getFullLuminosity(); tsl2591Data.ir = tsl2591Data.full >> 16; tsl2591Data.visible = tsl2591Data.full & 0xFFFF; tsl2591Data.lux = tsl.calculateLux(tsl2591Data.visible, tsl2591Data.ir); tsl2591Data.gain = tsl.getGain(); tsl2591Data.timing = tsl.getTiming(); bool changed = calibrateTSL2591(); if (changed) updateTSL2591(); } void loop() { updateBME(); updateBME(); updateMLX(); correction_temperature = (K1 / 100) * (temperature_ambiante_MLX - K2 / 10) + (K3 / 100) * pow((exp (K4 / 1000* temperature_ambiante_MLX)) , (K5 / 100))+CWT; temperature_ciel_corrigee = temperature_ciel - correction_temperature; dewpoint = ((sqrt(sqrt(sqrt(humidite/100))))*(110+temperature_ambiante_BME))-110; updateTSL2591(); lux = tsl2591Data.lux; if (temperature_ciel_corrigee < temperature_ciel_clair ) { nuages = 0.0; } else if (temperature_ciel_corrigee > temperature_ciel_couvert) { nuages = 100.0; } else { nuages = map(nuages,-8.0,-0.0,0,100); } // Création d'un objet JSON DynamicJsonDocument jsonDoc(200); jsonDoc["T"] = temperature_ambiante_BME; jsonDoc["C"] = temperature_ciel_corrigee; jsonDoc["P"] = pression_locale; jsonDoc["H"] = humidite; jsonDoc["D"] = dewpoint; jsonDoc["L"] = lux; jsonDoc["N"] = nuages; // Sérialisation de l'objet JSON dans le format spécifié String jsonString = "T:" + String(temperature_ambiante_BME, 2) + "|C:" + String(temperature_ciel_corrigee, 2) + "|P:" + String(pression_locale, 2) + "|H:" + String(humidite, 2) + "|D:" + String(dewpoint, 2) + "|L:" + String(lux, 2) + "|N:" + String(nuages, 2); // Affichage sur le moniteur série Serial.println(jsonString); delay(delais); } C'est certainement pas le code le plus compliqué ni le meilleur par rapport à d'autres que l'on peut trouver mais j'en suis ravi!! Cela m'a permis de démystifier la création d'un driver ascom. Je vais compiler ce firmware en l'état pour l'installer sur une autre machine et voir si cela fonctionne comme attendu. Ce sera une étape de plus! -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Et bien mon projet est un abris dans mon jardin. Disons que je fais plus cela pour m'amuser J'ai commander des ESP32 wifi sur Ali et devraient arrivés dans quelques jours. A terme le but sera biensur d'avoir cette station météo en wifi et certainement avec des fichers json où les drivers pourront aller chercher ce qu'ils veulent. Mais c'est pour moi déjà plus complexe que ce premier projet assez simple en soit. C'est mon tout premier driver et le premier objectif atteind pour moi est d'avoir réussi à faire causer l'arduino avec NINA. la prochaine étape sera de faire la même chose mais en wifi avec l'ESP32 wifi. l'étape suivante sera de faire ce que tu as fais, à savoir questionner un fichier distant générer par l'ESP32, tout cela dans des drivers que j'aurais bien entendu fais. D'ailleurs, vu que c'est ce que tu as fais, aurais tu la possibilité de partager ton code? cela m'aiderai beaucoup à la compréhension le moment venu Par ailleurs un drivers SafetyMonitor est très simple à créer après avoir fait celui ci ^^. Le driver SafteyMonitor ne permet en effet que de dire si les conditions se dégrade de fermer l'observatoire. Le projet est un abris de jardin à toi roulant. Je n'ai pas encore choisi quel driver j'allais utiliser mais le plus simple sera le mieux: ouvrir / fermé avec des fins de courses + une commande manuelle en locale pour les besoins. Mais comme le driver ObservingConditions dispose du retour quand à la quantité de nuages il est dommage de ne pas pouvoir faire logiciellement un lien entre les deux -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Et bien voilà, j'ai réimplanté la solution d'écoute du port série. Le problème venait bien de l'utilisation du point au lieu de la virgule. Du coup, maintenant tout est fonctionnel. Me reste juste à savoir maintenant comment utilisé cela en mode safetymonitor. Je souhaitais avoir une station météo mais j'aurais aimé que celle ci pilote mon futur abris, et notament l'ouverture fermeture en cas de présence de nuages ou non. Je pourrais assez facilement implanté cela dans le firmware arduino puisqu'il calcul déjà le pourcentage de ciel couvert. Avez vous une idée de comment faire cela? Aussi, nouveau point: maintenant que le driver fonctionne, comment réaliser un executable de ce driver? je sais qu'on parle inno et tout mais les quelques vidéo en anglais que j'ai pu voir ne m'ont pas vraiment aidé 😕 merci beaucoup pour l'aide -
Driver ASCOM avec arduino nouvelle version!!
astrolivier a répondu à un sujet de astrolivier dans Discussions de astronomie avec arduino
Bon, une reflexion durant la nuit!! Je me suis demandé si la conversion en double ne fonctionnait pas à cause de la décimale e tsurtout s'il n'y avait pas un conflit entre le point et la virugule. J'ai donc ajouté une conversion au code et maintenant c'est bon, j'ai bien la valeur dans NINA Je poursuis donc l'aventure maintenant que je sais comment faire apparaitre les valeurs dans NINA. Je vais tenter de repasser à mon code initial avec une conversion de toutes les variables Je vous tiens au courant. Olivier
