Aller au contenu

astrolivier

Membre
  • Compteur de contenus

    93
  • Inscription

  • Dernière visite

Tout ce qui a été posté par astrolivier

  1. merci pour l’explication. en effet je ne souhaite pas faire une requête a chaque réception de données. je vois comment procéder pour la réception. en revanche je ne vois pas a quel endroit alors il faut faire l’envoi de la commande Write(« GETDATA ») dans le driver. Comme je le mentionnais le driver est encore incomplet cote valeurs. Concernant les délais en faite je comptais en effet un délais dans la demande. peut être avec la fonction Average. je n’ai pas encore regardé cet aspect. Et il y a déjà un délai dans le code arduino. peut être mettre la même valeur. disons qu’avant d’aller plus loin je souhaite déjà que ce code sans forcement avoir les valeurs de l’arduino fonctionne. comment procéder pour l’essayer en l’etat ? comment procedez vous?
  2. Messieurs, suite à vos commentaires, voici un premier jet du code où je ne laisse apparaitre que ce que j'ai ajouté et / ou modifié. Comme souligné je n'ai ajouté ce code que dans le fichier observingconditionhardware.cs Je vous joins le code complet en PJ N'étant pas sur de savoir où implémentais la requête vers l'arduino (le fameux arduinoport.Write("GETDATA") pouvais vous le relire voir essayer? // TODO fill in this information for your driver, then remove this line! // // ASCOM ObservingConditions hardware class for MeteoAstrolivier76 // // Description: <To be completed by driver developer> // // Implements: ASCOM ObservingConditions interface version: <To be completed by driver developer> // Author: (XXX) Your N. Here <your@email.here> // using ASCOM; using ASCOM.Astrometry; using ASCOM.Astrometry.AstroUtils; using ASCOM.Astrometry.NOVAS; using ASCOM.DeviceInterface; using ASCOM.LocalServer; using ASCOM.Utilities; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO.Ports; using System.Linq.Expressions; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; using System.Windows.Forms; namespace ASCOM.MeteoAstrolivier76.ObservingConditions { // // TODO Replace the not implemented exceptions with code to implement the function or throw the appropriate ASCOM exception. // /// <summary> /// ASCOM ObservingConditions hardware class for MeteoAstrolivier76. /// </summary> [HardwareClass()] // Class attribute flag this as a device hardware class that needs to be disposed by the local server when it exits. internal static class ObservingConditionsHardware { // Constants used for Profile persistence internal const string comPortProfileName = "COM Port"; internal const string comPortDefault = "COM10"; internal const string traceStateProfileName = "Trace Level"; internal const string traceStateDefault = "true"; private static string DriverProgId = ""; // ASCOM DeviceID (COM ProgID) for this driver, the value is set by the driver's class initialiser. private static string DriverDescription = ""; // The value is set by the driver's class initialiser. internal static string comPort; // COM port name (if required) private static bool connectedState; // Local server's connected state private static bool runOnce = false; // Flag to enable "one-off" activities only to run once. internal static Util utilities; // ASCOM Utilities object for use as required internal static AstroUtils astroUtilities; // ASCOM AstroUtilities object for use as required internal static TraceLogger tl; // Local server's trace logger object for diagnostic log with information that you specify private static SerialPort arduinoport; private static double temperature; private static double skytemperature; private static double pression; private static double humidity; private static double dewpoint; private static double skyluminosite; public static void ChooseCOMPort() { using (var portChooser = new ASCOM.Utilities.Chooser()) { portChooser.DeviceType = "ObservingConditions"; string selectedPort = portChooser.Choose(); if (selectedPort == null) { // L'utilisateur a annulé la sélection du port COM. return; } // Mettez à jour la variable de port COM avec la sélection de l'utilisateur. comPort = selectedPort; } } /// <summary> /// Set True to connect to the device hardware. Set False to disconnect from the device hardware. /// You can also read the property to check whether it is connected. This reports the current hardware state. /// </summary> /// <value><c>true</c> if connected to the hardware; otherwise, <c>false</c>.</value> public static bool Connected { get { LogMessage("Connected", $"Get {IsConnected}"); return IsConnected; } set { LogMessage("Connected", $"Set {value}"); if (value == IsConnected) return; if (value) { LogMessage("Connected Set", $"Connecting to port {comPort}"); // TODO insert connect to the device code here arduinoport = new SerialPort(comPort, 9600);//Set your board COM arduinoport.DataReceived += new SerialDataReceivedEventHandler(arduinoport_DataReceived); arduinoport.Open(); connectedState = true; } else { LogMessage("Connected Set", $"Disconnecting from port {comPort}"); // TODO insert disconnect from the device code here connectedState = false; arduinoport.Close(); } } } private static void arduinoport_DataReceived(object sender, SerialDataReceivedEventArgs e) { //Et là à toi de voir comment manipuler le string pour en sortir tes données, c'est toi qui décide comment c'est mis en forme dans l'arduino. arduinoport.Write("GETDATA"); string responsearduino = arduinoport.ReadLine(); string[] values = responsearduino.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; skytemperature = skyT; pression = pres; humidity = hum; dewpoint = dew; skyluminosite = skyL; } else { temperature = 0; skytemperature = 0; pression = 0; humidity = 0; dewpoint = 0; skyluminosite = 0; } } } L'IDE m'indique qu'acune erreur n'a été trouvée. Pour le moment je n'ai pas edité les différentes variables. J'aimerai déjà voir ce que vous en pensais? C'est un petit pas pour l'homme mais un grand pas pour moi PS: on ne plus masqué le texte? cela éviterai d'avoir des pages énormes!! avant il y avait un oeil pour faire cela mais je ne le vois plus. ObservingConditionsHardware.cs
  3. Bonjour @Antiath, Merci pour ton retour que je lis avec beaucoup d'attention. Je me suis résoud à utiliser la verison 2022 car il disent qu'un jour les drivers ascom classiques pourraient un jour ne plus fonctionner. J'avoue que je m'étais dis que je repasserais bien à la version 2019 D'autant que la vidéo de Tom Haw m'avait permis à l'époque de facilement réaliser un petit driver Isafety Un grand merci pour le code. Il faut que je relise bien tout cela car même si j'utilise les arduino depuis quelques années c'est la seule chose que "je sais coder". Donc que ce soit en C ou en VB pour moi créer un driver ascom n'est pas simple. Mais je suis quelqu'un de perseverant et j'aimerai reellement comprendre le fonctionnement, car une fois ce petit driver fonctionnel il sera juste à adapter pour mes prochaines réalisations
  4. Merci de s’y interesser. alors a l’epoque il n’y avait que le fichier driver.vb qu’il fallait editer. la a priori il y a 2 fichier en .cs a renseigner (avec a priori un peu la meme architecture). Et je ne parle meme pas d’alpaga!! en soit les arguments semblent facilent a comprendre. moi c’est plus ou renseigner tout cela!! toute aide sera vraiment bienvenue et les codes que j’ai mis sont complètement ouverts et libres, s’il faut (et c’est meme sur) les modifier ^^
  5. Bon on est pas nombreux à priori!! j’espère vraiment que des gens passeront par ici
  6. J'ai créé une discussion dans le forum coté "logiciel" car ici c'est censé être purement arduino. Je limite donc le nombre de vue au 63 personnes du club. En faisant cette passerelle j'espère pouvoir attirer plus de personne et ainsi pouvoir évoluer dans ma compréhension de cette nouvelle façon de créer un driver ASCOM.
  7. Je souhaite apporter quelques informations: Voici ma démarche pour créer le driver ASCOM: Dans VS 2022 en mode administrateur: Je choisi le 1er: ASCOM Driver Template et je clique sur suivant. Puis, et je clique sur créer, ce qui ouvre cette boite de dialogue et que je rempli ainsi: Enfin je clique sur créer: Voilà l'arborescence des fichiers: Voilà, c'est ici que j'ai besoin de vous Par où commencer, où implanter mes différentes fonctions etc... autant de questions que j'ai envie de poser!!! Merci
  8. Bonjour, n’etant pas sur d’avoir publier dans la bonne section, je mets un lien ici vers l’autre discussion. je suis a la recherche d’aide pour comprendre toutes les demarches afin de creer un driver ASCOM ObservingConditions. Je vous laisse y aller s’il vous plait merci pour votre aide. Olivier
  9. Bonjour à tous, voilà plusieurs années que je m'amuse avec des arduino et l'impression 3D. J'ai par le passé fait beaucoup de projet dont un ici sur un FlipFlat pas cher. La seule chose que je n'ai pas faite est un driver ASCOM car celui ci existait déjà et seule la partie arduino était à faire. J'ai, il y a quelques années, réalisé un petit driver isafetymonitor ASCOM en VB. Pour cela j'avais conçu une petite station météo constituée d'un capteur BME280, d'un MLX90614 et un TSL2591. J'ai dans l'idée aujourd'hui de me faire un petit driver ASCOM ObservingConditions dans le but de l'utiliser avec NINA. J'aimerai par ailleurs que ce driver ASCOM permette aussi d'étre utilisé en simultané en tant que driver safetymonitor (pas encore implanté dans mon code arduino). J'ai lu que c'était possible. Et c'est là que les problèmes commencent!! J'ai installé VS2022 et installé les templates ASCOM qui sont au nombre de 3. Bon, déjà ici tout est bien différent de l'époque en VB où j'avais pu suivre le tuto de la roue à filtre de Tom Haw sur Youtube. La maintenant il faut créer un code en C#. Bon allez, on reprends les bases mais ca va le faire. Nouvelle complexité: On parle maintenant d'un driver en mode LocalServer.... ok.... bon je lis toute la documentation en anglais mais je pige pas tout. Bref, je commence à regarder dans VS2022. J'ouvre le premier template et dans l'arboresence je me retoruve avec plein de nouveaux fichiers dont: -observingconditions.cs et observingconditionhardware.cs Je me suis arrêter ici car forcément je ne vois pas du tout par où aller, ni commencer. Je vous joins ci après mon firmware arduino avec son protocole série. Je vous joins également les éléments sous forme de fichier C# que je pense devoir integrer dans le driver ASCOM. Pourriez vous m'aider sur la conception de ce driver ASCOM? je sais qu'il existe des projets un peu identique mais j'aimerai réellement le faire de 1 à Z ce projet! cela me rendrait fier et j'ai d'autres idées en tête. Donc plutôt que de copier, si je peux comprendre comment tout cela marche et s'implémente alors ce serait génial. Code arduino: // librairies de base #include <Wire.h> #include <Adafruit_Sensor.h> //#include <math.h> #define delais 1000 //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; float pression_locale; float correction_altitude_pression = 0.00; //facteur de correction lié à l'altitude locale float humidite; float dewpoint; // 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() { String cmd; if (Serial.available() > 0) { 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(); cmd = Serial.readStringUntil('\n'); if(cmd =="GETDATA") { Serial.print("T:"); Serial.print(temperature_ambiante_BME,1); Serial.print(",C:"); Serial.print(temperature_ciel_corrigee,1); Serial.print(",P:"); Serial.print(pression_locale,1); Serial.print(",H:"); Serial.print(humidite,1); Serial.print(",D:"); Serial.print(dewpoint,1); Serial.print(",L:"); Serial.println(tsl2591Data.lux,1); } } delay(delais); } Code a integrer je sais pas ou dans driver ASCOM ObservingConditions: using ASCOM; using System.IO.Ports; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Runtime.InteropServices; using System.Threading; using ASCOM.Astrometry.AstroUtils; using ASCOM.DeviceInterface; using ASCOM.Utilities; namespace ASCOM.MyObservingConditions { public class ObservingConditions : IObservingConditions { private double temperature; private double skytemperature; private double pression; private double humidity; private double dewpoint; private double skyluminosite; private SerialPort arduinoPort; public ObservingConditions(string comPort) { arduinoPort = new SerialPort(comPort, 9600); arduinoPort.Open(); } public double AveragePeriod { get; set; } public void Refresh() { arduinoPort.Write("GETDATA"); string response = arduinoPort.ReadLine(); string[] values = response.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; } } public double Temperature { get { return temperature; } private set { temperature = value; } } public double SkyTemperature { get { return skytemperature; } private set { skytemperature = value; } } public double Pressure { get { return pression; } private set { pression = value; } } public double Humidity { get { return humidity; } private set { humidity = value; } } public double DewPoint { get { return dewpoint; } private set { dewpoint = value; } } public double SkyBrightness { get { return skyluminosite; } private set { skyluminosite = value; } } ~ObservingConditions() { arduinoPort.Close(); } } } Merci pour votre aide. Olivier
×
×
  • 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.