Demo for showing Thunderboard Sense 2's sensor values on a 15-second interval

Dependencies:   AMS_CCS811_gas_sensor BMP280 Si7021 Si7210 Si1133 ICM20648

Fork of TBSense2_Sensor_Demo by Steven Cooreman

Information

All examples in this repo are considered EXPERIMENTAL QUALITY, meaning this code has been created as one-off proof-of-concept and is suitable as a demonstration for experimental purposes only. This code will not be regularly maintained by Silicon Labs and there is no guarantee that these projects will work across all environments, SDK versions and hardware.

Committer:
stevew817
Date:
Sun Nov 12 20:19:59 2017 +0100
Revision:
3:2e1381d5e300
Parent:
2:f80572d04d7a
Add ICM20648 driver and sample code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stevew817 3:2e1381d5e300 1 /***************************************************************************//**
stevew817 3:2e1381d5e300 2 * @file main.cpp
stevew817 3:2e1381d5e300 3 *******************************************************************************
stevew817 3:2e1381d5e300 4 * @section License
stevew817 3:2e1381d5e300 5 * <b>(C) Copyright 2017 Silicon Labs, http://www.silabs.com</b>
stevew817 3:2e1381d5e300 6 *******************************************************************************
stevew817 0:fe1dd6f4950c 7 *
stevew817 3:2e1381d5e300 8 * SPDX-License-Identifier: Apache-2.0
stevew817 3:2e1381d5e300 9 *
stevew817 3:2e1381d5e300 10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
stevew817 3:2e1381d5e300 11 * not use this file except in compliance with the License.
stevew817 0:fe1dd6f4950c 12 * You may obtain a copy of the License at
stevew817 0:fe1dd6f4950c 13 *
stevew817 3:2e1381d5e300 14 * http://www.apache.org/licenses/LICENSE-2.0
stevew817 0:fe1dd6f4950c 15 *
stevew817 0:fe1dd6f4950c 16 * Unless required by applicable law or agreed to in writing, software
stevew817 3:2e1381d5e300 17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
stevew817 3:2e1381d5e300 18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
stevew817 0:fe1dd6f4950c 19 * See the License for the specific language governing permissions and
stevew817 0:fe1dd6f4950c 20 * limitations under the License.
stevew817 3:2e1381d5e300 21 *
stevew817 3:2e1381d5e300 22 ******************************************************************************/
stevew817 0:fe1dd6f4950c 23
stevew817 0:fe1dd6f4950c 24 #include <string>
stevew817 0:fe1dd6f4950c 25 #include "mbed.h"
stevew817 0:fe1dd6f4950c 26 #include "BMP280/BMP280.h"
stevew817 0:fe1dd6f4950c 27 #include "AMS_CCS811.h"
stevew817 0:fe1dd6f4950c 28 #include "Si7021.h"
stevew817 0:fe1dd6f4950c 29 #include "Si7210.h"
stevew817 2:f80572d04d7a 30 #include "Si1133.h"
stevew817 3:2e1381d5e300 31 #include "ICM20648.h"
stevew817 0:fe1dd6f4950c 32
stevew817 2:f80572d04d7a 33 /* Turn on power supply to ENV sensor suite */
stevew817 0:fe1dd6f4950c 34 DigitalOut env_en(PF9, 1);
stevew817 2:f80572d04d7a 35 /* Turn on power to CCS811 sensor */
stevew817 0:fe1dd6f4950c 36 DigitalOut ccs_en(PF14, 1);
stevew817 2:f80572d04d7a 37 /* Set CCS_WAKE pin to output */
stevew817 0:fe1dd6f4950c 38 DigitalOut ccs_wake(PF15, 1);
stevew817 2:f80572d04d7a 39 /* Turn on power to hall effect sensor */
stevew817 0:fe1dd6f4950c 40 DigitalOut hall_en(PB10, 1);
stevew817 3:2e1381d5e300 41 /* Turn on power to IMU */
stevew817 3:2e1381d5e300 42 DigitalOut imu_en(PF8, 1);
stevew817 0:fe1dd6f4950c 43
stevew817 0:fe1dd6f4950c 44 I2C ccs_i2c(PB6, PB7);
stevew817 0:fe1dd6f4950c 45 I2C hall_i2c(PB8, PB9);
stevew817 0:fe1dd6f4950c 46 I2C env_i2c(PC4, PC5);
stevew817 0:fe1dd6f4950c 47
stevew817 0:fe1dd6f4950c 48 int main() {
stevew817 0:fe1dd6f4950c 49 uint32_t eco2, tvoc;
stevew817 0:fe1dd6f4950c 50 float pressure, temperature2;
stevew817 0:fe1dd6f4950c 51 int32_t temperature;
stevew817 0:fe1dd6f4950c 52 uint32_t humidity;
stevew817 2:f80572d04d7a 53 float light, uv;
stevew817 3:2e1381d5e300 54 float acc_x, acc_y, acc_z, gyr_x, gyr_y, gyr_z, temperature3;
stevew817 2:f80572d04d7a 55
stevew817 2:f80572d04d7a 56 bool lightsensor_en = true;
stevew817 2:f80572d04d7a 57 bool gassensor_en = true;
stevew817 2:f80572d04d7a 58 bool hallsensor_en = true;
stevew817 2:f80572d04d7a 59 bool rhtsensor_en = true;
stevew817 2:f80572d04d7a 60 bool pressuresensor_en = true;
stevew817 3:2e1381d5e300 61 bool imu_en = true;
stevew817 0:fe1dd6f4950c 62
stevew817 0:fe1dd6f4950c 63 ccs_en = 0;
stevew817 0:fe1dd6f4950c 64 wait_ms(1000);
stevew817 0:fe1dd6f4950c 65 ccs_en = 1;
stevew817 0:fe1dd6f4950c 66 wait_ms(1000);
stevew817 0:fe1dd6f4950c 67
stevew817 0:fe1dd6f4950c 68 /* Initialize air quality sensor */
stevew817 0:fe1dd6f4950c 69 AMS_CCS811* gasSensor = new AMS_CCS811(&ccs_i2c, PF15);
stevew817 0:fe1dd6f4950c 70 if(!gasSensor->init()) {
stevew817 2:f80572d04d7a 71 printf("Failed CCS811 init\r\n");
stevew817 2:f80572d04d7a 72 gassensor_en = false;
stevew817 2:f80572d04d7a 73 } else {
stevew817 2:f80572d04d7a 74 if(!gasSensor->mode(AMS_CCS811::TEN_SECOND)) {
stevew817 2:f80572d04d7a 75 printf("Failed to set CCS811 mode\r\n");
stevew817 2:f80572d04d7a 76 gassensor_en = false;
stevew817 2:f80572d04d7a 77 }
stevew817 0:fe1dd6f4950c 78 }
stevew817 2:f80572d04d7a 79
stevew817 0:fe1dd6f4950c 80 wait_ms(10);
stevew817 0:fe1dd6f4950c 81
stevew817 0:fe1dd6f4950c 82 /* Initialize barometer and RHT */
stevew817 0:fe1dd6f4950c 83 BMP280* pressureSensor = new BMP280(env_i2c);
Steven Cooreman 1:7174444a05e2 84 Si7021* rhtSensor = new Si7021(PC4, PC5);
stevew817 0:fe1dd6f4950c 85
stevew817 2:f80572d04d7a 86 printf("\r\n\r\nHello Thunderboard Sense 2...\r\n");
stevew817 0:fe1dd6f4950c 87
stevew817 0:fe1dd6f4950c 88 /* Check if hall sensor is alive */
stevew817 0:fe1dd6f4950c 89 silabs::Si7210* hallSensor = new silabs::Si7210(&hall_i2c);
stevew817 0:fe1dd6f4950c 90 uint8_t id;
stevew817 0:fe1dd6f4950c 91 hallSensor->wakeup();
stevew817 0:fe1dd6f4950c 92 hallSensor->readRegister(SI72XX_HREVID, &id);
stevew817 0:fe1dd6f4950c 93 printf("Hall ID: %d\r\n", id);
stevew817 2:f80572d04d7a 94
stevew817 2:f80572d04d7a 95 /* Initialize light sensor */
stevew817 2:f80572d04d7a 96 Si1133* lightSensor = new Si1133(PC4, PC5);
stevew817 2:f80572d04d7a 97
stevew817 2:f80572d04d7a 98 if(!lightSensor->open()) {
stevew817 2:f80572d04d7a 99 printf("Something is wrong with Si1133, disabling...\n");
stevew817 2:f80572d04d7a 100 lightsensor_en = false;
stevew817 2:f80572d04d7a 101 }
stevew817 3:2e1381d5e300 102
stevew817 3:2e1381d5e300 103 /* Initialize the IMU*/
stevew817 3:2e1381d5e300 104 ICM20648* imu = new ICM20648(PC0, PC1, PC2, PC3, PF12);
stevew817 3:2e1381d5e300 105
stevew817 3:2e1381d5e300 106 if(!imu->open()) {
stevew817 3:2e1381d5e300 107 printf("Something is wrong with ICM20648, disabling...\n");
stevew817 3:2e1381d5e300 108 imu_en = false;
stevew817 3:2e1381d5e300 109 }
stevew817 0:fe1dd6f4950c 110
stevew817 0:fe1dd6f4950c 111 do {
stevew817 2:f80572d04d7a 112 printf("----------------------------------------------\r\n");
stevew817 2:f80572d04d7a 113 /* Measure temperature and humidity */
stevew817 2:f80572d04d7a 114 if(rhtsensor_en) {
stevew817 2:f80572d04d7a 115 rhtSensor->measure();
stevew817 2:f80572d04d7a 116 rhtSensor->measure();
stevew817 2:f80572d04d7a 117 temperature = rhtSensor->get_temperature();
stevew817 2:f80572d04d7a 118 humidity = rhtSensor->get_humidity();
stevew817 2:f80572d04d7a 119
stevew817 2:f80572d04d7a 120 printf("Si7021:\r\n");
stevew817 2:f80572d04d7a 121 printf("T: %ld.%03ld degC\r\n", temperature/1000, abs(temperature%1000));
stevew817 2:f80572d04d7a 122 printf("h: %ld.%03ld %%\r\n", humidity/1000, humidity%1000);
stevew817 2:f80572d04d7a 123 }
stevew817 2:f80572d04d7a 124
stevew817 0:fe1dd6f4950c 125 /* Measure barometric pressure */
stevew817 2:f80572d04d7a 126 if(pressuresensor_en) {
stevew817 2:f80572d04d7a 127 temperature2 = pressureSensor->getTemperature();
stevew817 2:f80572d04d7a 128 pressure = pressureSensor->getPressure();
stevew817 2:f80572d04d7a 129
stevew817 2:f80572d04d7a 130 printf("BMP280:\r\n");
stevew817 2:f80572d04d7a 131 printf("P: %.2f bar\r\n", pressure);
stevew817 2:f80572d04d7a 132 printf("T: %.2f degC\r\n", temperature2);
stevew817 2:f80572d04d7a 133 }
stevew817 0:fe1dd6f4950c 134
stevew817 0:fe1dd6f4950c 135 /* Measure air quality */
stevew817 2:f80572d04d7a 136 if(gassensor_en) {
stevew817 2:f80572d04d7a 137 gasSensor->has_new_data();
stevew817 2:f80572d04d7a 138 eco2 = gasSensor->co2_read();
stevew817 2:f80572d04d7a 139 tvoc = gasSensor->tvoc_read();
stevew817 2:f80572d04d7a 140
stevew817 2:f80572d04d7a 141 printf("CCS811:\r\n");
stevew817 2:f80572d04d7a 142 printf("CO2: %ld ppm\r\n", eco2);
stevew817 2:f80572d04d7a 143 printf("VoC: %ld ppb\r\n", tvoc);
stevew817 2:f80572d04d7a 144 }
stevew817 0:fe1dd6f4950c 145
stevew817 0:fe1dd6f4950c 146 /* measure HALL */
stevew817 2:f80572d04d7a 147 if(hallsensor_en) {
stevew817 2:f80572d04d7a 148 hallSensor->measureOnce();
stevew817 0:fe1dd6f4950c 149
stevew817 2:f80572d04d7a 150 printf("Si7210:\r\n");
stevew817 2:f80572d04d7a 151 printf("T: %d.%02d degC\r\n", hallSensor->getTemperature()/1000, abs(hallSensor->getTemperature()%1000));
stevew817 2:f80572d04d7a 152 printf("F: %i.%03d mT\r\n", (int)(hallSensor->getFieldStrength()/1000), abs(hallSensor->getFieldStrength() % 1000));
stevew817 2:f80572d04d7a 153 }
stevew817 0:fe1dd6f4950c 154
stevew817 2:f80572d04d7a 155 /* measure light */
stevew817 2:f80572d04d7a 156 if(lightsensor_en) {
stevew817 2:f80572d04d7a 157 lightSensor->get_light_and_uv(&light, &uv);
stevew817 2:f80572d04d7a 158
stevew817 2:f80572d04d7a 159 printf("BMP280:\r\n");
stevew817 2:f80572d04d7a 160 printf("L: %.2f lux\r\n", light);
stevew817 2:f80572d04d7a 161 printf("U: %.2f\r\n", uv);
stevew817 2:f80572d04d7a 162 }
stevew817 2:f80572d04d7a 163
stevew817 3:2e1381d5e300 164 /* measure imu */
stevew817 3:2e1381d5e300 165 if(imu_en) {
stevew817 3:2e1381d5e300 166 imu->get_temperature(&temperature3);
stevew817 3:2e1381d5e300 167 imu->get_accelerometer(&acc_x, &acc_y, &acc_z);
stevew817 3:2e1381d5e300 168 imu->get_gyroscope(&gyr_x, &gyr_y, &gyr_z);
stevew817 3:2e1381d5e300 169
stevew817 3:2e1381d5e300 170 printf("ICM20648:\r\n");
stevew817 3:2e1381d5e300 171 printf("T: %.2f degC\r\n", temperature3);
stevew817 3:2e1381d5e300 172 printf("Acc: %.2f %.2f %.2f\r\n", acc_x, acc_y, acc_z);
stevew817 3:2e1381d5e300 173 printf("Gyro: %.2f %.2f %.2f\r\n", gyr_x, gyr_y, gyr_z);
stevew817 3:2e1381d5e300 174 }
stevew817 3:2e1381d5e300 175
stevew817 2:f80572d04d7a 176 wait_ms(15000);
stevew817 0:fe1dd6f4950c 177 } while(1);
stevew817 0:fe1dd6f4950c 178 }