Class CVEML6075

La classe CVEML6075 est dédiée au support par la librairie cpp2835 des composants VISHAY VEML6075 pour la mesure de l'indice UV. Cette classe hérite de la classe CI2CDevice.


Quelques détails sur le VEML6075 :

La documentation de ce composant est d'une clarté....... obscure !

Tout d'abord c'est un des rares composants I2C qui, pour lire un registre, impose un restart entre l'envoi du registre à lire et sa lecture sans avoir envoyé de stop. J'avoue avoir mis un peu de temps à m'en rendre compte. C'est pourtant bel et bien dans la doc. Ensuite tous les registres sont en 16 bit, plutôt rare également. Et même ceux qui n'ont que le LSB contenant des infos.

Bref, pour supporter tout cela, j'ai mis en place une méthode spécifique à ce composant : ReadWord. Comme c'est le seul composant à ma disposition de ce type je ne l'ai pas remontée dans la hiérarchie de classes (CIC2Device, CI2CBus et C2835Driver). Si l'occasion se présente....

Pour calculer l'index UV il faut se reporter à une note d'application VISHAY spécifique. Super bien documentée, mais clairement destinée à des spécialistes. Tirer de cette note un code correct pour linéariser les mesures n'est pas simple. Heureusement, les gens de DFROBOT ont fait un travail remarquable sur ce composant. Ils ont un Wiki et un repository sur GitHub plutôt complets :

- https://wiki.dfrobot.com/Gravity_VEML6075_UV_Sensor_Module_SKU:%20SEN0303
- https://github.com/DFRobot/DFRobot_VEML6075

DFRobot a des distris en France, malheureusement ces distris ne représentent pas tous leurs produits. C'est dommage.

Bref, toutes les régles de linéarisation implémentées par cette classe sont directement issues de leur travail.

Ce composant travaille en deux modes : Continu ou one shot. Je n'ai pas trouvé d'intêret au mode one shot, donc le mode continu est uniquement supporté.

Exemple d'utilisation

Cet extrait de code est un pseudo code, il regroupe dans un même flot des opérations normalement disséminées dans diverses parties d'un programme.


// Déclaration des objets requis sous forme de pointeurs
C2835Driver* m_pDriver;
CI2CBus* m_pI2CBus;
CVEML6075 m_pVEML6075;

// Initialisation des pointeurs vers les objets requis à un pointeur nul
m_pDriver = nullptr;
m_pI2CBus = nullptr;
m_pVEML6075 = nullptr;

// Création et vérification de création des objets requis
if((m_pDriver = new C2835Driver()) == nullptr) return false;
if((m_pI2CBus = new CI2CBus(m_pDriver)) == nullptr) return false;
if((m_pVEML6075 = new CVEML6075(m_pI2CBus)) == nullptr) return false;

// Initialisation de la librairie et ouverture du bus I2C
if(!m_pDriver->Initialize()) return false;
if(!m_pI2CBus->Open(I2C_CLOCK_DIVIDER_65536)) false;

// Mise en service du VEML6075
if(!m_pVEML6075->Configure(VEML6075_INTEGRATION_TIME_400MS, VEML6075_DYNAMIC_SETTING_NORMAL)) return false;

// Prise de mesure et récupération des valeurs mesurées
UV_INDEX_CLASS UV;
if(!m_pVEML6075->Measure(&UV)) return false;

// En fin de programme, fermeture du bus I2C et arrêt de la librairie
if(m_pI2CBus != nullptr) m_pI2CBus->Close();
if(m_pDriver != nullptr) m_pDriver->Terminate();

// En fin de programme, effacement des objets utilisés
if(m_pVEML6075 != nullptr) delete m_pVEML6075;
if(m_pI2CBus != nullptr) delete m_pI2CBus;
if(m_pDriver != nullptr) delete m_pDriver;

Fonctions publiques

CVEML6075(CI2CBus* pI2CBus)
boolCheckForVEML6075(bool* pCheck)
boolConfigure(const VEML6075_INTEGRATION_TIME& eIntegration, const VEML6075_DYNAMIC_SETTING& eDynamic)
boolComputeUV()
floatGetUVA()
floatGetUVB()
floatGetUVIndex()
UV_INDEX_CLASSGetUVIndexClass()
boolMeasure(UV_INDEX_CLASS* peUVIndexClass)


CVEML6075::CVEML6075(CI2CBus* pI2CBus)

Description : Contructeur. Instancie un objet de la classe CTLS2591.


Paramètre : pI2CBus - type CI2CBus* - Pointeur vers l'objet CI2CBus auquel est connecté ce composant. L'objet pI2CBus aura été instancié et ouvert en amont de cet appel.



bool CVEML6075::CheckForVEML6075(bool* pCheck)

Description : Vérifie qu'il s'agit bien d'un VEML6075.


Paramètre de sortie : pCheck - type bool* - En sortie, retourne true si le composant est bien un VEML6075.


Valeur de retour : Booléen indiquant le succès (true) ou l'échec (false) de la fonction.



bool CVEML6075::Configure(const VEML6075_INTEGRATION_TIME& eIntegration, const VEML6075_DYNAMIC_SETTING& eDynamic)

Description : Applique les paramètres de mesure.


Paramètre : eIntegration - type VEML6075_INTEGRATION_TIME& - Durée d'intégration des mesures d'indice UV.

Paramètre : eDynamic - type VEML6075_DYNAMIC_SETTING& - Dynamique des mesures d'indice UV.


Valeur de retour : Booléen indiquant le succès (true) ou l'échec (false) de la fonction.



bool CVEML6075::ComputeUV()

Description : Le composant étant en mesures continues, cette fonction calcule les mesures UV avec les dernières valeurs retournées par le composant. Suite à l'appel de cette fonction on pourra lire les paramètres calculés via les fonctions GetUVA, GetUVB, GetUVIndex et GetUVIndexClass.


Valeur de retour : Booléen indiquant le succès (true) ou l'échec (false) de la fonction.



float CVEML6075::GetUVA()

Description : Retourne la composante UVA. Cette fonction doit être appelée après la fonction ComputeUV.


Valeur de retour : Composante UVA.



float CVEML6075::GetUVB()

Description : Retourne la composante UVB. Cette fonction doit être appelée après la fonction ComputeUV.


Valeur de retour : Composante UVB.



float CVEML6075::GetUVIndex()

Description : Retourne la valeur brute d'indice UV. Cette fonction doit être appelée après la fonction ComputeUV.


Valeur de retour : Indice UV.



bool CVEML6075::Measure(UV_INDEX_CLASS* peUVIndexClass)

Description : Retourne une mesure de luminosité en fonction du gain et de la durée d'intégration.


Paramètre de sortie : peUVIndexClass - type UV_INDEX_CLASS* - Pointeur vers une donnée de type UV_INDEX_CLASS contenant l'indice UV selon la normalisation ISO.


Valeur de retour : Booléen indiquant le succès (true) ou l'échec (false) de la fonction.