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 16:43:58 2017 +0100
Revision:
2:f80572d04d7a
Parent:
1:7174444a05e2
Child:
3:2e1381d5e300
Updated mbed-os to latest release, added Si1133 sensor, cleaned a bit in code

Who changed what in which revision?

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