f05cbb421d
Correct handling of device encoded temperature values, which combine a 12-bit 2s complement signed value with a separate sign bit. Rework conversion between device and sensor temperature representations to support negative temperatures in both domains. Use a much simpler trigger configuration where the alert is driven by comparator output, rather than as an interrupt that requires a pair of I2C transactions to read and clear the flag. Refactor the trigger infrastructure to use the setup/handle/process idiom, which reduces duplicated code and to correctly detect alerts present when the triggers are set. Completely replace the sample with something that demonstrates updating upper and lower threshold values to track moving temperatures. Signed-off-by: Peter A. Bigot <pab@pabigot.com>
74 lines
2.1 KiB
ReStructuredText
74 lines
2.1 KiB
ReStructuredText
.. _mcp9808-sample:
|
|
|
|
MCP9808 Temperature Sensor
|
|
##########################
|
|
|
|
Overview
|
|
********
|
|
|
|
This sample application periodically (0.5 Hz) measures the ambient
|
|
temperature. The result is written to the console.
|
|
|
|
If triggered measurements are enabled the sample initializes and
|
|
maintains a |plusminus| 2 |deg| C window around the current temperature.
|
|
When the temperature moves outside the window an alert is given, and the
|
|
window is moved to center on the new temperature.
|
|
|
|
Requirements
|
|
************
|
|
|
|
The MCP9808 digital temperature sensor converts temperatures between -20 |deg|
|
|
C and +100 |deg| C to a digital word with |plusminus| 0.5 |deg| C (max.)
|
|
accuracy. It is I2C compatible and supports up to 16 devices on the bus.
|
|
|
|
Wiring
|
|
*******
|
|
|
|
The MCP9808 is available in a discrete component form but it is much easier to
|
|
use it mounted on a breakout board. We used the Adafruit `MCP9808
|
|
Sensor`_ breakout board.
|
|
|
|
.. _`MCP9808 Sensor`: https://www.adafruit.com/product/1782
|
|
|
|
Building and Running
|
|
********************
|
|
|
|
After providing a devicetree overlay that specifies the sensor I2C bus
|
|
and alert GPIO, build this sample app using:
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/sensor/mcp9808
|
|
:board: particle_xenon
|
|
:goals: build flash
|
|
|
|
Sample Output
|
|
=============
|
|
|
|
Note that in the capture below output from the trigger callback and the
|
|
main thread are interleaved.
|
|
|
|
.. code-block:: console
|
|
|
|
*** Booting Zephyr OS build zephyr-v2.1.0-537-gbbdeaa1ae5bb ***
|
|
Alert on temp outside [24500, 25500] milli-Celsius
|
|
Trtrigger fired 1, temp 15.9375 C
|
|
iggAlert on temp outside [15437, 16437] milli-Celsius
|
|
er set got 0
|
|
0:00:00.017: 15.9375 C
|
|
0:00:02.020: 16 C
|
|
0:00:04.022: 16.125 C
|
|
0:00:06.024: 16.1875 C
|
|
trigger fired 2, temp 16.3125 C
|
|
Alert on temp outside [15812, 16812] milli-Celsius
|
|
0:00:08.027: 16.3125 C
|
|
0:00:10.029: 16.375 C
|
|
0:00:12.032: 16.5 C
|
|
0:00:14.034: 16.5625 C
|
|
0:00:16.037: 16.5625 C
|
|
0:00:18.039: 16.625 C
|
|
0:00:20.042: 16.6875 C
|
|
trigger fired 3, temp 16.8125 C
|
|
Alert on temp outside [16312, 17312] milli-Celsius
|
|
0:00:22.044: 16.8125 C
|
|
0:00:24.047: 16.875 C
|