Sample code for AT&T IoT Services DevLab with IoT StarterKit.

Dependencies:   FXOS8700CQ M2XStreamClient-JMF WNCInterface jsonlite mbed-rtos mbed

Fork of WNCInterface_M2Xdemo by Avnet

Committer:
jk431j
Date:
Wed Apr 05 04:53:25 2017 +0000
Revision:
4:08979e323c6e
Child:
5:8099493f2c35
Added sensor reading and M2X command handling,

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jk431j 4:08979e323c6e 1 /* ===================================================================
jk431j 4:08979e323c6e 2 Copyright © 2016, AVNET Inc.
jk431j 4:08979e323c6e 3
jk431j 4:08979e323c6e 4 Licensed under the Apache License, Version 2.0 (the "License");
jk431j 4:08979e323c6e 5 you may not use this file except in compliance with the License.
jk431j 4:08979e323c6e 6 You may obtain a copy of the License at
jk431j 4:08979e323c6e 7
jk431j 4:08979e323c6e 8 http://www.apache.org/licenses/LICENSE-2.0
jk431j 4:08979e323c6e 9
jk431j 4:08979e323c6e 10 Unless required by applicable law or agreed to in writing,
jk431j 4:08979e323c6e 11 software distributed under the License is distributed on an
jk431j 4:08979e323c6e 12 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
jk431j 4:08979e323c6e 13 either express or implied. See the License for the specific
jk431j 4:08979e323c6e 14 language governing permissions and limitations under the License.
jk431j 4:08979e323c6e 15
jk431j 4:08979e323c6e 16 ======================================================================== */
jk431j 4:08979e323c6e 17
jk431j 4:08979e323c6e 18 #include "mbed.h"
jk431j 4:08979e323c6e 19 #include "sensors.h"
jk431j 4:08979e323c6e 20 #include "FXOS8700CQ.h"
jk431j 4:08979e323c6e 21 #include "HTS221.h"
jk431j 4:08979e323c6e 22 #include <string>
jk431j 4:08979e323c6e 23
jk431j 4:08979e323c6e 24 //I2C for pmod sensors:
jk431j 4:08979e323c6e 25 #define Si1145_PMOD_I2C_ADDR 0xC0 //this is for 7-bit addr 0x60 for the Si7020
jk431j 4:08979e323c6e 26 #define Si7020_PMOD_I2C_ADDR 0x80 //this is for 7-bit addr 0x4 for the Si7020
jk431j 4:08979e323c6e 27
jk431j 4:08979e323c6e 28 // Storage for the data from the motion sensor
jk431j 4:08979e323c6e 29 SRAWDATA accel_data;
jk431j 4:08979e323c6e 30 SRAWDATA magn_data;
jk431j 4:08979e323c6e 31 //InterruptIn fxos_int1(PTC6); // unused, common with SW2 on FRDM-K64F
jk431j 4:08979e323c6e 32 InterruptIn fxos_int2(PTC13); // should just be the Data-Ready interrupt
jk431j 4:08979e323c6e 33 bool fxos_int2_triggered = false;
jk431j 4:08979e323c6e 34 void trigger_fxos_int2(void)
jk431j 4:08979e323c6e 35 {
jk431j 4:08979e323c6e 36 fxos_int2_triggered = true;
jk431j 4:08979e323c6e 37
jk431j 4:08979e323c6e 38 }
jk431j 4:08979e323c6e 39
jk431j 4:08979e323c6e 40 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 41 * Perform I2C single read.
jk431j 4:08979e323c6e 42 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 43 unsigned char I2C_ReadSingleByte(unsigned char ucDeviceAddress)
jk431j 4:08979e323c6e 44 {
jk431j 4:08979e323c6e 45 char rxbuffer [1];
jk431j 4:08979e323c6e 46 i2c.read(ucDeviceAddress, rxbuffer, 1 );
jk431j 4:08979e323c6e 47 return (unsigned char)rxbuffer[0];
jk431j 4:08979e323c6e 48 } //I2C_ReadSingleByte()
jk431j 4:08979e323c6e 49
jk431j 4:08979e323c6e 50 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 51 * Perform I2C single read from address.
jk431j 4:08979e323c6e 52 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 53 unsigned char I2C_ReadSingleByteFromAddr(unsigned char ucDeviceAddress, unsigned char Addr)
jk431j 4:08979e323c6e 54 {
jk431j 4:08979e323c6e 55 char txbuffer [1];
jk431j 4:08979e323c6e 56 char rxbuffer [1];
jk431j 4:08979e323c6e 57 txbuffer[0] = (char)Addr;
jk431j 4:08979e323c6e 58 i2c.write(ucDeviceAddress, txbuffer, 1 );
jk431j 4:08979e323c6e 59 i2c.read(ucDeviceAddress, rxbuffer, 1 );
jk431j 4:08979e323c6e 60 return (unsigned char)rxbuffer[0];
jk431j 4:08979e323c6e 61 } //I2C_ReadSingleByteFromAddr()
jk431j 4:08979e323c6e 62
jk431j 4:08979e323c6e 63 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 64 * Perform I2C read of more than 1 byte.
jk431j 4:08979e323c6e 65 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 66 int I2C_ReadMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength)
jk431j 4:08979e323c6e 67 {
jk431j 4:08979e323c6e 68 int status;
jk431j 4:08979e323c6e 69 status = i2c.read(ucDeviceAddress, ucData, ucLength);
jk431j 4:08979e323c6e 70 return status;
jk431j 4:08979e323c6e 71 } //I2C_ReadMultipleBytes()
jk431j 4:08979e323c6e 72
jk431j 4:08979e323c6e 73 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 74 * Perform I2C write of a single byte.
jk431j 4:08979e323c6e 75 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 76 int I2C_WriteSingleByte(unsigned char ucDeviceAddress, unsigned char Data, bool bSendStop)
jk431j 4:08979e323c6e 77 {
jk431j 4:08979e323c6e 78 int status;
jk431j 4:08979e323c6e 79 char txbuffer [1];
jk431j 4:08979e323c6e 80 txbuffer[0] = (char)Data; //data
jk431j 4:08979e323c6e 81 status = i2c.write(ucDeviceAddress, txbuffer, 1, !bSendStop); //true: do not send stop
jk431j 4:08979e323c6e 82 return status;
jk431j 4:08979e323c6e 83 } //I2C_WriteSingleByte()
jk431j 4:08979e323c6e 84
jk431j 4:08979e323c6e 85 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 86 * Perform I2C write of 1 byte to an address.
jk431j 4:08979e323c6e 87 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 88 int I2C_WriteSingleByteToAddr(unsigned char ucDeviceAddress, unsigned char Addr, unsigned char Data, bool bSendStop)
jk431j 4:08979e323c6e 89 {
jk431j 4:08979e323c6e 90 int status;
jk431j 4:08979e323c6e 91 char txbuffer [2];
jk431j 4:08979e323c6e 92 txbuffer[0] = (char)Addr; //address
jk431j 4:08979e323c6e 93 txbuffer[1] = (char)Data; //data
jk431j 4:08979e323c6e 94 //status = i2c.write(ucDeviceAddress, txbuffer, 2, false); //stop at end
jk431j 4:08979e323c6e 95 status = i2c.write(ucDeviceAddress, txbuffer, 2, !bSendStop); //true: do not send stop
jk431j 4:08979e323c6e 96 return status;
jk431j 4:08979e323c6e 97 } //I2C_WriteSingleByteToAddr()
jk431j 4:08979e323c6e 98
jk431j 4:08979e323c6e 99 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 100 * Perform I2C write of more than 1 byte.
jk431j 4:08979e323c6e 101 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 102 int I2C_WriteMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength, bool bSendStop)
jk431j 4:08979e323c6e 103 {
jk431j 4:08979e323c6e 104 int status;
jk431j 4:08979e323c6e 105 status = i2c.write(ucDeviceAddress, ucData, ucLength, !bSendStop); //true: do not send stop
jk431j 4:08979e323c6e 106 return status;
jk431j 4:08979e323c6e 107 } //I2C_WriteMultipleBytes()
jk431j 4:08979e323c6e 108
jk431j 4:08979e323c6e 109 bool bSi7020_present = false;
jk431j 4:08979e323c6e 110 void Init_Si7020(void)
jk431j 4:08979e323c6e 111 {
jk431j 4:08979e323c6e 112 char SN_7020 [8];
jk431j 4:08979e323c6e 113 //SN part 1:
jk431j 4:08979e323c6e 114 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFA, 0x0F, false);
jk431j 4:08979e323c6e 115 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[0], 4);
jk431j 4:08979e323c6e 116
jk431j 4:08979e323c6e 117 //SN part 1:
jk431j 4:08979e323c6e 118 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFC, 0xC9, false);
jk431j 4:08979e323c6e 119 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[4], 4);
jk431j 4:08979e323c6e 120
jk431j 4:08979e323c6e 121 char Ver_7020 [2];
jk431j 4:08979e323c6e 122 //FW version:
jk431j 4:08979e323c6e 123 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0x84, 0xB8, false);
jk431j 4:08979e323c6e 124 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Ver_7020[0], 2);
jk431j 4:08979e323c6e 125
jk431j 4:08979e323c6e 126 if (SN_7020[4] != 0x14)
jk431j 4:08979e323c6e 127 {
jk431j 4:08979e323c6e 128 bSi7020_present = false;
jk431j 4:08979e323c6e 129 PRINTF("Si7020 sensor not found\r\n");
jk431j 4:08979e323c6e 130 }
jk431j 4:08979e323c6e 131 else
jk431j 4:08979e323c6e 132 {
jk431j 4:08979e323c6e 133 bSi7020_present = true;
jk431j 4:08979e323c6e 134 PRINTF("Si7020 SN = 0x%02X%02X%02X%02X%02X%02X%02X%02X\n", SN_7020[0], SN_7020[1], SN_7020[2], SN_7020[3], SN_7020[4], SN_7020[5], SN_7020[6], SN_7020[7]);
jk431j 4:08979e323c6e 135 PRINTF("Si7020 Version# = 0x%02X\n", Ver_7020[0]);
jk431j 4:08979e323c6e 136 } //bool bSi7020_present = true
jk431j 4:08979e323c6e 137
jk431j 4:08979e323c6e 138 } //Init_Si7020()
jk431j 4:08979e323c6e 139
jk431j 4:08979e323c6e 140 void Read_Si7020(void)
jk431j 4:08979e323c6e 141 {
jk431j 4:08979e323c6e 142 if (bSi7020_present)
jk431j 4:08979e323c6e 143 {
jk431j 4:08979e323c6e 144 char Humidity [2];
jk431j 4:08979e323c6e 145 char Temperature [2];
jk431j 4:08979e323c6e 146 //Command to measure humidity (temperature also gets measured):
jk431j 4:08979e323c6e 147 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xF5, false); //no hold, must do dummy read
jk431j 4:08979e323c6e 148 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 1); //dummy read, should get an nack until it is done
jk431j 4:08979e323c6e 149 wait (0.05); //wait for measurement. Can also keep reading until no NACK is received
jk431j 4:08979e323c6e 150 //I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xE5, false); //Hold mod, the device does a clock stretch on the read until it is done (crashes the I2C bus...
jk431j 4:08979e323c6e 151 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 2); //read humidity
jk431j 4:08979e323c6e 152 //PRINTF("Read Si7020 Humidity = 0x%02X%02X\n", Humidity[0], Humidity[1]);
jk431j 4:08979e323c6e 153 int rh_code = (Humidity[0] << 8) + Humidity[1];
jk431j 4:08979e323c6e 154 float fRh = (125.0*rh_code/65536.0) - 6.0; //from datasheet
jk431j 4:08979e323c6e 155 //PRINTF("Si7020 Humidity = %*.*f %%\n", 4, 2, fRh); //double % sign for escape //PRINTF("%*.*f\n", myFieldWidth, myPrecision, myFloatValue);
jk431j 4:08979e323c6e 156 SENSOR_DATA.fHumidity = fRh;
jk431j 4:08979e323c6e 157 sprintf(SENSOR_DATA.Humidity_Si7020, "%0.2f", fRh);
jk431j 4:08979e323c6e 158
jk431j 4:08979e323c6e 159 //Command to read temperature when humidity is already done:
jk431j 4:08979e323c6e 160 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xE0, false);
jk431j 4:08979e323c6e 161 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Temperature[0], 2); //read temperature
jk431j 4:08979e323c6e 162 //PRINTF("Read Si7020 Temperature = 0x%02X%02X\n", Temperature[0], Temperature[1]);
jk431j 4:08979e323c6e 163 int temp_code = (Temperature[0] << 8) + Temperature[1];
jk431j 4:08979e323c6e 164 float fTemp = (175.72*temp_code/65536.0) - 46.85; //from datasheet in Celcius
jk431j 4:08979e323c6e 165 SENSOR_DATA.fTemperature = fTemp;
jk431j 4:08979e323c6e 166 //PRINTF("Si7020 Temperature = %*.*f deg C\n", 4, 2, fTemp);
jk431j 4:08979e323c6e 167 sprintf(SENSOR_DATA.Temperature_Si7020, "%0.2f", fTemp);
jk431j 4:08979e323c6e 168 } //bool bSi7020_present = true
jk431j 4:08979e323c6e 169
jk431j 4:08979e323c6e 170 } //Read_Si7020()
jk431j 4:08979e323c6e 171
jk431j 4:08979e323c6e 172 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 173 * The following are aliases so that the Si1145 coding examples can be used as-is.
jk431j 4:08979e323c6e 174 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 175 unsigned char ReadFrom_Si1145_Register(unsigned char reg) //returns byte from I2C Register 'reg'
jk431j 4:08979e323c6e 176 {
jk431j 4:08979e323c6e 177 unsigned char result = I2C_ReadSingleByteFromAddr(Si1145_PMOD_I2C_ADDR, reg);
jk431j 4:08979e323c6e 178 return (result);
jk431j 4:08979e323c6e 179 } //ReadFrom_Si1145_Register()
jk431j 4:08979e323c6e 180
jk431j 4:08979e323c6e 181 void WriteTo_Si1145_Register(unsigned char reg, unsigned char value) //writes 'value' into I2C Register reg'
jk431j 4:08979e323c6e 182 {
jk431j 4:08979e323c6e 183 I2C_WriteSingleByteToAddr(Si1145_PMOD_I2C_ADDR, reg, value, true);
jk431j 4:08979e323c6e 184 } //WriteTo_Si1145_Register()
jk431j 4:08979e323c6e 185
jk431j 4:08979e323c6e 186 #define REG_PARAM_WR 0x17
jk431j 4:08979e323c6e 187 #define REG_PARAM_RD 0x2E
jk431j 4:08979e323c6e 188 #define REG_COMMAND 0x18
jk431j 4:08979e323c6e 189 #define REG_RESPONSE 0x20
jk431j 4:08979e323c6e 190 #define REG_HW_KEY 0x07
jk431j 4:08979e323c6e 191 #define HW_KEY_VAL0 0x17
jk431j 4:08979e323c6e 192 #define REG_MEAS_RATE_LSB 0x08
jk431j 4:08979e323c6e 193 #define REG_MEAS_RATE_MSB 0x09
jk431j 4:08979e323c6e 194 #define REG_PS_LED21 0x0F
jk431j 4:08979e323c6e 195 #define REG_PS_LED3 0x10
jk431j 4:08979e323c6e 196 #define MAX_LED_CURRENT 0xF
jk431j 4:08979e323c6e 197 #define PARAM_CH_LIST 0x01
jk431j 4:08979e323c6e 198 #define REG_ALS_VIS_DATA0 0x22
jk431j 4:08979e323c6e 199 #define REG_ALS_VIS_DATA1 0x23
jk431j 4:08979e323c6e 200 #define REG_ALS_IR_DATA0 0x24
jk431j 4:08979e323c6e 201 #define REG_ALS_IR_DATA1 0x25
jk431j 4:08979e323c6e 202 #define REG_PS1_DATA0 0x26
jk431j 4:08979e323c6e 203 #define REG_PS1_DATA1 0x27
jk431j 4:08979e323c6e 204 #define REG_PS2_DATA0 0x28
jk431j 4:08979e323c6e 205 #define REG_PS2_DATA1 0x29
jk431j 4:08979e323c6e 206 #define REG_PS3_DATA0 0x2A
jk431j 4:08979e323c6e 207 #define REG_PS3_DATA1 0x2B
jk431j 4:08979e323c6e 208 #define REG_UVINDEX0 0x2C
jk431j 4:08979e323c6e 209 #define REG_UVINDEX1 0x2D
jk431j 4:08979e323c6e 210 int Si1145_ParamSet(unsigned char address, unsigned char value) //writes 'value' into Parameter 'address'
jk431j 4:08979e323c6e 211 {
jk431j 4:08979e323c6e 212 char txbuffer [3];
jk431j 4:08979e323c6e 213 txbuffer[0] = (char)REG_PARAM_WR; //destination
jk431j 4:08979e323c6e 214 txbuffer[1] = (char)value;
jk431j 4:08979e323c6e 215 txbuffer[2] = (char)(0xA0 + (address & 0x1F));
jk431j 4:08979e323c6e 216 int retval;
jk431j 4:08979e323c6e 217 //if((retval = _waitUntilSleep(si114x_handle))!=0) return retval;
jk431j 4:08979e323c6e 218 retval = I2C_WriteMultipleBytes(Si1145_PMOD_I2C_ADDR, &txbuffer[0], 3, true);
jk431j 4:08979e323c6e 219 if(retval!=0) return retval;
jk431j 4:08979e323c6e 220 while(1)
jk431j 4:08979e323c6e 221 {
jk431j 4:08979e323c6e 222 retval=ReadFrom_Si1145_Register(REG_PARAM_RD);
jk431j 4:08979e323c6e 223 if (retval==value) break;
jk431j 4:08979e323c6e 224 }
jk431j 4:08979e323c6e 225 return (0);
jk431j 4:08979e323c6e 226 } //Si1145_ParamSet()
jk431j 4:08979e323c6e 227
jk431j 4:08979e323c6e 228 void PsAlsForce(void) //equivalent to WriteTo_Si1145_Register(REG_COMMAND,0x07). This forces PS and ALS measurements
jk431j 4:08979e323c6e 229 {
jk431j 4:08979e323c6e 230 WriteTo_Si1145_Register(REG_COMMAND,0x07);
jk431j 4:08979e323c6e 231 } //PsAlsForce()
jk431j 4:08979e323c6e 232
jk431j 4:08979e323c6e 233 bool bSi1145_present = false;
jk431j 4:08979e323c6e 234 void Init_Si1145(void)
jk431j 4:08979e323c6e 235 {
jk431j 4:08979e323c6e 236 unsigned char readbyte;
jk431j 4:08979e323c6e 237 //Read Si1145 part ID:
jk431j 4:08979e323c6e 238 readbyte = ReadFrom_Si1145_Register(0x00);
jk431j 4:08979e323c6e 239 if (readbyte != 0x45)
jk431j 4:08979e323c6e 240 {
jk431j 4:08979e323c6e 241 bSi1145_present = false;
jk431j 4:08979e323c6e 242 PRINTF("Si1145 sensor not found\r\n");
jk431j 4:08979e323c6e 243 }
jk431j 4:08979e323c6e 244 else
jk431j 4:08979e323c6e 245 {
jk431j 4:08979e323c6e 246 bSi1145_present = true;
jk431j 4:08979e323c6e 247 PRINTF("Si1145 Part ID : 0x%02X\n", readbyte);
jk431j 4:08979e323c6e 248 //Initialize Si1145 by writing to HW_KEY (I2C Register 0x07 = 0x17)
jk431j 4:08979e323c6e 249 WriteTo_Si1145_Register(REG_HW_KEY, HW_KEY_VAL0);
jk431j 4:08979e323c6e 250
jk431j 4:08979e323c6e 251 // Initialize LED Current
jk431j 4:08979e323c6e 252 // I2C Register 0x0F = 0xFF
jk431j 4:08979e323c6e 253 // I2C Register 0x10 = 0x0F
jk431j 4:08979e323c6e 254 WriteTo_Si1145_Register(REG_PS_LED21,(MAX_LED_CURRENT<<4) + MAX_LED_CURRENT);
jk431j 4:08979e323c6e 255 WriteTo_Si1145_Register(REG_PS_LED3, MAX_LED_CURRENT);
jk431j 4:08979e323c6e 256
jk431j 4:08979e323c6e 257 // Parameter 0x01 = 0x37
jk431j 4:08979e323c6e 258 //Si1145_ParamSet(PARAM_CH_LIST, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK);
jk431j 4:08979e323c6e 259 //Si1145_ParamSet(0x01, 0x37); //CHLIST is address 0x01 in the parameter RAM. It defines which sensors are enabled (here, some)
jk431j 4:08979e323c6e 260 Si1145_ParamSet(0x01, 0x7F); //CHLIST is address 0x01 in the parameter RAM. It defines which sensors are enabled (here, all but UV. One can only use AUX or UV but here we use AUX because UV does not work...)
jk431j 4:08979e323c6e 261 // I2C Register 0x18 = 0x0x07 //This is PSALS_FORCE to the Command register => Force a single PS (proximity sensor) and ALS (ambient light sensor) reading - The factory code has this as 0x05 which only does PS...
jk431j 4:08979e323c6e 262 PsAlsForce(); // can also be written as WriteTo_Si1145_Register(REG_COMMAND,0x07);
jk431j 4:08979e323c6e 263 WriteTo_Si1145_Register(REG_COMMAND, 0x0F);//command to put it into auto mode
jk431j 4:08979e323c6e 264 //Set MES_RATE to 0x1000. I.e. the device will automatically wake up every 16 * 256* 31.25 us = 0.128 seconds to measure
jk431j 4:08979e323c6e 265 WriteTo_Si1145_Register(REG_MEAS_RATE_LSB, 0x00);
jk431j 4:08979e323c6e 266 WriteTo_Si1145_Register(REG_MEAS_RATE_MSB, 0x10);
jk431j 4:08979e323c6e 267 } //bSi1145_present = true
jk431j 4:08979e323c6e 268 } //Init_Si1145()
jk431j 4:08979e323c6e 269
jk431j 4:08979e323c6e 270 void Read_Si1145(void)
jk431j 4:08979e323c6e 271 {
jk431j 4:08979e323c6e 272 if (bSi1145_present)
jk431j 4:08979e323c6e 273 {
jk431j 4:08979e323c6e 274 // Once the measurements are completed, here is how to reconstruct them
jk431j 4:08979e323c6e 275 // Note very carefully that 16-bit registers are in the 'Little Endian' byte order
jk431j 4:08979e323c6e 276 // It may be more efficient to perform block I2C Reads, but this example shows
jk431j 4:08979e323c6e 277 // individual reads of registers
jk431j 4:08979e323c6e 278
jk431j 4:08979e323c6e 279 int PS1 = ReadFrom_Si1145_Register(REG_PS1_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS1_DATA1);
jk431j 4:08979e323c6e 280 int PS2 = ReadFrom_Si1145_Register(REG_PS2_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS2_DATA1);
jk431j 4:08979e323c6e 281 int PS3 = ReadFrom_Si1145_Register(REG_PS3_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS3_DATA1);
jk431j 4:08979e323c6e 282 //PRINTF("PS1_Data = %d\n", PS1);
jk431j 4:08979e323c6e 283 //PRINTF("PS2_Data = %d\n", PS2);
jk431j 4:08979e323c6e 284 //PRINTF("PS3_Data = %d\n", PS3);
jk431j 4:08979e323c6e 285 //OBJECT PRESENT?
jk431j 4:08979e323c6e 286 #if (0)
jk431j 4:08979e323c6e 287 if(PS1 < 22000){
jk431j 4:08979e323c6e 288 //PRINTF("Object Far\n");
jk431j 4:08979e323c6e 289 sprintf(SENSOR_DATA.Proximity, "Object Far\0");
jk431j 4:08979e323c6e 290 }
jk431j 4:08979e323c6e 291 else if(PS1 < 24000)
jk431j 4:08979e323c6e 292 {
jk431j 4:08979e323c6e 293 //PRINTF("Object in Vicinity\n");
jk431j 4:08979e323c6e 294 sprintf(SENSOR_DATA.Proximity, "Object in Vicinity\0");
jk431j 4:08979e323c6e 295 }
jk431j 4:08979e323c6e 296 else if (PS1 < 30000)
jk431j 4:08979e323c6e 297 {
jk431j 4:08979e323c6e 298 //PRINTF("Object Near\n");
jk431j 4:08979e323c6e 299 sprintf(SENSOR_DATA.Proximity, "Object Near\0");
jk431j 4:08979e323c6e 300 }
jk431j 4:08979e323c6e 301 else
jk431j 4:08979e323c6e 302 {
jk431j 4:08979e323c6e 303 //PRINTF("Object Very Near\n");
jk431j 4:08979e323c6e 304 sprintf(SENSOR_DATA.Proximity, "Object Very Near\0");
jk431j 4:08979e323c6e 305 }
jk431j 4:08979e323c6e 306 #else
jk431j 4:08979e323c6e 307 sprintf(SENSOR_DATA.Proximity, "%d\0", PS1);
jk431j 4:08979e323c6e 308 #endif
jk431j 4:08979e323c6e 309
jk431j 4:08979e323c6e 310 //Force ALS read:
jk431j 4:08979e323c6e 311 //WriteTo_Si1145_Register(REG_COMMAND, 0x06);
jk431j 4:08979e323c6e 312 //wait (0.1);
jk431j 4:08979e323c6e 313 int ALS_VIS = ReadFrom_Si1145_Register(REG_ALS_VIS_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_VIS_DATA1);
jk431j 4:08979e323c6e 314 int ALS_IR = ReadFrom_Si1145_Register(REG_ALS_IR_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_IR_DATA1);
jk431j 4:08979e323c6e 315 int UV_INDEX = ReadFrom_Si1145_Register(REG_UVINDEX0) + 256 * ReadFrom_Si1145_Register(REG_UVINDEX1);
jk431j 4:08979e323c6e 316 //PRINTF("ALS_VIS_Data = %d\n", ALS_VIS);
jk431j 4:08979e323c6e 317 //PRINTF("ALS_IR_Data = %d\n", ALS_IR);
jk431j 4:08979e323c6e 318 //PRINTF("UV_INDEX_Data = %d\n", UV_INDEX);
jk431j 4:08979e323c6e 319
jk431j 4:08979e323c6e 320 //PRINTF("Ambient Light Visible Sensor = %d\n", ALS_VIS);
jk431j 4:08979e323c6e 321 sprintf(SENSOR_DATA.AmbientLightVis, "%d", ALS_VIS);
jk431j 4:08979e323c6e 322 //PRINTF("Ambient Light Infrared Sensor = %d\n", ALS_IR);
jk431j 4:08979e323c6e 323 sprintf(SENSOR_DATA.AmbientLightIr, "%d", ALS_IR);
jk431j 4:08979e323c6e 324 //float fUV_value = (UV_INDEX -50.0)/10000.0;
jk431j 4:08979e323c6e 325 float fUV_value = (UV_INDEX)/100.0; //this is the aux reading
jk431j 4:08979e323c6e 326 //PRINTF("UV_Data = %0.2f\n", fUV_value);
jk431j 4:08979e323c6e 327 sprintf(SENSOR_DATA.UVindex, "%0.2f", fUV_value);
jk431j 4:08979e323c6e 328 } //bSi1145_present = true
jk431j 4:08979e323c6e 329 } //Read_Si1145()
jk431j 4:08979e323c6e 330
jk431j 4:08979e323c6e 331 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 332 //* Read the FXOS8700CQ - 6-axis combo Sensor Accelerometer and Magnetometer
jk431j 4:08979e323c6e 333 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 334 bool bMotionSensor_present = false;
jk431j 4:08979e323c6e 335 void Init_motion_sensor()
jk431j 4:08979e323c6e 336 {
jk431j 4:08979e323c6e 337 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
jk431j 4:08979e323c6e 338 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
jk431j 4:08979e323c6e 339 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
jk431j 4:08979e323c6e 340 int iWhoAmI = fxos.get_whoami();
jk431j 4:08979e323c6e 341
jk431j 4:08979e323c6e 342 PRINTF("FXOS8700CQ WhoAmI = %X\r\n", iWhoAmI);
jk431j 4:08979e323c6e 343 // Iterrupt for active-low interrupt line from FXOS
jk431j 4:08979e323c6e 344 // Configured with only one interrupt on INT2 signaling Data-Ready
jk431j 4:08979e323c6e 345 //fxos_int2.fall(&trigger_fxos_int2);
jk431j 4:08979e323c6e 346 if (iWhoAmI != 0xC7)
jk431j 4:08979e323c6e 347 {
jk431j 4:08979e323c6e 348 bMotionSensor_present = false;
jk431j 4:08979e323c6e 349 PRINTF("FXOS8700CQ motion sensor not found\r\n");
jk431j 4:08979e323c6e 350 }
jk431j 4:08979e323c6e 351 else
jk431j 4:08979e323c6e 352 {
jk431j 4:08979e323c6e 353 bMotionSensor_present = true;
jk431j 4:08979e323c6e 354 fxos.enable();
jk431j 4:08979e323c6e 355 }
jk431j 4:08979e323c6e 356 } //Init_motion_sensor()
jk431j 4:08979e323c6e 357
jk431j 4:08979e323c6e 358 void Read_motion_sensor()
jk431j 4:08979e323c6e 359 {
jk431j 4:08979e323c6e 360 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
jk431j 4:08979e323c6e 361 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
jk431j 4:08979e323c6e 362 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
jk431j 4:08979e323c6e 363 if (bMotionSensor_present)
jk431j 4:08979e323c6e 364 {
jk431j 4:08979e323c6e 365 fxos.enable();
jk431j 4:08979e323c6e 366 fxos.get_data(&accel_data, &magn_data);
jk431j 4:08979e323c6e 367 //PRINTF("Roll=%5d, Pitch=%5d, Yaw=%5d;\r\n", magn_data.x, magn_data.y, magn_data.z);
jk431j 4:08979e323c6e 368 sprintf(SENSOR_DATA.MagnetometerX, "%5d", magn_data.x);
jk431j 4:08979e323c6e 369 sprintf(SENSOR_DATA.MagnetometerY, "%5d", magn_data.y);
jk431j 4:08979e323c6e 370 sprintf(SENSOR_DATA.MagnetometerZ, "%5d", magn_data.z);
jk431j 4:08979e323c6e 371
jk431j 4:08979e323c6e 372 //Try to normalize (/2048) the values so they will match the eCompass output:
jk431j 4:08979e323c6e 373 float fAccelScaled_x, fAccelScaled_y, fAccelScaled_z;
jk431j 4:08979e323c6e 374 fAccelScaled_x = (accel_data.x/2048.0);
jk431j 4:08979e323c6e 375 fAccelScaled_y = (accel_data.y/2048.0);
jk431j 4:08979e323c6e 376 fAccelScaled_z = (accel_data.z/2048.0);
jk431j 4:08979e323c6e 377 //PRINTF("Acc: X=%2.3f Y=%2.3f Z=%2.3f;\r\n", fAccelScaled_x, fAccelScaled_y, fAccelScaled_z);
jk431j 4:08979e323c6e 378 sprintf(SENSOR_DATA.AccelX, "%2.3f", fAccelScaled_x);
jk431j 4:08979e323c6e 379 sprintf(SENSOR_DATA.AccelY, "%2.3f", fAccelScaled_y);
jk431j 4:08979e323c6e 380 sprintf(SENSOR_DATA.AccelZ, "%2.3f", fAccelScaled_z);
jk431j 4:08979e323c6e 381 } //bMotionSensor_present
jk431j 4:08979e323c6e 382 } //Read_motion_sensor()
jk431j 4:08979e323c6e 383
jk431j 4:08979e323c6e 384
jk431j 4:08979e323c6e 385 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 386 //* Read the HTS221 temperature & humidity sensor on the Cellular Shield
jk431j 4:08979e323c6e 387 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 388 // These are to be built on the fly
jk431j 4:08979e323c6e 389 string my_temp;
jk431j 4:08979e323c6e 390 string my_humidity;
jk431j 4:08979e323c6e 391 HTS221 hts221;
jk431j 4:08979e323c6e 392
jk431j 4:08979e323c6e 393 #define CTOF(x) ((x)*1.8+32)
jk431j 4:08979e323c6e 394 bool bHTS221_present = false;
jk431j 4:08979e323c6e 395 void Init_HTS221()
jk431j 4:08979e323c6e 396 {
jk431j 4:08979e323c6e 397 int i;
jk431j 4:08979e323c6e 398 void hts221_init(void);
jk431j 4:08979e323c6e 399 i = hts221.begin();
jk431j 4:08979e323c6e 400 if (i)
jk431j 4:08979e323c6e 401 {
jk431j 4:08979e323c6e 402 bHTS221_present = true;
jk431j 4:08979e323c6e 403 PRINTF(BLU "HTS221 Detected (0x%02X)\n\r",i);
jk431j 4:08979e323c6e 404 PRINTF(" Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
jk431j 4:08979e323c6e 405 PRINTF(" Humid is: %02d %%\n\r",hts221.readHumidity());
jk431j 4:08979e323c6e 406 }
jk431j 4:08979e323c6e 407 else
jk431j 4:08979e323c6e 408 {
jk431j 4:08979e323c6e 409 bHTS221_present = false;
jk431j 4:08979e323c6e 410 PRINTF(RED "HTS221 NOT DETECTED!\n\r");
jk431j 4:08979e323c6e 411 }
jk431j 4:08979e323c6e 412 } //Init_HTS221()
jk431j 4:08979e323c6e 413
jk431j 4:08979e323c6e 414 void Read_HTS221()
jk431j 4:08979e323c6e 415 {
jk431j 4:08979e323c6e 416 if (bHTS221_present)
jk431j 4:08979e323c6e 417 {
jk431j 4:08979e323c6e 418 double fTemp = hts221.readTemperature();
jk431j 4:08979e323c6e 419 double fRh = hts221.readHumidity();
jk431j 4:08979e323c6e 420 sprintf(SENSOR_DATA.Temperature, "%0.2f", fTemp);
jk431j 4:08979e323c6e 421 sprintf(SENSOR_DATA.Humidity, "%02d", fRh);
jk431j 4:08979e323c6e 422 SENSOR_DATA.fTemperature = fTemp;
jk431j 4:08979e323c6e 423 SENSOR_DATA.fHumidity = fRh;
jk431j 4:08979e323c6e 424
jk431j 4:08979e323c6e 425 } //bHTS221_present
jk431j 4:08979e323c6e 426 } //Read_HTS221()
jk431j 4:08979e323c6e 427
jk431j 4:08979e323c6e 428
jk431j 4:08979e323c6e 429 #ifdef USE_VIRTUAL_SENSORS
jk431j 4:08979e323c6e 430 bool bUsbConnected = false;
jk431j 4:08979e323c6e 431 volatile uint8_t usb_uart_rx_buff[256];
jk431j 4:08979e323c6e 432 //volatile uint8_t usb_uart_tx_buff[256];
jk431j 4:08979e323c6e 433 volatile unsigned char usb_uart_rx_buff_putptr = 0;
jk431j 4:08979e323c6e 434 volatile unsigned char usb_uart_rx_buff_getptr = 0;
jk431j 4:08979e323c6e 435 //volatile unsigned char usb_uart_tx_buff_putptr = 0;
jk431j 4:08979e323c6e 436 //volatile unsigned char usb_uart_tx_buff_getptr = 0;
jk431j 4:08979e323c6e 437 char usbhost_rx_string[256];
jk431j 4:08979e323c6e 438 unsigned char usbhost_rxstring_index;
jk431j 4:08979e323c6e 439 char usbhost_tx_string[256];
jk431j 4:08979e323c6e 440
jk431j 4:08979e323c6e 441
jk431j 4:08979e323c6e 442 float f_sensor1_value = 12.3;
jk431j 4:08979e323c6e 443 float f_sensor2_value = 45.6;
jk431j 4:08979e323c6e 444 float f_sensor3_value = 78.9;
jk431j 4:08979e323c6e 445 float f_sensor4_value = 78.9;
jk431j 4:08979e323c6e 446 float f_sensor5_value = 78.9;
jk431j 4:08979e323c6e 447 float f_sensor6_value = 78.9;
jk431j 4:08979e323c6e 448 float f_sensor7_value = 78.9;
jk431j 4:08979e323c6e 449 float f_sensor8_value = 78.9;
jk431j 4:08979e323c6e 450 char usb_sensor_string[110];
jk431j 4:08979e323c6e 451
jk431j 4:08979e323c6e 452
jk431j 4:08979e323c6e 453 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 454 //* Parse the input sensor data from the USB host
jk431j 4:08979e323c6e 455 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 456 int parse_usbhost_message()
jk431j 4:08979e323c6e 457 {
jk431j 4:08979e323c6e 458 //PRINTF("String = %s\n", usbhost_rx_string); //test
jk431j 4:08979e323c6e 459 uint8_t length;
jk431j 4:08979e323c6e 460 uint8_t x ;
jk431j 4:08979e323c6e 461 //It seems that sscanf needs 11 characters to store a 7-character number. There must be some formatting and termination values...
jk431j 4:08979e323c6e 462 char Record[8][11]; //There are 8 sensors with up to 7 characters each
jk431j 4:08979e323c6e 463 char StringRecord[110]; //There are is a sensor "string" with up to 100 characters in it
jk431j 4:08979e323c6e 464
jk431j 4:08979e323c6e 465 // Data format is: "S1:1234,S2:5678,S3:1234,S4:5678,S5:1234,S6:5678,S7:5678,S8:5678,S9:abcde...\n"
jk431j 4:08979e323c6e 466 int args_assigned = sscanf(usbhost_rx_string, "%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^\n]", Record[0], Record[1], Record[2], Record[3], Record[4], Record[5], Record[6], Record[7], StringRecord);
jk431j 4:08979e323c6e 467
jk431j 4:08979e323c6e 468 //StringRecord[109] = '\0';
jk431j 4:08979e323c6e 469 //PRINTF("Last = %s\n", StringRecord); //test
jk431j 4:08979e323c6e 470
jk431j 4:08979e323c6e 471 if (args_assigned == 9)
jk431j 4:08979e323c6e 472 { //sscanf was able to assign all 9 values
jk431j 4:08979e323c6e 473 for (x=0; x < 8; x++) // loop through the 8 sensors
jk431j 4:08979e323c6e 474 {
jk431j 4:08979e323c6e 475 // Strip the "Sx:" label characters from the field value
jk431j 4:08979e323c6e 476 length = strlen(Record[x]); // max of 7 characters but could be less
jk431j 4:08979e323c6e 477 strncpy(Record[x], Record[x] + 3, length);
jk431j 4:08979e323c6e 478 Record[x][length] = '\0'; // null termination character manually added
jk431j 4:08979e323c6e 479 }
jk431j 4:08979e323c6e 480 length = strlen(StringRecord);
jk431j 4:08979e323c6e 481 strncpy(StringRecord, StringRecord + 3, length);
jk431j 4:08979e323c6e 482 StringRecord[length] = '\0'; // null termination character manually added
jk431j 4:08979e323c6e 483
jk431j 4:08979e323c6e 484 if ((usbhost_rx_string[0] == 'S') && (usbhost_rx_string[1] == '1')) //The message starts with "S1"
jk431j 4:08979e323c6e 485 {
jk431j 4:08979e323c6e 486 f_sensor1_value = atof(Record[0]);
jk431j 4:08979e323c6e 487 f_sensor2_value = atof(Record[1]);
jk431j 4:08979e323c6e 488 f_sensor3_value = atof(Record[2]);
jk431j 4:08979e323c6e 489 f_sensor4_value = atof(Record[3]);
jk431j 4:08979e323c6e 490 f_sensor5_value = atof(Record[4]);
jk431j 4:08979e323c6e 491 f_sensor6_value = atof(Record[5]);
jk431j 4:08979e323c6e 492 f_sensor7_value = atof(Record[6]);
jk431j 4:08979e323c6e 493 f_sensor8_value = atof(Record[7]);
jk431j 4:08979e323c6e 494 sprintf(usb_sensor_string,StringRecord);
jk431j 4:08979e323c6e 495 //PRINTF("Received = %s, %s, %s, %s, %s, %s, %s, %s, %s\n", Record[0], Record[1], Record[2], Record[3], Record[4], Record[5], Record[6], Record[7], usb_sensor_string); //test
jk431j 4:08979e323c6e 496 sprintf(SENSOR_DATA.Virtual_Sensor1, "%s", Record[0]);
jk431j 4:08979e323c6e 497 sprintf(SENSOR_DATA.Virtual_Sensor2, "%s", Record[1]);
jk431j 4:08979e323c6e 498 sprintf(SENSOR_DATA.Virtual_Sensor3, "%s", Record[2]);
jk431j 4:08979e323c6e 499 sprintf(SENSOR_DATA.Virtual_Sensor4, "%s", Record[3]);
jk431j 4:08979e323c6e 500 sprintf(SENSOR_DATA.Virtual_Sensor5, "%s", Record[4]);
jk431j 4:08979e323c6e 501 sprintf(SENSOR_DATA.Virtual_Sensor6, "%s", Record[5]);
jk431j 4:08979e323c6e 502 sprintf(SENSOR_DATA.Virtual_Sensor7, "%s", Record[6]);
jk431j 4:08979e323c6e 503 sprintf(SENSOR_DATA.Virtual_Sensor8, "%s", Record[7]);
jk431j 4:08979e323c6e 504 }
jk431j 4:08979e323c6e 505 } //sscanf was able to assign all values
jk431j 4:08979e323c6e 506 return args_assigned;
jk431j 4:08979e323c6e 507 } //parse_usbhost_message()
jk431j 4:08979e323c6e 508
jk431j 4:08979e323c6e 509 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 510 //* Process any received message from the USB host
jk431j 4:08979e323c6e 511 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 512 void process_usb_rx(unsigned char ucNewRxByte)
jk431j 4:08979e323c6e 513 {
jk431j 4:08979e323c6e 514 if (ucNewRxByte == '?')
jk431j 4:08979e323c6e 515 { //just pinging
jk431j 4:08979e323c6e 516 usbhost_rxstring_index = 0;
jk431j 4:08979e323c6e 517 return;
jk431j 4:08979e323c6e 518 } //just pinging
jk431j 4:08979e323c6e 519 usbhost_rx_string[usbhost_rxstring_index++] = ucNewRxByte;
jk431j 4:08979e323c6e 520 if (ucNewRxByte == '\n')
jk431j 4:08979e323c6e 521 { //end of message
jk431j 4:08979e323c6e 522 usbhost_rx_string[usbhost_rxstring_index] = 0; //null terminate string
jk431j 4:08979e323c6e 523 usbhost_rxstring_index = 0;
jk431j 4:08979e323c6e 524 parse_usbhost_message();
jk431j 4:08979e323c6e 525 } //end of message
jk431j 4:08979e323c6e 526 } //process_usb_rx()
jk431j 4:08979e323c6e 527
jk431j 4:08979e323c6e 528 void ProcessUsbInterface(void)
jk431j 4:08979e323c6e 529 {
jk431j 4:08979e323c6e 530 //Process the USB host UART receive commands:
jk431j 4:08979e323c6e 531 if (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
jk431j 4:08979e323c6e 532 {
jk431j 4:08979e323c6e 533 bUsbConnected = true;
jk431j 4:08979e323c6e 534 while (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
jk431j 4:08979e323c6e 535 {
jk431j 4:08979e323c6e 536 unsigned char ucByteFromHost = usb_uart_rx_buff[usb_uart_rx_buff_getptr++]; //Copy latest received byte
jk431j 4:08979e323c6e 537 process_usb_rx(ucByteFromHost);
jk431j 4:08979e323c6e 538 } //while (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
jk431j 4:08979e323c6e 539 } // if there are USB UART bytes to receive
jk431j 4:08979e323c6e 540 //USB host UART transmit:
jk431j 4:08979e323c6e 541 //while (usb_uart_tx_buff_getptr != usb_uart_tx_buff_putptr)
jk431j 4:08979e323c6e 542 //{
jk431j 4:08979e323c6e 543 //pc.putc(usb_uart_tx_buff[usb_uart_tx_buff_getptr++]);
jk431j 4:08979e323c6e 544 //}
jk431j 4:08979e323c6e 545 } //ProcessUsbInterface()
jk431j 4:08979e323c6e 546
jk431j 4:08979e323c6e 547 // This function is called when a character goes into the RX buffer.
jk431j 4:08979e323c6e 548 void UsbUartRxCallback(MODSERIAL_IRQ_INFO *info)
jk431j 4:08979e323c6e 549 {
jk431j 4:08979e323c6e 550 // Get the pointer to our MODSERIAL object that invoked this callback.
jk431j 4:08979e323c6e 551 MODSERIAL *pc = info->serial;
jk431j 4:08979e323c6e 552 while (pc->readable())
jk431j 4:08979e323c6e 553 {
jk431j 4:08979e323c6e 554 usb_uart_rx_buff[usb_uart_rx_buff_putptr++] = pc->getcNb();
jk431j 4:08979e323c6e 555 }
jk431j 4:08979e323c6e 556 }
jk431j 4:08979e323c6e 557 #endif
jk431j 4:08979e323c6e 558
jk431j 4:08979e323c6e 559 void sensors_init(void)
jk431j 4:08979e323c6e 560 {
jk431j 4:08979e323c6e 561 #ifdef USE_VIRTUAL_SENSORS
jk431j 4:08979e323c6e 562 pc.attach(&UsbUartRxCallback, MODSERIAL::RxIrq);
jk431j 4:08979e323c6e 563 #endif
jk431j 4:08979e323c6e 564 Init_HTS221();
jk431j 4:08979e323c6e 565 Init_Si7020();
jk431j 4:08979e323c6e 566 Init_Si1145();
jk431j 4:08979e323c6e 567 Init_motion_sensor();
jk431j 4:08979e323c6e 568 } //sensors_init
jk431j 4:08979e323c6e 569
jk431j 4:08979e323c6e 570 void read_sensors(void)
jk431j 4:08979e323c6e 571 {
jk431j 4:08979e323c6e 572 Read_HTS221();
jk431j 4:08979e323c6e 573 Read_Si7020();
jk431j 4:08979e323c6e 574 Read_Si1145();
jk431j 4:08979e323c6e 575 Read_motion_sensor();
jk431j 4:08979e323c6e 576 } //read_sensors