Constuire un photomètre avec Arduino
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é !