mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
119 lines
3.7 KiB
C
119 lines
3.7 KiB
C
/*
|
|
* Copyright (C) 2016 Inria
|
|
* Copyright (C) 2018 Freie Universität Berlin
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*/
|
|
|
|
/**
|
|
* @ingroup tests
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief Test application for the TSL4531x Lux sensor
|
|
*
|
|
* @author Daniel Petry <daniel.petry@fu-berlin.de>
|
|
*
|
|
* @}
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
|
|
#include "xtimer.h"
|
|
#include "periph/i2c.h"
|
|
|
|
#include "tsl4531x.h"
|
|
#include "tsl4531x_params.h"
|
|
|
|
#define _100ms_in_us (100 * 1000u) /* 1 second delay between printf */
|
|
|
|
int main(void)
|
|
{
|
|
tsl4531x_t dev;
|
|
int err;
|
|
|
|
puts("TSL4531x test application. Initializing...");
|
|
|
|
if ((err = tsl4531x_init(&dev, tsl4531x_params)) < 0) {
|
|
printf("[Error] Device not initialised. Error code: %d\n", err);
|
|
return 1;
|
|
}
|
|
|
|
puts("[Info] Initialized, beginning test.");
|
|
|
|
while (1) {
|
|
|
|
uint16_t lux;
|
|
|
|
printf("-------------------------------------------------------------");
|
|
printf("-------------------------\n");
|
|
|
|
/* Set into high power mode */
|
|
tsl4531x_set_low_power_mode(&dev, false);
|
|
|
|
/* Test simple read - high power mode */
|
|
lux = tsl4531x_simple_read(&dev);
|
|
printf("Illuminance | High power mode | Synchronous read |");
|
|
printf(" [lx] | %u\n", lux);
|
|
|
|
/* Determine the actual integration time - how long does it take for a
|
|
value to change?
|
|
Note that if the sensor value doesn't change between integration
|
|
cycles, this will sum the previous integration times. This mostly
|
|
won't happen, but it's best to let this run for a few cycles and take
|
|
the minimum. */
|
|
uint16_t lux_last = lux;
|
|
uint8_t changes = 0;
|
|
uint32_t change_times[2];
|
|
while (changes < 2) {
|
|
lux = tsl4531x_get_sample(&dev);
|
|
if (lux != lux_last) {
|
|
lux_last = lux;
|
|
change_times[changes] = xtimer_now_usec();
|
|
changes++;
|
|
}
|
|
}
|
|
|
|
printf("Sample ready time | High power mode | From device |");
|
|
printf(" [us] | %lu\n", (unsigned long)(change_times[1] - change_times[0]));
|
|
|
|
/* Set into low power mode */
|
|
tsl4531x_set_low_power_mode(&dev, true);
|
|
|
|
/* This tests what happens when you read without asking for a sample in
|
|
low power mode. */
|
|
lux = tsl4531x_get_sample(&dev);
|
|
printf("Illuminance | Low power mode | Immediate read after mode change |");
|
|
printf(" [lx] | %u\n", lux);
|
|
xtimer_usleep(tsl4531x_time_until_sample_ready(&dev));
|
|
lux = tsl4531x_get_sample(&dev);
|
|
printf("Illuminance | Low power mode | One cycle time after mode change |");
|
|
printf(" [lx] | %u\n", lux);
|
|
|
|
/* Test synchronous read - low power mode */
|
|
lux = tsl4531x_simple_read(&dev);
|
|
printf("Illuminance | Low power mode | Synchronous read |");
|
|
printf(" [lx] | %u\n", lux);
|
|
|
|
/* Test asynchronous read - low power mode */
|
|
tsl4531x_start_sample(&dev);
|
|
|
|
/* Verify that the stated time until sample ready is reasonable. */
|
|
uint32_t t = tsl4531x_time_until_sample_ready(&dev);
|
|
xtimer_usleep(t);
|
|
lux = tsl4531x_get_sample(&dev);
|
|
printf("Illuminance | Low power mode | Asynchronous read |");
|
|
printf(" [lx] | %u\n", lux);
|
|
printf("Sample ready time | Low power mode | From driver |");
|
|
printf(" [us] | %lu\n", (unsigned long)t);
|
|
|
|
xtimer_usleep(_100ms_in_us);
|
|
}
|
|
|
|
return 0;
|
|
}
|