BH1750. Capteur de lumière ambiante avec bus I2C.

BH1750. Capteur de lumière ambiante avec bus I2C.

BH1750. Capteur de lumière ambiante avec bus I2C.

Le BH1750 est un capteur d'éclairage ambiant doté d'une résolution et d'une sensibilité raisonnablement élevées. Il se comporte face à la lumière visible d'une manière comparable à celui de l'œil humain et n'est pas affecté par le rayonnement infrarouge et ne dépend pas non plus de la température de couleur du type d'éclairage, c'est-à-dire qu'il fonctionne bien avec la lumière naturelle et avec différents types d'éclairage artificiel. Il communique numériquement avec le microcontrôleur, avec le Bus I2C, il résiste donc aux interférences s'il est placé à une certaine distance du circuit qui le lit. Son temps de réponse est assez faible, inférieur à 200 ms dans les circonstances les plus défavorables.

Table des matières

    Capteur de lumière ambiante BH1750

    Du point de vue électronique, sa mise en œuvre est très simple. Il suffit de brancher l'alimentation (entre 2,4 V et 3,6 V) et le Bus I2C. En option, l'adresse du bus peut être modifiée pour connecter deux appareils (avec ADDR à un niveau bas, c'est 0B0100011 ou 0x23 et avec ADDR à un niveau élevé, c'est 0B1011100 ou 0x5C) et la ligne VDI peut être utilisée pour la fonction de réinitialisation avec le microcontrôleur.

    Pour connecter le BH1750 à Arduino, en plus d'être alimenté par la sortie 3,3 V, le plus correct est d'utiliser un convertisseur de niveau en plus du résistances de rappel pour lui Bus I2C. Bien que le composant prenne en charge une connexion directe au bus Bus I2C Il n'est pas conseillé de dimensionner un circuit sans considérer la conversion du niveau.

    Capteur de lumière ambiante BH1750. Circuit d'application

    En raison de sa popularité, qui est due à son prix très bon marché par rapport à sa précision, il existe plusieurs modules, comme le célèbre GY-30, que l'on peut voir sur la photo du début. Pour les connecter plus confortablement lors du prototypage avec un microcontrôleur, ils incluent généralement des convertisseurs de niveau pour le Bus I2C et des régulateurs de tension pour les alimenter avec une tension plus élevée (jusqu'à 5 V) au lieu de la sortie 3,3 V de Arduino.

    Le BH1750 dispose de deux modes de lecture, continue et individuelle, qui correspondent à deux états, actif et faible consommation ou veille. Alors que si le mode de lecture continue est utilisé, le BH1750 reste actif après l'échantillonnage, après avoir effectué une mesure individuelle, il entre automatiquement en mode veille et faible consommation. La première lecture en mode continu prend au maximum 180 ms et les suivantes entre 16 ms et 120 ms selon la résolution.

    Le capteur est capable de mesurer à des intervalles (résolution) de 4 lux, 1 lux et 0,5 lux. Le BH1750 recommande dans sa fiche technique d'utiliser la résolution de 1 lux, qui permet de distinguer un éclairement inférieur à 10 lux (ce qui correspond à la lumière crépusculaire) et qui est plus insensible au bruit pouvant affecter la mesure.

    Les résolutions de 1 lux et 4 lux utilisent les 16 bits de données pour représenter la partie entière afin qu'une mesure maximale de 65535 0,5 lux puisse être atteinte (journée ensoleillée sans lumière directe). Le mode 0,5 lux utilise le bit le moins significatif pour la partie décimale (mesure de 0,5 lux à 15 lux) donc avec les 32767 bits restants il est possible de représenter une valeur maximale de XNUMX lux (extérieur sans lumière directe)

    Éclairage solaire théorique par rapport à la capacité moyenne du BH1750
    Eclairage solaire théorique du lieu et jour de rédaction de l'article (heure légale, non solaire) versus capacité moyenne du BH1750 à 1 lux

    Normalement, la fenêtre optique selon laquelle la lumière ambiante est mesurée correspond à l'ensemble du spectre visible et l'objectif est d'y obtenir une répartition de sensibilité comparable à celle de l'homme. Si la fenêtre optique est réduite (la lumière est mesurée dans une plage de longueurs d'onde inférieure) la sensibilité du BH1750 peut être augmentée (jusqu'à 0,11 lux) avec un mode d'annulation du réglage de l'influence de la fenêtre optique en augmentant la lecture du temps en proportion. Puisque dans ce mode spécial (surdimensionné) des lectures séparées sont effectuées, le contexte doit le permettre sans altérer particulièrement les conditions de mesure (par exemple, le capteur doit rester très stable, il ne doit pas se déplacer dans une zone avec des conditions d'éclairage différentes)

    Codes de fonctionnement du BH1750

    Ville
    5>

    • 0B00000000 (0x00) Faible consommation ou mode veille.

    • 0B00000001 (0x01) Allumé.

    • 0B00000111 (0x07) Réinitialiser. Efface les journaux de données du BH1750.

    Résolution
    5>

    • 0B00010011 (0x13) Mesure continue à une résolution de 4 lux (entre 16 ms et temps de lecture)

    • 0B00010000 (0x10) Mesure continue à une résolution de 1 lux (temps de lecture 120 ms)

    • 0B00010001 (0x11) Mesure continue à une résolution de 0,5 lux (temps de lecture 120 ms)

    • 0B00100011 (0x23) Une mesure à une résolution de 4 lux (temps de lecture 16 ms)

    • 0B00100000 (0x20) Une mesure à une résolution de 1 lux (temps de lecture 120 ms)

    • 0B00100001 (0x21) Une mesure à une résolution de 0,5 lux (temps de lecture 120 ms)

    Ajustement pour changement de fenêtre optique
    5>

    • 0B011MT [0,1,2,3,4] Bit bas du registre MTREG (Measurement Time REGister).

    • 0B01000MT [5,6,7] MTREG enregistre le bit haut.

    Lisez le BH1750 d'Arduino

    Pour mesurer l'éclairage ambiant avec le BH1750 de Arduino la bibliothèque est utilisée fil qui gère les communications avec le Bus I2C. Le processus est habituel dans ce type de communications, elles sont d'abord activées (une fois dans le programme) avec Wire.begin(), la communication avec le BH1750 commence par Wire.beginTransmission() et votre adresse I2C (0x5C ou 0x23 selon que l'ADDR est respectivement haut ou bas), il se configure en envoyant le code correspondant avec Wire.write() et le bus est libéré avec Wire.endTransmission()

    Si l'un des modes de lecture continue est utilisé, Wire.beginTransmission() est utilisé pour obtenir les données avec l'adresse I2C correspondant à l'accès au BH1750, deux octets sont demandés (la résolution est de 16 bits) avec Wire.requestFrom() qui sont lus, en utilisant Wire.read(), et sont chargés dans un entier non signé, en faisant tourner le premier octet de 8 bits. Le bus est ensuite libéré avec Wire.endTransmission(). Le résultat final est obtenu en divisant la valeur renvoyée par le facteur de précision (1,2 si la fenêtre optique n'est pas modifiée)

    Si le mode lectures individuelles est utilisé, le BH1750 passe en mode veille. Pour revenir en mode actif, une configuration (le même mode de lecture ou un nouveau) ou le code de mise sous tension (0x01) peut être envoyé. Le code d'arrêt (1750x0) peut être utilisé pour forcer le BH00 en mode veille.

    Il est important de respecter le temps de lecture du capteur, qui dépend de la résolution. Si l'attente n'est pas critique, elle peut être unifiée en une valeur pour tous les cas qui peut être légèrement supérieure au maximum attendu pour garantir la fin de la lecture.

    Pour rendre l'écriture du code du BH1750 plus confortable dans Arduino, les codes d'opération les plus pertinents se trouvent dans le document d'en-tête suivant.

    L'exemple de code suivant montre le mode de lecture le plus courant dans le capteur de lumière I2C BH1750. La résolution est de 1 lux et le mode de lecture est continu. L'exemple montre, en utilisant la console série Arduino, chaque résultat obtenu à partir de la valeur mesurée.

    Comme je l'ai dit ci-dessus, les modes de résolution 1 lux et 4 lux utilisent les 16 bits de données pour exprimer la mesure sous forme d'entier. En revanche, en mode 0,5 lux, le dernier bit représente une partie décimale, c'est-à-dire que la valeur qui contribue à la mesure totale est décalée d'une puissance de deux vers la droite. En mode 1 lux ou 4 lux, le dernier bit (LSB) vaut 20, l'avant-dernier 21, les 2 suivants2…en mode 0,5 lux, le dernier bit (LSB) vaut 2-1, l'avant-dernier 20, les 2 suivants1...

    Selon cette structure de données, et considérant que deux lectures doivent être effectuées I2C d'un octet, pour obtenir la valeur 16 bits il faut charger les bits de poids fort de l'octet, les premiers à lire, et les faire pivoter de 8 bits vers la gauche dans le mode résolution 1 lux et dans le mode résolution 4 lux et seulement 7 bits à 0,5 lux. Pour unifier la manière de lire en mode 0,5 lux, vous pouvez charger l'octet de poids fort dans un entier non signé, faire pivoter 8 bits vers la gauche, charger l'octet de poids faible et faire pivoter l'entier non signé entier de 1 bit vers la gauche, en préservant la valeur de la partie décimale qui indique le LSB (bit le moins significatif) pour l'appliquer plus tard.

    Logiquement, pour les modes 1 lux ou 4 lux il faut utiliser des entiers non signés (unsigned int) pour que Arduino ne réservez pas le MSB (bit le plus significatif) pour le signe et pouvoir opérer directement avec la vraie valeur de la mesure, et non avec un nombre négatif. Dans Arduino Due Ce n'est pas nécessaire puisque les entiers utilisent 32 bits, mais le même programme fonctionnera également s'il est également utilisé unsigned int.

    Le code suivant montre comment le mode 0,5 lux serait utilisé

    Téléchargez les documents pour les exemples de mesure de la lumière ambiante avec le capteur BH1750 et Arduino.

    Poster un commentaire

    Vous avez peut-être manqué