Aller au contenu

astrolivier

Membre
  • Compteur de contenus

    121
  • Inscription

  • Dernière visite

Tout ce qui a été posté par astrolivier

  1. une vue des références dans VS Copie locale et copie spécifique sont sur TRUE
  2. 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?
  3. 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
  4. 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
  5. Ba c’est ce que je fais 😕 je vais essayer ce soir. c’est enfin le weekend
  6. 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 😕
  7. Je ne suis pas sur de comprendre. tu veux bien me dire comment tu procèdes de ton coté?
  8. 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
  9. @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 😕
  10. 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.
  11. 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
  12. @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
  13. en effet c'est ultra enrichissant je n'hésiterai pas à poster ici la progression :). Un grand merci.
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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); }
  19. 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!
  20. 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
  21. 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
  22. 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
  23. @Antiath @Raphael_OD Bonsoir. Je me permets de vous resolliciter. Je vous partage là où j'en suis en espérant que vous vous pourrez m'aider. J'ai donc repris le driver selon les anciens templates mais toujours en C#. Plus de truc local etc... Je suis donc les recommandations et j'ai crée un client. J'ai ajouté des textbox pour y afficher les valeurs envoyé par le driver. Pour le moment avec le simulateur cela fonctionne comme on peut le voir ici: Bon, le truc c'est que si j'essai avec mon propre driver j'ai une erreur lorsque j'appuis sur Properties afin de sélectionner le port COM: Je ne suis pas encore parvenu à comprendre le pourquoi. J'ai ensuite continuer sur le code. Bon, pour faire simple, je peux me connecter, à priori l'Arduino se connecte bien mais, car il y a un mais, les valeurs restent toujours à 0 et ce qu'elle que soit la méthode utilisée. J'ai même réécrit un code arduino pour avoir une fonction de ce genre en testant sur une unique variable. J'ai également volontairement donné une valeur à la variable SkyTemperature. Cela me permet de voir que le driver retourne bien la valeur que j'ai mise. Par conséquent le problème est bien la valeur provenant de l'Arduino. Le jour où cela fonctionnera pour la variable j'implémenterais les autre petite mise au point sur les modifications du code pour tester ces fonctions: la partie connected public bool Connected { get { tl.LogMessage("Connected Get", IsConnected.ToString()); return IsConnected; } set { tl.LogMessage("Connected Set", value.ToString()); if (value == IsConnected) return; if (value) { // try to connect using the port try { serialPort = new Serial(); serialPort.PortName = comPort; serialPort.Speed = SerialSpeed.ps57600; serialPort.Connected = true; connectedState = true; tl.LogMessage("Connected Set", "Connecting to port " + comPort); } catch (Exception ex) { // report any error throw new ASCOM.NotConnectedException("Serial port connection error", ex); } } else { connectedState = false; tl.LogMessage("Connected Set", "Disconnecting from port " + comPort); if (serialPort != null && serialPort.Connected) serialPort.Connected = false; } } } et la partie Temperature et SkyTemperature: et dans NINA: On voit donc que la variable skytemperature fonctionne mais que la variable demandant une réponse à l'Arduino reste désespérément à 0. Donc voilà où j'en suis, j'avoue être bloqué car après avoir essayé une multitude de code rien à faire... Depuis l'IDE arduino la commande TL# renvoie bien un xx.xx# ou xx.xx est une valeur de température mesurée part le capteur BME. EDIT: J'ai modifié le code Temperature comme cela: Dans le fichier de log je vois que c'est le Pb qui me revient. Cela indique donc la fonction Double.TryParse est fausse. Comment faire pour savoir pourquoi? Je ne sais pas comment faire pour debuger cela 😕 EDIT 1: J'ai ajouté des log pour obtenir des valeurs et on voit qu'avant la conversion en double la valeur est bien reçu sur le port série:
  24. Merci pour le retour. Initialement c'est ce que je comptais faire, mais cela impose de revoir mon code. en effet dans ce sens là à chaque fonction je dois questionner l'arduino. Là je pensais plus faire une réception d'une chaine et traiter la chaine ensuite. Une fois chaque valeur scindées je la remettais dans sa variable. c'est cette fonction là: private double temperature; private double skytemperature; private double pression; private double humidity; private double dewpoint; private double skyluminosite; private double cloud; . . . public bool Connected { get { LogMessage("Connected", "Get {0}", IsConnected); return IsConnected; } set { tl.LogMessage("Connected", "Set {0}", value); if (value == IsConnected) return; if (value) { connectedState = true; LogMessage("Connected Set", "Connecting to port {0}", comPort); arduinoport = new SerialPort(comPort, 9600);//Set your board COM arduinoport.Open(); arduinoport.DataReceived += new SerialDataReceivedEventHandler(arduinoport_DataReceived); } else { connectedState = false; LogMessage("Connected Set", "Disconnecting from port {0}", comPort); arduinoport.Close(); } } } private void arduinoport_DataReceived(object sender, SerialDataReceivedEventArgs e) { string reponse = arduinoport.ReadLine(); string[] values = reponse.Split(','); if (values.Length == 6 && double.TryParse(values[0].Substring(2), out double temp) && double.TryParse(values[1].Substring(2), out double skyT)&& double.TryParse(values[2].Substring(2), out double pres)&& double.TryParse(values[3].Substring(2), out double hum)&& double.TryParse(values[4].Substring(2), out double dew)&& double.TryParse(values[5].Substring(2), out double skyL)) { temperature = temp; skystemperature = skyT; pression = pres; humidity = hum; dewpoint = dew; skyluminosite = skyL; } else { temperature = 0; skystemperature = 0; pression = 0; humidity = 0; dewpoint = 0; skyluminosite = 0; } } par exemple: public double Temperature { get { return temperature; } } Je vais potasser cette reflexion
  25. bonjour @Antiath, je me suis penché hier soir sur mon sujet. J'ai repris à 0 le driver dans VS 2022 pour ne pas utiliser les templates 2022 mais les anciens de 2019. Le code est toujours en C# mais le driver ne contient que le fichier ObservingConditions.cs J'ai ensuité appliqué à la lettre la procédure du ReadMe. J'ai donc compiler la solution, sans erreur puis j'ai ajouté dans la solution un nouveau projet pour le client. J'ai ensuite demandé que ce projet soit definit en tant que projet de démarrage. J'ai recompilé et sans erreur pour les deux. Bon, je n'ai pas modifieé le client pour y afficher des valeurs pour le moment. J'ai lancé NINA et mon driver apparait bien dedans. Je me connecte et cela fonctionne. Bon, normal j'ai aucune données qui s'affiche. J'ai donc repris le code du driver et du firmware arduino. Pour que ce soit plus simple je demande juste à l'arduino d'envoyer sur le port série avec la commande Serial.println() toutes les 5s la valeur de la température locale. Dans le driver Ascom j'ai implémenté ton code permettant d'écouter le port série et de traiter la chaine lorsqu'elle est reçue. Je n'ai pas d'érreur dans le code et je compile tout. Le truc c'est que la valeur la température reste à 0°C en tout temps, valeur de la variable à l'initialisation. Si je mets 20°C alors NINA laisse afficher 20°C en permanence. J'ai donc regardé le fichier de debugage et on voit qu'il affiche cette valeur. Je ne sais pas comment faire afficher la valeur dans le logMessage car celui ci n'accepte visiblement que des chaines et non des double. Il faudrait que je convertir cette valeur pour l'afficher. Bref, à priori le driver tel qu'il est écrit ne tient pas compte de ce qui se passe sur le port série. Aurais tu une idée? Je joins les code en fichier texte car sur la page ca fait beaucoup trop!! et il n'existe plus l'option "masqué" 😕 Merci ObservingConditionsDriver.cs
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.