You can use the ambient light sensor to detect changes in lighting with an app written in C#.
An ambient light sensor is one of several types of environmental sensors that allow apps to respond to changes in the user's environment.
Roadmap: How does this topic relate to others? See: Roadmap for Windows Store apps using C# or Visual Basic.
The Windows.Devices.Sensors namespace includes support for a LightSensor object that apps can use to retrieve the current illuminance as a LUX value. For more information about LUX values, refer to the Sensor API documentation on MSDN.
Objective: After completing this quickstart you will understand how to use the light sensor to detect changes in lighting.
Prerequisites
You should be familiar with XAML, Visual C#, and events.
The device that you're using must have an ambient light sensor.
Time to complete: 20 minutes.
Instructions
1. Open Microsoft Visual Studio Express 2012 for Windows 8
Open an instance of Microsoft Visual Studio Express 2012 for Windows 8.
2. Create a new project
Create a new project, choosing a Blank Application from the Visual C#/Windows Store project types.
3. Insert the app C#
Open your project's BlankPage.xaml.cs file and replace the existing code with the following.
using System; using System.Collections.Generic; using System.IO; using System.Linq; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; using Windows.UI.Core; // Required to access the core dispatcher object using Windows.Devices.Sensors; // Required to access the sensor platform and the ALS // The Blank Page item template is documented at http://go.microsoft.com/fwlink/p/?linkid=234238 namespace Application1 { /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> public sealed partial class BlankPage : Page { private LightSensor _lightsensor; // Our app's lightsensor object // This event handler writes the current light-sensor reading to // the textbox named "txtLUX" on the app's main page. private void ReadingChanged(object sender, LightSensorReadingChangedEventArgs e) { Dispatcher.RunAsync(CoreDispatcherPriority.Normal, (s, a) => { LightSensorReading reading = (a.Context as LightSensorReadingChangedEventArgs).Reading; txtLuxValue.Text = String.Format("{0,5:0.00}", reading.IlluminanceInLux); }, this, e); } public BlankPage() { InitializeComponent(); _lightsensor = LightSensor.GetDefault(); // Get the default light sensor object // Assign an event handler for the ALS reading-changed event if (_lightsensor != null) { // Establish the report interval for all scenarios uint minReportInterval = _lightsensor.MinimumReportInterval; uint reportInterval = minReportInterval > 16 ? minReportInterval : 16; _lightsensor.ReportInterval = reportInterval; // Establish the even thandler _lightsensor.ReadingChanged += new TypedEventHandler<LightSensor, LightSensorReadingChangedEventArgs>(ReadingChanged); } } } }
You'll need to replace the class name in the previous snippet with the name of your app's class. For example, if you created a project named "Application2", you'd replace the following.
namespace Application1
You'd replace it with the following.
namespace Accelerometer2
4. Insert the app XAML
Open the file BlankPage.xaml and copy the following XML into this file (replacing its original contents).
<Page x:Class="Application1.BlankPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Application1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid x:Name="LayoutRoot" Background="Black"> <TextBlock HorizontalAlignment="Left" Height="44" Margin="52,38,0,0" TextWrapping="Wrap" Text="LUX Reading" VerticalAlignment="Top" Width="150"/> <TextBlock x:Name="txtLuxValue" HorizontalAlignment="Left" Height="44" Margin="224,38,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="217"/> </Grid> </Page>
You'll need to replace the first part of the class name in the previous snippet with the name of your app's class. For example, if you created a project named "Application2", you'd replace the following.
x:Class="Application1.BlankPage"
You'd replace it with the following.
x:Class="Application2.BlankPage"
5. Build the app
Choose Build > Build Solution to build the project.
6. Deploy the app
Choose Build > Deploy Solution to deploy the app.
7. Run the app
- Close Visual Studio Express 2012 for Windows 8.
- Start the App Launcher.
- Locate your app from the list of available apps and choose Launch.
Summary
The previous example demonstrates how little code you'll need to write in order to integrate light-sensor input in your app.
The app establishes a connection with the default sensor in the BlankPage method. This occurs on the following line.
_lightsensor = LightSensor.GetDefault(); // Get the default light sensor object
The app establishes the report interval within the BlankPage method. This code retrieves the minimum interval supported by the device and compares it to a requested interval of 16 milliseconds (which approximates a 60-Hz refresh rate). If the minimum supported interval is greater than the requested interval, the code sets the value to the minimum. Otherwise, it sets the value to the requested interval.
uint minReportInterval = _accelerometer.MinimumReportInterval; uint reportInterval = minReportInterval > 16 ? minReportInterval : 16; _accelerometer.ReportInterval = reportInterval;
The new light-sensor data is captured in the ReadingChanged method. Each time the sensor driver receives new data from the sensor, it passes the value to your app using this function (or event handler). The app registers this event handler on the following line.
_lightsensor.ReadingChanged += new TypedEventHandler<LightSensor,
LightSensorReadingChangedEventArgs>(ReadingChanged);
These new values are written to a TextBlock found in the project's XAML.
<TextBlock HorizontalAlignment="Left" Height="44" Margin="52,38,0,0" TextWrapping="Wrap" Text="LUX Reading" VerticalAlignment="Top" Width="150"/> <TextBlock x:Name="txtLuxValue" HorizontalAlignment="Left" Height="44" Margin="224,38,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="217"/>
Related topics
- LightSensor class
- LightSensor Sample
- Roadmap for creating Windows Store apps using C#, C++, or Visual Basic
Build date: 10/26/2012