C/C++ on Intel Galielo/Edison: Part6 Light sensor

In this post, we will be using the upm library to interface the  Grove Light sensor
with the Galileo/Edison using upm on C++.

The light sensor is made up of primarily of LDR and opamp:


“LDR” stands for light dependent resistor (in above schematic, it is marked as “LIGHT”) as the name suggests, it is made up of a material that changes it resistance depending on the intensity of the ambient light.

Normally, the resistance decreases when the ambient light intensity increases. The operational amplifier (op amp) in the Light sensor Grove module is configured in voltage follower mode. Which means that the opamp will output whatever voltage is applied at the “+” input. This helps us yo have the proper signal strength at the ADC pin. The LDR along with resistor R1 forms the voltage divider circuit applied at “+” input. The LDR is connected between Vcc and the rest of the voltage divider circuit. Now with the varying resistance of the LDR (with light intensity) which is part of the voltage divider circuit, the current flowing through LDR and hence the voltage at point “+” changes (in accordance to ohm’s law), this is output by the opamp and this is what will be measured by the Galileo/Edison using ADC.

Hardware connections

Connect the light sensor to port A0 and LED to port D5 either using the Grove LED module or on a breadboard via the current limiting resistor as shown in the schematic.


The idea here is to control the intensity of the LED connected to port D5 using the light sensor


Download the source from github onto your Galileo/Edison

curl https://raw.githubusercontent.com/navin-bhaskar/C-CPP-on-Intel-Edison-Galileo/master/part6-light_sensor/light_sensor.cpp > light_sensor.cpp

Compile the code using following command:

g++ light_sensor.cpp -o light_sensor -lupm-grove -lmraa

Run the example using following command


Vary the intensity on the light sensor by using a torch or flash light from your phone to see the intensity of the LED connected to port D5 chnage and also the vertical bar displayed on the console should vary in accordance to the intensity of the ambient light.

You can press ctrl-c to exit the script anytime.

The code:

Since we need the PWM, we initialize the mraa and PWM pin D5 (Step1, 2, 4, 5)

For initializing and using the light sensor, we use the “GroveLight” object from the upm namesapce (step 2).

upm::GroveLight *light = NULL;   /* Will hold pointer to light sensor object */

The PWM is initialized and enabled at pin D5:

pwmPin = mraa_pwm_init(LED_PWM_PIN);
mraa_pwm_period_us(pwmPin, 5000);      // Set the period as 5000 us or 5ms
mraa_pwm_enable(pwmPin, 1);

Then, in a while loop, we keep reading the light sensor value using the “value” method which returns the intensity in ‘lux’ units.

ambientLight = light->value();

Thus read value is normalized and used to control the PWM duty cycle and to control the bar displayed in the console (step 6,7,8,9).