Constuire un photomètre avec Arduino
By Pierre-Alain B on Saturday, February 6 2016, 14:08 - Permalink
Nous allons expliquer ici comment fabriquer un photomètre avec la plateforme Arduino et le composant BH1750 (encore appelé GY-30, fiche technique ici) que l'on trouve pour quelques euros chez les bons revendeurs électroniques.
Un photomètre qui parle en série
Une première version du photomètre sera simple : nous utiliserons les facultés d'Arduino à communiquer via un port série pour afficher le niveau de luminosité mesuré. Le circuit est alors assez simple (cf. représentation ci-dessous) :
- le pin VCC du capteur se connecte au pin 5V de l'Arduino
- le pin GND du capteur se connecte au pin GND de l'Arduino
- le pin SDA du capteur se connecte au pin A4 (Analogique 4) de l'Arduino
- le pin SDL du capteur se connecte au pin A5 (Analogique 5) de l'Arduino

On compile alors le code suivant et on le charge sur l'Arduino (par exemple avec l'IDE Arduino) :
#include <Wire.h>
int BH1750_address = 0x23; // i2c Addresse
byte buff[2];
void setup() {
Wire.begin();
BH1750_Init(BH1750_address);
delay(200);
Serial.begin(9600);
Serial.println("Démarrage du système... patientez svp !");
}
void loop() {
float valf=0;
if(BH1750_Read(BH1750_address)==2){
valf=((buff[0]<<8)|buff[1])/1.2;
if(valf<0) {
Serial.print("> 65535");
}
else {
Serial.print((int)valf,DEC);
}
Serial.println(" lx");
}
delay(1000);
}
void BH1750_Init(int address) {
Wire.beginTransmission(address);
Wire.write(0x10); // 1 [lux] aufloesung
Wire.endTransmission();
}
byte BH1750_Read(int address) {
byte i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available()) {
buff[i] = Wire.read();
i++;
}
Wire.endTransmission();
return i;
}
Et hop, sur le port série, on peut voir :
Démarrage du système... patientez svp ! 92 lx 92 lx 92 lx 75 lx 47 lx 342 lx 43 lx
Un photomètre avec son propre écran LCD
Rajoutons un écran LCD pour afficher le résultat sans avoir à ouvrir un port série ! Nous allons donc brancher un LCD Keypad Shield (tel qu'ici) sur l'Arduino, et nous allons modifier le code comme suit :
#include <Wire.h>
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int BH1750_address = 0x23; // i2c Addresse
byte buff[2];
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Look the world");
Wire.begin();
BH1750_Init(BH1750_address);
delay(200);
Serial.begin(9600);
}
void loop(){
float valf=0;
if(BH1750_Read(BH1750_address)==2) {
valf=((buff[0]<<8)|buff[1])/1.2;
if(valf<0) {lcd.setCursor(0,0); lcd.print("> 65535 lx");}
else {lcd.setCursor(0,0); lcd.print((int)valf,DEC); lcd.print(" lx ");}
}
else {
lcd.setCursor(0,0); lcd.print("Error... "+BH1750_Read(BH1750_address));
}
delay(1000);
}
void BH1750_Init(int address) {
Wire.beginTransmission(address);
Wire.write(0x10); // 1 [lux] aufloesung
Wire.endTransmission();
}
byte BH1750_Read(int address){
byte i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available()){
buff[i] = Wire.read();
i++;
}
Wire.endTransmission();
return i;
}
On compile et on charge sur l'Arduino, et hop le tour est joué !
