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:
Mon Dec 11 20:02:13 2017 +0000
Revision:
13:ee72ca4ca7d4
Parent:
5:8099493f2c35
Added wait for cellular link in WncController::softwareInitMdm

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 5:8099493f2c35 155 SENSOR_DATA.Humidity_Si7020 = fRh;
jk431j 4:08979e323c6e 156
jk431j 4:08979e323c6e 157 //Command to read temperature when humidity is already done:
jk431j 4:08979e323c6e 158 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xE0, false);
jk431j 4:08979e323c6e 159 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Temperature[0], 2); //read temperature
jk431j 4:08979e323c6e 160 //PRINTF("Read Si7020 Temperature = 0x%02X%02X\n", Temperature[0], Temperature[1]);
jk431j 4:08979e323c6e 161 int temp_code = (Temperature[0] << 8) + Temperature[1];
jk431j 4:08979e323c6e 162 float fTemp = (175.72*temp_code/65536.0) - 46.85; //from datasheet in Celcius
jk431j 5:8099493f2c35 163 SENSOR_DATA.Temperature_Si7020 = fTemp;
jk431j 4:08979e323c6e 164 } //bool bSi7020_present = true
jk431j 4:08979e323c6e 165
jk431j 4:08979e323c6e 166 } //Read_Si7020()
jk431j 4:08979e323c6e 167
jk431j 4:08979e323c6e 168 /*------------------------------------------------------------------------------
jk431j 4:08979e323c6e 169 * The following are aliases so that the Si1145 coding examples can be used as-is.
jk431j 4:08979e323c6e 170 *------------------------------------------------------------------------------*/
jk431j 4:08979e323c6e 171 unsigned char ReadFrom_Si1145_Register(unsigned char reg) //returns byte from I2C Register 'reg'
jk431j 4:08979e323c6e 172 {
jk431j 4:08979e323c6e 173 unsigned char result = I2C_ReadSingleByteFromAddr(Si1145_PMOD_I2C_ADDR, reg);
jk431j 4:08979e323c6e 174 return (result);
jk431j 4:08979e323c6e 175 } //ReadFrom_Si1145_Register()
jk431j 4:08979e323c6e 176
jk431j 4:08979e323c6e 177 void WriteTo_Si1145_Register(unsigned char reg, unsigned char value) //writes 'value' into I2C Register reg'
jk431j 4:08979e323c6e 178 {
jk431j 4:08979e323c6e 179 I2C_WriteSingleByteToAddr(Si1145_PMOD_I2C_ADDR, reg, value, true);
jk431j 4:08979e323c6e 180 } //WriteTo_Si1145_Register()
jk431j 4:08979e323c6e 181
jk431j 4:08979e323c6e 182 #define REG_PARAM_WR 0x17
jk431j 4:08979e323c6e 183 #define REG_PARAM_RD 0x2E
jk431j 4:08979e323c6e 184 #define REG_COMMAND 0x18
jk431j 4:08979e323c6e 185 #define REG_RESPONSE 0x20
jk431j 4:08979e323c6e 186 #define REG_HW_KEY 0x07
jk431j 4:08979e323c6e 187 #define HW_KEY_VAL0 0x17
jk431j 4:08979e323c6e 188 #define REG_MEAS_RATE_LSB 0x08
jk431j 4:08979e323c6e 189 #define REG_MEAS_RATE_MSB 0x09
jk431j 4:08979e323c6e 190 #define REG_PS_LED21 0x0F
jk431j 4:08979e323c6e 191 #define REG_PS_LED3 0x10
jk431j 4:08979e323c6e 192 #define MAX_LED_CURRENT 0xF
jk431j 4:08979e323c6e 193 #define PARAM_CH_LIST 0x01
jk431j 4:08979e323c6e 194 #define REG_ALS_VIS_DATA0 0x22
jk431j 4:08979e323c6e 195 #define REG_ALS_VIS_DATA1 0x23
jk431j 4:08979e323c6e 196 #define REG_ALS_IR_DATA0 0x24
jk431j 4:08979e323c6e 197 #define REG_ALS_IR_DATA1 0x25
jk431j 4:08979e323c6e 198 #define REG_PS1_DATA0 0x26
jk431j 4:08979e323c6e 199 #define REG_PS1_DATA1 0x27
jk431j 4:08979e323c6e 200 #define REG_PS2_DATA0 0x28
jk431j 4:08979e323c6e 201 #define REG_PS2_DATA1 0x29
jk431j 4:08979e323c6e 202 #define REG_PS3_DATA0 0x2A
jk431j 4:08979e323c6e 203 #define REG_PS3_DATA1 0x2B
jk431j 4:08979e323c6e 204 #define REG_UVINDEX0 0x2C
jk431j 4:08979e323c6e 205 #define REG_UVINDEX1 0x2D
jk431j 4:08979e323c6e 206 int Si1145_ParamSet(unsigned char address, unsigned char value) //writes 'value' into Parameter 'address'
jk431j 4:08979e323c6e 207 {
jk431j 4:08979e323c6e 208 char txbuffer [3];
jk431j 4:08979e323c6e 209 txbuffer[0] = (char)REG_PARAM_WR; //destination
jk431j 4:08979e323c6e 210 txbuffer[1] = (char)value;
jk431j 4:08979e323c6e 211 txbuffer[2] = (char)(0xA0 + (address & 0x1F));
jk431j 4:08979e323c6e 212 int retval;
jk431j 4:08979e323c6e 213 //if((retval = _waitUntilSleep(si114x_handle))!=0) return retval;
jk431j 4:08979e323c6e 214 retval = I2C_WriteMultipleBytes(Si1145_PMOD_I2C_ADDR, &txbuffer[0], 3, true);
jk431j 4:08979e323c6e 215 if(retval!=0) return retval;
jk431j 4:08979e323c6e 216 while(1)
jk431j 4:08979e323c6e 217 {
jk431j 4:08979e323c6e 218 retval=ReadFrom_Si1145_Register(REG_PARAM_RD);
jk431j 4:08979e323c6e 219 if (retval==value) break;
jk431j 4:08979e323c6e 220 }
jk431j 4:08979e323c6e 221 return (0);
jk431j 4:08979e323c6e 222 } //Si1145_ParamSet()
jk431j 4:08979e323c6e 223
jk431j 4:08979e323c6e 224 void PsAlsForce(void) //equivalent to WriteTo_Si1145_Register(REG_COMMAND,0x07). This forces PS and ALS measurements
jk431j 4:08979e323c6e 225 {
jk431j 4:08979e323c6e 226 WriteTo_Si1145_Register(REG_COMMAND,0x07);
jk431j 4:08979e323c6e 227 } //PsAlsForce()
jk431j 4:08979e323c6e 228
jk431j 4:08979e323c6e 229 bool bSi1145_present = false;
jk431j 4:08979e323c6e 230 void Init_Si1145(void)
jk431j 4:08979e323c6e 231 {
jk431j 4:08979e323c6e 232 unsigned char readbyte;
jk431j 4:08979e323c6e 233 //Read Si1145 part ID:
jk431j 4:08979e323c6e 234 readbyte = ReadFrom_Si1145_Register(0x00);
jk431j 4:08979e323c6e 235 if (readbyte != 0x45)
jk431j 4:08979e323c6e 236 {
jk431j 4:08979e323c6e 237 bSi1145_present = false;
jk431j 4:08979e323c6e 238 PRINTF("Si1145 sensor not found\r\n");
jk431j 4:08979e323c6e 239 }
jk431j 4:08979e323c6e 240 else
jk431j 4:08979e323c6e 241 {
jk431j 4:08979e323c6e 242 bSi1145_present = true;
jk431j 4:08979e323c6e 243 PRINTF("Si1145 Part ID : 0x%02X\n", readbyte);
jk431j 4:08979e323c6e 244 //Initialize Si1145 by writing to HW_KEY (I2C Register 0x07 = 0x17)
jk431j 4:08979e323c6e 245 WriteTo_Si1145_Register(REG_HW_KEY, HW_KEY_VAL0);
jk431j 4:08979e323c6e 246
jk431j 4:08979e323c6e 247 // Initialize LED Current
jk431j 4:08979e323c6e 248 // I2C Register 0x0F = 0xFF
jk431j 4:08979e323c6e 249 // I2C Register 0x10 = 0x0F
jk431j 4:08979e323c6e 250 WriteTo_Si1145_Register(REG_PS_LED21,(MAX_LED_CURRENT<<4) + MAX_LED_CURRENT);
jk431j 4:08979e323c6e 251 WriteTo_Si1145_Register(REG_PS_LED3, MAX_LED_CURRENT);
jk431j 4:08979e323c6e 252
jk431j 4:08979e323c6e 253 // Parameter 0x01 = 0x37
jk431j 4:08979e323c6e 254 //Si1145_ParamSet(PARAM_CH_LIST, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK);
jk431j 4:08979e323c6e 255 //Si1145_ParamSet(0x01, 0x37); //CHLIST is address 0x01 in the parameter RAM. It defines which sensors are enabled (here, some)
jk431j 4:08979e323c6e 256 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 257 // 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 258 PsAlsForce(); // can also be written as WriteTo_Si1145_Register(REG_COMMAND,0x07);
jk431j 4:08979e323c6e 259 WriteTo_Si1145_Register(REG_COMMAND, 0x0F);//command to put it into auto mode
jk431j 4:08979e323c6e 260 //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 261 WriteTo_Si1145_Register(REG_MEAS_RATE_LSB, 0x00);
jk431j 4:08979e323c6e 262 WriteTo_Si1145_Register(REG_MEAS_RATE_MSB, 0x10);
jk431j 4:08979e323c6e 263 } //bSi1145_present = true
jk431j 4:08979e323c6e 264 } //Init_Si1145()
jk431j 4:08979e323c6e 265
jk431j 4:08979e323c6e 266 void Read_Si1145(void)
jk431j 4:08979e323c6e 267 {
jk431j 4:08979e323c6e 268 if (bSi1145_present)
jk431j 4:08979e323c6e 269 {
jk431j 4:08979e323c6e 270 // Once the measurements are completed, here is how to reconstruct them
jk431j 4:08979e323c6e 271 // Note very carefully that 16-bit registers are in the 'Little Endian' byte order
jk431j 4:08979e323c6e 272 // It may be more efficient to perform block I2C Reads, but this example shows
jk431j 4:08979e323c6e 273 // individual reads of registers
jk431j 4:08979e323c6e 274
jk431j 4:08979e323c6e 275 int PS1 = ReadFrom_Si1145_Register(REG_PS1_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS1_DATA1);
jk431j 4:08979e323c6e 276 int PS2 = ReadFrom_Si1145_Register(REG_PS2_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS2_DATA1);
jk431j 4:08979e323c6e 277 int PS3 = ReadFrom_Si1145_Register(REG_PS3_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS3_DATA1);
jk431j 4:08979e323c6e 278 //PRINTF("PS1_Data = %d\n", PS1);
jk431j 4:08979e323c6e 279 //PRINTF("PS2_Data = %d\n", PS2);
jk431j 4:08979e323c6e 280 //PRINTF("PS3_Data = %d\n", PS3);
jk431j 4:08979e323c6e 281 //OBJECT PRESENT?
jk431j 4:08979e323c6e 282 #if (0)
jk431j 4:08979e323c6e 283 if(PS1 < 22000){
jk431j 4:08979e323c6e 284 //PRINTF("Object Far\n");
jk431j 4:08979e323c6e 285 sprintf(SENSOR_DATA.Proximity, "Object Far\0");
jk431j 4:08979e323c6e 286 }
jk431j 4:08979e323c6e 287 else if(PS1 < 24000)
jk431j 4:08979e323c6e 288 {
jk431j 4:08979e323c6e 289 //PRINTF("Object in Vicinity\n");
jk431j 4:08979e323c6e 290 sprintf(SENSOR_DATA.Proximity, "Object in Vicinity\0");
jk431j 4:08979e323c6e 291 }
jk431j 4:08979e323c6e 292 else if (PS1 < 30000)
jk431j 4:08979e323c6e 293 {
jk431j 4:08979e323c6e 294 //PRINTF("Object Near\n");
jk431j 4:08979e323c6e 295 sprintf(SENSOR_DATA.Proximity, "Object Near\0");
jk431j 4:08979e323c6e 296 }
jk431j 4:08979e323c6e 297 else
jk431j 4:08979e323c6e 298 {
jk431j 4:08979e323c6e 299 //PRINTF("Object Very Near\n");
jk431j 4:08979e323c6e 300 sprintf(SENSOR_DATA.Proximity, "Object Very Near\0");
jk431j 4:08979e323c6e 301 }
jk431j 4:08979e323c6e 302 #else
jk431j 5:8099493f2c35 303 SENSOR_DATA.Proximity = PS1;
jk431j 4:08979e323c6e 304 #endif
jk431j 4:08979e323c6e 305
jk431j 4:08979e323c6e 306 //Force ALS read:
jk431j 4:08979e323c6e 307 //WriteTo_Si1145_Register(REG_COMMAND, 0x06);
jk431j 4:08979e323c6e 308 //wait (0.1);
jk431j 4:08979e323c6e 309 int ALS_VIS = ReadFrom_Si1145_Register(REG_ALS_VIS_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_VIS_DATA1);
jk431j 4:08979e323c6e 310 int ALS_IR = ReadFrom_Si1145_Register(REG_ALS_IR_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_IR_DATA1);
jk431j 4:08979e323c6e 311 int UV_INDEX = ReadFrom_Si1145_Register(REG_UVINDEX0) + 256 * ReadFrom_Si1145_Register(REG_UVINDEX1);
jk431j 4:08979e323c6e 312 //PRINTF("ALS_VIS_Data = %d\n", ALS_VIS);
jk431j 4:08979e323c6e 313 //PRINTF("ALS_IR_Data = %d\n", ALS_IR);
jk431j 4:08979e323c6e 314 //PRINTF("UV_INDEX_Data = %d\n", UV_INDEX);
jk431j 4:08979e323c6e 315
jk431j 4:08979e323c6e 316 //PRINTF("Ambient Light Visible Sensor = %d\n", ALS_VIS);
jk431j 5:8099493f2c35 317 SENSOR_DATA.AmbientLightVis = ALS_VIS;
jk431j 4:08979e323c6e 318 //PRINTF("Ambient Light Infrared Sensor = %d\n", ALS_IR);
jk431j 5:8099493f2c35 319 SENSOR_DATA.AmbientLightIr = ALS_IR;
jk431j 4:08979e323c6e 320 //float fUV_value = (UV_INDEX -50.0)/10000.0;
jk431j 4:08979e323c6e 321 float fUV_value = (UV_INDEX)/100.0; //this is the aux reading
jk431j 4:08979e323c6e 322 //PRINTF("UV_Data = %0.2f\n", fUV_value);
jk431j 5:8099493f2c35 323 SENSOR_DATA.UVindex = fUV_value;
jk431j 4:08979e323c6e 324 } //bSi1145_present = true
jk431j 4:08979e323c6e 325 } //Read_Si1145()
jk431j 4:08979e323c6e 326
jk431j 4:08979e323c6e 327 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 328 //* Read the FXOS8700CQ - 6-axis combo Sensor Accelerometer and Magnetometer
jk431j 4:08979e323c6e 329 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 330 bool bMotionSensor_present = false;
jk431j 4:08979e323c6e 331 void Init_motion_sensor()
jk431j 4:08979e323c6e 332 {
jk431j 4:08979e323c6e 333 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
jk431j 4:08979e323c6e 334 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
jk431j 4:08979e323c6e 335 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
jk431j 4:08979e323c6e 336 int iWhoAmI = fxos.get_whoami();
jk431j 4:08979e323c6e 337
jk431j 4:08979e323c6e 338 PRINTF("FXOS8700CQ WhoAmI = %X\r\n", iWhoAmI);
jk431j 4:08979e323c6e 339 // Iterrupt for active-low interrupt line from FXOS
jk431j 4:08979e323c6e 340 // Configured with only one interrupt on INT2 signaling Data-Ready
jk431j 4:08979e323c6e 341 //fxos_int2.fall(&trigger_fxos_int2);
jk431j 4:08979e323c6e 342 if (iWhoAmI != 0xC7)
jk431j 4:08979e323c6e 343 {
jk431j 4:08979e323c6e 344 bMotionSensor_present = false;
jk431j 4:08979e323c6e 345 PRINTF("FXOS8700CQ motion sensor not found\r\n");
jk431j 4:08979e323c6e 346 }
jk431j 4:08979e323c6e 347 else
jk431j 4:08979e323c6e 348 {
jk431j 4:08979e323c6e 349 bMotionSensor_present = true;
jk431j 4:08979e323c6e 350 fxos.enable();
jk431j 4:08979e323c6e 351 }
jk431j 4:08979e323c6e 352 } //Init_motion_sensor()
jk431j 4:08979e323c6e 353
jk431j 4:08979e323c6e 354 void Read_motion_sensor()
jk431j 4:08979e323c6e 355 {
jk431j 4:08979e323c6e 356 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
jk431j 4:08979e323c6e 357 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
jk431j 4:08979e323c6e 358 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
jk431j 4:08979e323c6e 359 if (bMotionSensor_present)
jk431j 4:08979e323c6e 360 {
jk431j 4:08979e323c6e 361 fxos.enable();
jk431j 4:08979e323c6e 362 fxos.get_data(&accel_data, &magn_data);
jk431j 4:08979e323c6e 363 //PRINTF("Roll=%5d, Pitch=%5d, Yaw=%5d;\r\n", magn_data.x, magn_data.y, magn_data.z);
jk431j 5:8099493f2c35 364 SENSOR_DATA.MagnetometerX = magn_data.x;
jk431j 5:8099493f2c35 365 SENSOR_DATA.MagnetometerY = magn_data.y;
jk431j 5:8099493f2c35 366 SENSOR_DATA.MagnetometerZ = magn_data.z;
jk431j 4:08979e323c6e 367
jk431j 4:08979e323c6e 368 //Try to normalize (/2048) the values so they will match the eCompass output:
jk431j 4:08979e323c6e 369 float fAccelScaled_x, fAccelScaled_y, fAccelScaled_z;
jk431j 4:08979e323c6e 370 fAccelScaled_x = (accel_data.x/2048.0);
jk431j 4:08979e323c6e 371 fAccelScaled_y = (accel_data.y/2048.0);
jk431j 4:08979e323c6e 372 fAccelScaled_z = (accel_data.z/2048.0);
jk431j 4:08979e323c6e 373 //PRINTF("Acc: X=%2.3f Y=%2.3f Z=%2.3f;\r\n", fAccelScaled_x, fAccelScaled_y, fAccelScaled_z);
jk431j 5:8099493f2c35 374 SENSOR_DATA.AccelX = fAccelScaled_x;
jk431j 5:8099493f2c35 375 SENSOR_DATA.AccelY = fAccelScaled_y;
jk431j 5:8099493f2c35 376 SENSOR_DATA.AccelZ = fAccelScaled_z;
jk431j 4:08979e323c6e 377 } //bMotionSensor_present
jk431j 4:08979e323c6e 378 } //Read_motion_sensor()
jk431j 4:08979e323c6e 379
jk431j 4:08979e323c6e 380
jk431j 4:08979e323c6e 381 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 382 //* Read the HTS221 temperature & humidity sensor on the Cellular Shield
jk431j 4:08979e323c6e 383 //********************************************************************************************************************************************
jk431j 4:08979e323c6e 384 // These are to be built on the fly
jk431j 4:08979e323c6e 385 string my_temp;
jk431j 4:08979e323c6e 386 string my_humidity;
jk431j 4:08979e323c6e 387 HTS221 hts221;
jk431j 4:08979e323c6e 388
jk431j 4:08979e323c6e 389 #define CTOF(x) ((x)*1.8+32)
jk431j 4:08979e323c6e 390 bool bHTS221_present = false;
jk431j 4:08979e323c6e 391 void Init_HTS221()
jk431j 4:08979e323c6e 392 {
jk431j 4:08979e323c6e 393 int i;
jk431j 4:08979e323c6e 394 void hts221_init(void);
jk431j 4:08979e323c6e 395 i = hts221.begin();
jk431j 4:08979e323c6e 396 if (i)
jk431j 4:08979e323c6e 397 {
jk431j 4:08979e323c6e 398 bHTS221_present = true;
jk431j 4:08979e323c6e 399 PRINTF(BLU "HTS221 Detected (0x%02X)\n\r",i);
jk431j 4:08979e323c6e 400 PRINTF(" Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
jk431j 4:08979e323c6e 401 PRINTF(" Humid is: %02d %%\n\r",hts221.readHumidity());
jk431j 4:08979e323c6e 402 }
jk431j 4:08979e323c6e 403 else
jk431j 4:08979e323c6e 404 {
jk431j 4:08979e323c6e 405 bHTS221_present = false;
jk431j 4:08979e323c6e 406 PRINTF(RED "HTS221 NOT DETECTED!\n\r");
jk431j 4:08979e323c6e 407 }
jk431j 4:08979e323c6e 408 } //Init_HTS221()
jk431j 4:08979e323c6e 409
jk431j 4:08979e323c6e 410 void Read_HTS221()
jk431j 4:08979e323c6e 411 {
jk431j 4:08979e323c6e 412 if (bHTS221_present)
jk431j 4:08979e323c6e 413 {
jk431j 4:08979e323c6e 414 double fTemp = hts221.readTemperature();
jk431j 4:08979e323c6e 415 double fRh = hts221.readHumidity();
jk431j 5:8099493f2c35 416 SENSOR_DATA.Temperature = fTemp;
jk431j 5:8099493f2c35 417 SENSOR_DATA.Humidity = fRh;
jk431j 4:08979e323c6e 418
jk431j 4:08979e323c6e 419 } //bHTS221_present
jk431j 4:08979e323c6e 420 } //Read_HTS221()
jk431j 4:08979e323c6e 421
jk431j 4:08979e323c6e 422
jk431j 4:08979e323c6e 423 void sensors_init(void)
jk431j 4:08979e323c6e 424 {
jk431j 4:08979e323c6e 425 Init_HTS221();
jk431j 4:08979e323c6e 426 Init_Si7020();
jk431j 4:08979e323c6e 427 Init_Si1145();
jk431j 4:08979e323c6e 428 Init_motion_sensor();
jk431j 4:08979e323c6e 429 } //sensors_init
jk431j 4:08979e323c6e 430
jk431j 4:08979e323c6e 431 void read_sensors(void)
jk431j 4:08979e323c6e 432 {
jk431j 4:08979e323c6e 433 Read_HTS221();
jk431j 4:08979e323c6e 434 Read_Si7020();
jk431j 4:08979e323c6e 435 Read_Si1145();
jk431j 4:08979e323c6e 436 Read_motion_sensor();
jk431j 4:08979e323c6e 437 } //read_sensors