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.
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.
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).