You can use the ambient light sensor to detect changes in lighting with an app written in JavaScript.
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 a light sensor to retrieve the current illuminance as a LUX value.
Prerequisites
You should be familiar with HTML, JavaScript, and events.
The device that you're using must have light sensor.
Time to complete: 15 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
To create a new project, click File > New Project. Under Templates, select Blank Application from the JavaScript project types.
3. Insert the app JavaScript
Open your project's default.js file and replace the existing code with the following.
// For an introduction to the Blank template, see the following documentation: // http://go.microsoft.com/fwlink/p/?linkid=232509 (function () { "use strict"; var lightSensor; // This function is invoked within onDataChanged to // retrieve the given identifier from the HTML document. function id(elementId) { return document.getElementById(elementId); } // This function is called each time an accelerometer event // is fired by the driver. function onDataChanged(e) { id('eventOutputIlluminance').innerHTML = e.reading.illuminanceInLux.toFixed(2); } var app = WinJS.Application; // This function responds to all app activations. app.onactivated = function (eventObject) { if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) { if (lightSensor == null) { lightSensor = Windows.Devices.Sensors.LightSensor.getDefault(); // Set the report interval var minimumReportInterval = lightSensor.minimumReportInterval; var reportInterval = minimumReportInterval > 16 ? minimumReportInterval : 16; lightSensor.reportInterval = reportInterval; // Establish the event handler lightSensor.addEventListener("readingchanged", onDataChanged); WinJS.UI.processAll(); } }; app.start(); })();
4. Insert the app HTML
Open the file default.htm and copy the following HTML into this file (replacing its original contents).
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Application1</title> <!-- WinJS references --> <link href="//Microsoft.WinJS.0.6/css/ui-dark.css" rel="stylesheet"> <script src="//Microsoft.WinJS.0.6/js/base.js"></script> <script src="//Microsoft.WinJS.0.6/js/ui.js"></script> <!-- Application1 references --> <link href="/css/default.css" rel="stylesheet"> <script src="/js/default.js"></script> </head> <body> <div class="item" id="scenario1Output"> Illuminance: <a id="eventOutputIlluminance">no data</a> </div> </body> </html>
5. Build, deploy and run the app
Press F5 (or click Debug > Start Debugging) to build, deploy, and run the app.
6. Stop the app
- Press ALT+Tab to return to Visual Studio.
- Press Shift+F5 (or Debug > Stop Debugging) to stop the app.
Summary and next steps
The previous example demonstrates how little code you'll need to write in order to integrate light-sensor input in your app.
In this example, new sensor data is captured in the onDataChanged function. Each time the sensor driver detects a change in the light-sensor readings, it passes the new values to your app by using this function (or event handler).
function onDataChanged(e) {
id('eventOutputIlluminance').innerHTML = e.reading.illuminanceInLux.toFixed(2);
}
These new values are written to the screen via updates to the DOM elements shown below.
<div class="item" id="scenario1Output">
Illuminance: <a id="eventOutputIlluminance">no data</a>
</div>
The app establishes the report interval within the onactivated function. 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.
var minimumReportInterval = accelerometer.minimumReportInterval; var reportInterval = minimumReportInterval > 16 ? minimumReportInterval : 16; accelerometer.reportInterval = reportInterval;
If you're writing a simple app, the next steps would typically involve integrating sensor input with graphic output.
For example, you could create a simple text-reader app that responds to changes in lighting by increasing or decreasing the contrast between the background and foreground colors.
Related topics
Build date: 10/26/2012