EsploraLightCalibrator

Read and calibrate the light sensor on the Esplora.

Esplora Light Calibrator

This sketch shows you how to read and calibrate the Esplora's light sensor. Because light levels vary from one location to another, you need to calibrate the sensor for each location. To do this, you read the sensor for a few seconds, and save the highest and lowest readings as maximum and minimum.

You'll use the sensor's reading to set the brightness of the LED by mapping the values to a smaller range, using the minimum and the maximum values you obtained in the calibration.

Hardware Required

  • Arduino Esplora

Circuit

Only your Arduino Esplora is needed for this example. Connect the Esplora to your computer with a USB cable and open the Arduino's Serial Monitor.

light sensor and RGB led on the Esplora
light sensor and RGB led on the Esplora

Code

Create some variables to hold your maximum and minimum values for the light sensor, and another one to let the Esplora know if the sensor has been calibrated or not.

To send data to your computer, you need to open a serial connection. Use Serial.begin() to open a serial port at 9600 baud on the Esplora.

Use Esplora.readButton() to see if button 1 is being pressed. If it is, call the

calibrate()
function you'll be writing below.

To read the light sensor, use Esplora.readLightSensor(). This will give you a value between 0 and 1023, which will be stored in a variable.

You'll want to map the value from the sensor to a range that is appropriate for the LED using your maximum and minimum range. The map() function takes 5 arguments, the original value, the minimum value of the sensor, the maximum value of the sensor, the minimum value of the LED (0), and the maximum value of the LED (255). Store this value in a new variable named

brightness
.

The map() function doesn't limit the values to 0 and 255. If you happen to get sensor readings outside your maximum and minimum values, map() would return values less than 0 or higher than 255. To make sure you stay in that range, call constrain().

To change the color of the LED with your new value between 0 and 255, call Esplora.writeBlue().

Once the light has been calibrated, send the values to the Serial Monitor by calling Serial.print(). You should start to see values reported like this :

light sensor level: 256 blue brightness: 10

These values will not print to the Serial Monitor until you've calibrated the sensor, and the

calibrated
variable is set to
true
.

To create your own function called

calibrate
. To do this, outside of the
loop()
, type

1void calibrate (){
2
3}

This creates a function named

calibrate
. All the code you write between the brackets will now be executed whenever you call
calibrate()
in your sketch.

In

calibrate()
, use while() to run the code aslong as the button is pressed.

Read the value of the sensor, and save it in a variable. Initially, you had set the minimum value high. Compare the light sensor value for anything lower than that, saving it as the new minimum. Likewise, you set the maximum low and read for anything higher as the new maximum.

Set the calibration variable to

true
while you're calibrating.

When you release the button,

calibrate()
will stop running and return to the
loop()
.

1/*
2
3 Esplora Led calibration
4
5 This sketch shows you how to read and calibrate the light sensor.
6
7 Because light levels vary from one location to another, you need to calibrate the
8
9 sensor for each location. To do this, you read the sensor for a few seconds,
10
11 and save the highest and lowest readings as maximum and minimum.
12
13 Then, when you're using the sensor's reading (for example, to set the brightness
14
15 of the LED), you map the sensor's reading to a range between the minimum
16
17 and the maximum.
18
19 Created on 22 Dec 2012
20
21 by Tom Igoe
22
23 This example is in the public domain.
24
25 */
26
27#include <Esplora.h>
28
29// variables:
30int lightMin = 1023; // minimum sensor value
31int lightMax = 0; // maximum sensor value
32
33bool calibrated = false; // whether the sensor's been calibrated yet
34
35void setup() {
36
37 // initialize the serial communication:
38
39 Serial.begin(9600);
40
41 // print an initial message
42
43 Serial.println("To calibrate the light sensor, press and hold Switch 1");
44}
45
46void loop() {
47
48 // if switch 1 is pressed, go to the calibration function again:
49
50 if (Esplora.readButton(1) == LOW) {
51
52 calibrate();
53
54 }
55
56 // read the sensor into a variable:
57
58 int light = Esplora.readLightSensor();
59
60 // map the light level to a brightness level for the LED
61
62 // using the calibration min and max:
63
64 int brightness = map(light, lightMin, lightMax, 0, 255);
65
66 // limit the brightness to a range from 0 to 255:
67
68 brightness = constrain(brightness, 0, 255);
69
70 // write the brightness to the blue LED.
71
72 Esplora.writeBlue(brightness);
73
74 // if the calibration's been done, show the sensor and brightness
75
76 // levels in the serial monitor:
77
78 if (calibrated == true) {
79
80 // print the light sensor levels and the LED levels (to see what's going on):
81
82 Serial.print("light sensor level: ");
83
84 Serial.print(light);
85
86 Serial.print(" blue brightness: ");
87
88 Serial.println(brightness);
89
90 }
91
92 // add a delay to keep the LED from flickering:
93
94 delay(10);
95}
96
97void calibrate() {
98
99 // tell the user what do to using the serial monitor:
100
101 Serial.println("While holding switch 1, shine a light on the light sensor, then cover it.");
102
103 // calibrate while switch 1 is pressed:
104
105 while (Esplora.readButton(1) == LOW) {
106
107 // read the sensor value:
108
109 int light = Esplora.readLightSensor();
110
111 // record the maximum sensor value:
112
113 if (light > lightMax) {
114
115 lightMax = light;
116
117 }
118
119 // record the minimum sensor value:
120
121 if (light < lightMin) {
122
123 lightMin = light;
124
125 }
126
127 // note that you're calibrated, for future reference:
128
129 calibrated = true;
130
131 }
132}

Contribute to Arduino

Join the community and suggest improvements to this article via GitHub. Make sure to read out contribution policy before making your pull request.

Missing something?

Check out our store and get what you need to follow this tutorial.

Suggest Changes

The content on docs.arduino.cc is facilitated through a public GitHub repository. You can read more on how to contribute in the contribution policy.