mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
174 lines
5.5 KiB
C
174 lines
5.5 KiB
C
/*
|
|
* Copyright (C) 2018 Otto-von-Guericke-Universität Magdeburg
|
|
*
|
|
* 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 SHT10/11/15 family of temperature and
|
|
* humidity sensors
|
|
*
|
|
* @author Marian Buschsieweke <marian.buschsieweke@ovgu.de>
|
|
*
|
|
* @}
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stddef.h>
|
|
|
|
#include "shell.h"
|
|
#include "sht1x_params.h"
|
|
#include "container.h"
|
|
|
|
#define SHT1X_NUM ARRAY_SIZE(sht1x_params)
|
|
extern sht1x_dev_t sht1x_devs[SHT1X_NUM];
|
|
static sht1x_dev_t *dev = &sht1x_devs[0];
|
|
|
|
static int run_tests(void)
|
|
{
|
|
const char *resolution[] = { "high", "low" };
|
|
const char *calibration[] = { "on", "off" };
|
|
const char *heater[] = { "off", "on" };
|
|
const char *crc[] = { "on", "off" };
|
|
uint8_t conf = 0;
|
|
|
|
puts("Reading the sensor three times for all possible configurations:");
|
|
|
|
for (int i_res = 0; i_res < 2; i_res++) {
|
|
if (i_res) {
|
|
conf |= SHT1X_CONF_LOW_RESOLUTION;
|
|
}
|
|
else {
|
|
conf &= ~(SHT1X_CONF_LOW_RESOLUTION);
|
|
}
|
|
|
|
for (int i_cal = 0; i_cal < 2; i_cal++) {
|
|
if (i_cal) {
|
|
conf |= SHT1X_CONF_SKIP_CALIBRATION;
|
|
}
|
|
else {
|
|
conf &= ~(SHT1X_CONF_SKIP_CALIBRATION);
|
|
}
|
|
|
|
for (int i_heater = 0; i_heater < 2; i_heater++) {
|
|
if (i_heater) {
|
|
conf |= SHT1X_CONF_ENABLE_HEATER;
|
|
}
|
|
else {
|
|
conf &= ~(SHT1X_CONF_ENABLE_HEATER);
|
|
}
|
|
|
|
for (int i_crc = 0; i_crc < 2; i_crc++) {
|
|
if (i_crc) {
|
|
conf |= SHT1X_CONF_SKIP_CRC;
|
|
}
|
|
else {
|
|
conf &= ~(SHT1X_CONF_SKIP_CRC);
|
|
}
|
|
|
|
printf("Resolution: %s, calibration: %s, heater: %s, "
|
|
"CRC-checking: %s\n",
|
|
resolution[i_res],
|
|
calibration[i_cal],
|
|
heater[i_heater],
|
|
crc[i_crc]);
|
|
switch (sht1x_configure(dev, conf)) {
|
|
case 0:
|
|
break;
|
|
case -EIO:
|
|
puts("Error: gpio_init() failed");
|
|
return -1;
|
|
case -EPROTO:
|
|
puts("Error: Sensor did not acknowledge command");
|
|
return -1;
|
|
case -ECANCELED:
|
|
puts("Error: Sensor did not apply configuration");
|
|
return -1;
|
|
case -EBADMSG:
|
|
puts("Error: CRC error while validating "
|
|
"configuration");
|
|
return -1;
|
|
default:
|
|
/* Will never happen, but better safe than sorry */
|
|
puts("Unknown error");
|
|
return -1;
|
|
}
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
int16_t temp, hum;
|
|
switch (sht1x_read(dev, &temp, &hum)) {
|
|
case 0:
|
|
break;
|
|
case -EIO:
|
|
puts("Error: gpio_init() failed");
|
|
return -1;
|
|
case -EPROTO:
|
|
puts("Error: Sensor did not acknowledge "
|
|
"command");
|
|
return -1;
|
|
case -ECANCELED:
|
|
puts("Error: Measurement timed out");
|
|
return -1;
|
|
default:
|
|
/* Won't happen, but better safe than sorry */
|
|
puts("Unknown error");
|
|
return -1;
|
|
}
|
|
|
|
printf("Temperature: %i.%02i°C, Humidity: %i.%02i%%\n",
|
|
(int)temp / 100, (int)temp % 100,
|
|
(int)hum / 100, (int)hum % 100);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
puts("Restoring default configuration");
|
|
switch (sht1x_configure(dev, 0)) {
|
|
case 0:
|
|
break;
|
|
case -EIO:
|
|
puts("Error: gpio_init() failed");
|
|
return -1;
|
|
case -EPROTO:
|
|
puts("Error: Sensor did not acknowledge command");
|
|
return -1;
|
|
case -ECANCELED:
|
|
puts("Error: Sensor did not apply configuration");
|
|
return -1;
|
|
case -EBADMSG:
|
|
puts("Error: CRC error while validating "
|
|
"configuration");
|
|
return -1;
|
|
default:
|
|
/* Will never happen, but better safe than sorry */
|
|
puts("Unknown error");
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
if (run_tests()) {
|
|
puts("TESTS FAILED!");
|
|
}
|
|
else {
|
|
puts("All automatic tests finished.");
|
|
}
|
|
|
|
puts("Dropping to shell for manual testing");
|
|
char line_buf[SHELL_DEFAULT_BUFSIZE];
|
|
shell_run(NULL, line_buf, SHELL_DEFAULT_BUFSIZE);
|
|
|
|
return 0;
|
|
}
|