Mobile Life IoT project using the AT&T IoT Starter Kit Software and files for my device to monitor the status or our Airstream travel trailer RV. A full description of the project is at Hackster.IO here as part of the Realtime AT&T IoT Starter Kit Challenge: https://www.hackster.io/Anubus/mobile-life-iot-9c10be

Dependencies:   FXOS8700CQ MODSERIAL mbed

Committer:
Anubus
Date:
Sun Apr 02 12:28:21 2017 +0000
Revision:
0:bd276b1f1249
public version commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anubus 0:bd276b1f1249 1 /* ===================================================================
Anubus 0:bd276b1f1249 2 Copyright © 2016, AVNET Inc.
Anubus 0:bd276b1f1249 3
Anubus 0:bd276b1f1249 4 Licensed under the Apache License, Version 2.0 (the "License");
Anubus 0:bd276b1f1249 5 you may not use this file except in compliance with the License.
Anubus 0:bd276b1f1249 6 You may obtain a copy of the License at
Anubus 0:bd276b1f1249 7
Anubus 0:bd276b1f1249 8 http://www.apache.org/licenses/LICENSE-2.0
Anubus 0:bd276b1f1249 9
Anubus 0:bd276b1f1249 10 Unless required by applicable law or agreed to in writing,
Anubus 0:bd276b1f1249 11 software distributed under the License is distributed on an
Anubus 0:bd276b1f1249 12 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
Anubus 0:bd276b1f1249 13 either express or implied. See the License for the specific
Anubus 0:bd276b1f1249 14 language governing permissions and limitations under the License.
Anubus 0:bd276b1f1249 15
Anubus 0:bd276b1f1249 16 =======================================================
Anubus 0:bd276b1f1249 17 Modified by Robert Bolling
Anubus 0:bd276b1f1249 18 January 2017
Anubus 0:bd276b1f1249 19 for the Mobile Life IoT project
Anubus 0:bd276b1f1249 20 - refactored Si7020 to Si7021 sensor
Anubus 0:bd276b1f1249 21 - added voltage and intrusion sensor
Anubus 0:bd276b1f1249 22 - some other clean up including removing unused code
Anubus 0:bd276b1f1249 23 for virtual sensors and the Si1145
Anubus 0:bd276b1f1249 24 =======================================================
Anubus 0:bd276b1f1249 25
Anubus 0:bd276b1f1249 26 ======================================================================== */
Anubus 0:bd276b1f1249 27
Anubus 0:bd276b1f1249 28 #include "mbed.h"
Anubus 0:bd276b1f1249 29 #include "sensors.h"
Anubus 0:bd276b1f1249 30 #include "hardware.h"
Anubus 0:bd276b1f1249 31 #include "config_me.h"
Anubus 0:bd276b1f1249 32 #include "FXOS8700CQ.h"
Anubus 0:bd276b1f1249 33 #include "HTS221.h"
Anubus 0:bd276b1f1249 34 #include "xadow_gps.h"
Anubus 0:bd276b1f1249 35 #include <string>
Anubus 0:bd276b1f1249 36
Anubus 0:bd276b1f1249 37 #define Si7020_PMOD_I2C_ADDR 0x80 //this is for 7-bit I2C addr 0x4 for the Si7021 external sensor
Anubus 0:bd276b1f1249 38
Anubus 0:bd276b1f1249 39 // Storage for the data from the motion sensor
Anubus 0:bd276b1f1249 40 SRAWDATA accel_data;
Anubus 0:bd276b1f1249 41 SRAWDATA magn_data;
Anubus 0:bd276b1f1249 42 //InterruptIn fxos_int1(PTC6); // unused, common with SW2 on FRDM-K64F
Anubus 0:bd276b1f1249 43 InterruptIn fxos_int2(PTC13); // should just be the Data-Ready interrupt
Anubus 0:bd276b1f1249 44
Anubus 0:bd276b1f1249 45 bool fxos_int2_triggered = false;
Anubus 0:bd276b1f1249 46 void trigger_fxos_int2(void)
Anubus 0:bd276b1f1249 47 {
Anubus 0:bd276b1f1249 48 fxos_int2_triggered = true;
Anubus 0:bd276b1f1249 49
Anubus 0:bd276b1f1249 50 }
Anubus 0:bd276b1f1249 51
Anubus 0:bd276b1f1249 52 #define VOLTS_SCALE 18.6 //scale battery voltage measurement based on R1 and R2
Anubus 0:bd276b1f1249 53 AnalogIn Analog0(PTC0); // Had to use J1-11 for PTC0 to deconflict from wnc shield pins
Anubus 0:bd276b1f1249 54
Anubus 0:bd276b1f1249 55
Anubus 0:bd276b1f1249 56 /*------------------------------------------------------------------------------
Anubus 0:bd276b1f1249 57 * Perform I2C single read.
Anubus 0:bd276b1f1249 58 *------------------------------------------------------------------------------*/
Anubus 0:bd276b1f1249 59 unsigned char I2C_ReadSingleByte(unsigned char ucDeviceAddress)
Anubus 0:bd276b1f1249 60 {
Anubus 0:bd276b1f1249 61 char rxbuffer [1];
Anubus 0:bd276b1f1249 62 i2c.read(ucDeviceAddress, rxbuffer, 1 );
Anubus 0:bd276b1f1249 63 return (unsigned char)rxbuffer[0];
Anubus 0:bd276b1f1249 64 } //I2C_ReadSingleByte()
Anubus 0:bd276b1f1249 65
Anubus 0:bd276b1f1249 66 /*------------------------------------------------------------------------------
Anubus 0:bd276b1f1249 67 * Perform I2C single read from address.
Anubus 0:bd276b1f1249 68 *------------------------------------------------------------------------------*/
Anubus 0:bd276b1f1249 69 unsigned char I2C_ReadSingleByteFromAddr(unsigned char ucDeviceAddress, unsigned char Addr)
Anubus 0:bd276b1f1249 70 {
Anubus 0:bd276b1f1249 71 char txbuffer [1];
Anubus 0:bd276b1f1249 72 char rxbuffer [1];
Anubus 0:bd276b1f1249 73 txbuffer[0] = (char)Addr;
Anubus 0:bd276b1f1249 74 i2c.write(ucDeviceAddress, txbuffer, 1 );
Anubus 0:bd276b1f1249 75 i2c.read(ucDeviceAddress, rxbuffer, 1 );
Anubus 0:bd276b1f1249 76 return (unsigned char)rxbuffer[0];
Anubus 0:bd276b1f1249 77 } //I2C_ReadSingleByteFromAddr()
Anubus 0:bd276b1f1249 78
Anubus 0:bd276b1f1249 79 /*------------------------------------------------------------------------------
Anubus 0:bd276b1f1249 80 * Perform I2C read of more than 1 byte.
Anubus 0:bd276b1f1249 81 *------------------------------------------------------------------------------*/
Anubus 0:bd276b1f1249 82 int I2C_ReadMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength)
Anubus 0:bd276b1f1249 83 {
Anubus 0:bd276b1f1249 84 int status;
Anubus 0:bd276b1f1249 85 status = i2c.read(ucDeviceAddress, ucData, ucLength);
Anubus 0:bd276b1f1249 86 return status;
Anubus 0:bd276b1f1249 87 } //I2C_ReadMultipleBytes()
Anubus 0:bd276b1f1249 88
Anubus 0:bd276b1f1249 89 /*------------------------------------------------------------------------------
Anubus 0:bd276b1f1249 90 * Perform I2C write of a single byte.
Anubus 0:bd276b1f1249 91 *------------------------------------------------------------------------------*/
Anubus 0:bd276b1f1249 92 int I2C_WriteSingleByte(unsigned char ucDeviceAddress, unsigned char Data, bool bSendStop)
Anubus 0:bd276b1f1249 93 {
Anubus 0:bd276b1f1249 94 int status;
Anubus 0:bd276b1f1249 95 char txbuffer [1];
Anubus 0:bd276b1f1249 96 txbuffer[0] = (char)Data; //data
Anubus 0:bd276b1f1249 97 status = i2c.write(ucDeviceAddress, txbuffer, 1, !bSendStop); //true: do not send stop
Anubus 0:bd276b1f1249 98 return status;
Anubus 0:bd276b1f1249 99 } //I2C_WriteSingleByte()
Anubus 0:bd276b1f1249 100
Anubus 0:bd276b1f1249 101 /*------------------------------------------------------------------------------
Anubus 0:bd276b1f1249 102 * Perform I2C write of 1 byte to an address.
Anubus 0:bd276b1f1249 103 *------------------------------------------------------------------------------*/
Anubus 0:bd276b1f1249 104 int I2C_WriteSingleByteToAddr(unsigned char ucDeviceAddress, unsigned char Addr, unsigned char Data, bool bSendStop)
Anubus 0:bd276b1f1249 105 {
Anubus 0:bd276b1f1249 106 int status;
Anubus 0:bd276b1f1249 107 char txbuffer [2];
Anubus 0:bd276b1f1249 108 txbuffer[0] = (char)Addr; //address
Anubus 0:bd276b1f1249 109 txbuffer[1] = (char)Data; //data
Anubus 0:bd276b1f1249 110 //status = i2c.write(ucDeviceAddress, txbuffer, 2, false); //stop at end
Anubus 0:bd276b1f1249 111 status = i2c.write(ucDeviceAddress, txbuffer, 2, !bSendStop); //true: do not send stop
Anubus 0:bd276b1f1249 112 return status;
Anubus 0:bd276b1f1249 113 } //I2C_WriteSingleByteToAddr()
Anubus 0:bd276b1f1249 114
Anubus 0:bd276b1f1249 115 /*------------------------------------------------------------------------------
Anubus 0:bd276b1f1249 116 * Perform I2C write of more than 1 byte.
Anubus 0:bd276b1f1249 117 *------------------------------------------------------------------------------*/
Anubus 0:bd276b1f1249 118 int I2C_WriteMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength, bool bSendStop)
Anubus 0:bd276b1f1249 119 {
Anubus 0:bd276b1f1249 120 int status;
Anubus 0:bd276b1f1249 121 status = i2c.write(ucDeviceAddress, ucData, ucLength, !bSendStop); //true: do not send stop
Anubus 0:bd276b1f1249 122 return status;
Anubus 0:bd276b1f1249 123 } //I2C_WriteMultipleBytes()
Anubus 0:bd276b1f1249 124
Anubus 0:bd276b1f1249 125 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 126 //* Battery Voltage
Anubus 0:bd276b1f1249 127 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 128
Anubus 0:bd276b1f1249 129 void Read_Battery_Volts(void)
Anubus 0:bd276b1f1249 130 {
Anubus 0:bd276b1f1249 131 float Volts;
Anubus 0:bd276b1f1249 132 Volts = Analog0 * VOLTS_SCALE;
Anubus 0:bd276b1f1249 133 PRINTF("Voltage: %0.3f Volts \r\n", Volts);
Anubus 0:bd276b1f1249 134 sprintf(SENSOR_DATA.Battery_Voltage, "%0.2f", Volts);
Anubus 0:bd276b1f1249 135 }
Anubus 0:bd276b1f1249 136
Anubus 0:bd276b1f1249 137 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 138 //* Si7020/Si7021 temperature & humidity sensor
Anubus 0:bd276b1f1249 139 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 140
Anubus 0:bd276b1f1249 141 bool bSi7020_present = false;
Anubus 0:bd276b1f1249 142 void Init_Si7020(void)
Anubus 0:bd276b1f1249 143 {
Anubus 0:bd276b1f1249 144 char SN_7020 [8];
Anubus 0:bd276b1f1249 145 //SN part 1:
Anubus 0:bd276b1f1249 146 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFA, 0x0F, false);
Anubus 0:bd276b1f1249 147 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[0], 4);
Anubus 0:bd276b1f1249 148
Anubus 0:bd276b1f1249 149 //SN part 1:
Anubus 0:bd276b1f1249 150 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFC, 0xC9, false);
Anubus 0:bd276b1f1249 151 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[4], 4);
Anubus 0:bd276b1f1249 152
Anubus 0:bd276b1f1249 153 char Ver_7020 [2];
Anubus 0:bd276b1f1249 154 //FW version:
Anubus 0:bd276b1f1249 155 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0x84, 0xB8, false);
Anubus 0:bd276b1f1249 156 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Ver_7020[0], 2);
Anubus 0:bd276b1f1249 157
Anubus 0:bd276b1f1249 158 if (SN_7020[4] != 0x15) //Si7021 this is 0x15, for Si7020 this is 0x14
Anubus 0:bd276b1f1249 159 {
Anubus 0:bd276b1f1249 160 bSi7020_present = false;
Anubus 0:bd276b1f1249 161 PRINTF("Si7020 sensor not found. SN=0x%02X Si7020addr=0x%02X \r\n", SN_7020[4], Si7020_PMOD_I2C_ADDR ); //TODO: take out SN print
Anubus 0:bd276b1f1249 162 }
Anubus 0:bd276b1f1249 163 else
Anubus 0:bd276b1f1249 164 {
Anubus 0:bd276b1f1249 165 bSi7020_present = true;
Anubus 0:bd276b1f1249 166 PRINTF("Si7020 SN = 0x%02X%02X%02X%02X%02X%02X%02X%02X \r\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]);
Anubus 0:bd276b1f1249 167 PRINTF("Si7020 Version# = 0x%02X \r\n", Ver_7020[0]);
Anubus 0:bd276b1f1249 168 } //bool bSi7020_present = true
Anubus 0:bd276b1f1249 169
Anubus 0:bd276b1f1249 170 } //Init_Si7020()
Anubus 0:bd276b1f1249 171
Anubus 0:bd276b1f1249 172 void Read_Si7020(void)
Anubus 0:bd276b1f1249 173 {
Anubus 0:bd276b1f1249 174 if (bSi7020_present)
Anubus 0:bd276b1f1249 175 {
Anubus 0:bd276b1f1249 176 char Humidity [2];
Anubus 0:bd276b1f1249 177 char Temperature [2];
Anubus 0:bd276b1f1249 178 //Command to measure humidity (temperature also gets measured):
Anubus 0:bd276b1f1249 179 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xF5, false); //no hold, must do dummy read
Anubus 0:bd276b1f1249 180 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 1); //dummy read, should get an nack until it is done
Anubus 0:bd276b1f1249 181 wait (0.05); //wait for measurement. Can also keep reading until no NACK is received
Anubus 0:bd276b1f1249 182 //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...
Anubus 0:bd276b1f1249 183 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 2); //read humidity
Anubus 0:bd276b1f1249 184 //PRINTF("Read Si7020 Humidity = 0x%02X%02X\n", Humidity[0], Humidity[1]);
Anubus 0:bd276b1f1249 185 int rh_code = (Humidity[0] << 8) + Humidity[1];
Anubus 0:bd276b1f1249 186 float fRh = (125.0*rh_code/65536.0) - 6.0; //from datasheet
Anubus 0:bd276b1f1249 187 PRINTF("Si7020 Humidity = %0.1f %% \r\n", fRh); //double % sign for escape //PRINTF("%*.*f\n", myFieldWidth, myPrecision, myFloatValue);
Anubus 0:bd276b1f1249 188 sprintf(SENSOR_DATA.Humidity_Si7020, "%0.1f", fRh);
Anubus 0:bd276b1f1249 189
Anubus 0:bd276b1f1249 190 //Command to read temperature when humidity is already done:
Anubus 0:bd276b1f1249 191 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xE0, false);
Anubus 0:bd276b1f1249 192 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Temperature[0], 2); //read temperature
Anubus 0:bd276b1f1249 193 //PRINTF("Read Si7020 Temperature = 0x%02X%02X\n", Temperature[0], Temperature[1]);
Anubus 0:bd276b1f1249 194 int temp_code = (Temperature[0] << 8) + Temperature[1];
Anubus 0:bd276b1f1249 195 float fTemp = (175.72*temp_code/65536.0) - 46.85; //from datasheet in Celcius
Anubus 0:bd276b1f1249 196 PRINTF("Si7020 Temperature = %0.1f deg F \r\n", CTOF(fTemp));
Anubus 0:bd276b1f1249 197 sprintf(SENSOR_DATA.Temperature_Si7020, "%0.1f", CTOF(fTemp));
Anubus 0:bd276b1f1249 198 } //bool bSi7020_present = true
Anubus 0:bd276b1f1249 199
Anubus 0:bd276b1f1249 200 } //Read_Si7020()
Anubus 0:bd276b1f1249 201
Anubus 0:bd276b1f1249 202
Anubus 0:bd276b1f1249 203 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 204 //* Read the FXOS8700CQ - 6-axis combo Sensor Accelerometer and Magnetometer
Anubus 0:bd276b1f1249 205 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 206 bool bMotionSensor_present = false;
Anubus 0:bd276b1f1249 207 void Init_motion_sensor()
Anubus 0:bd276b1f1249 208 {
Anubus 0:bd276b1f1249 209 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
Anubus 0:bd276b1f1249 210 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
Anubus 0:bd276b1f1249 211 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
Anubus 0:bd276b1f1249 212 int iWhoAmI = fxos.get_whoami();
Anubus 0:bd276b1f1249 213
Anubus 0:bd276b1f1249 214 PRINTF("FXOS8700CQ WhoAmI = %X\r\n", iWhoAmI);
Anubus 0:bd276b1f1249 215 // Iterrupt for active-low interrupt line from FXOS
Anubus 0:bd276b1f1249 216 // Configured with only one interrupt on INT2 signaling Data-Ready
Anubus 0:bd276b1f1249 217 //fxos_int2.fall(&trigger_fxos_int2);
Anubus 0:bd276b1f1249 218 if (iWhoAmI != 0xC7)
Anubus 0:bd276b1f1249 219 {
Anubus 0:bd276b1f1249 220 bMotionSensor_present = false;
Anubus 0:bd276b1f1249 221 PRINTF("FXOS8700CQ motion sensor not found\r\n");
Anubus 0:bd276b1f1249 222 }
Anubus 0:bd276b1f1249 223 else
Anubus 0:bd276b1f1249 224 {
Anubus 0:bd276b1f1249 225 bMotionSensor_present = true;
Anubus 0:bd276b1f1249 226 fxos.enable();
Anubus 0:bd276b1f1249 227 }
Anubus 0:bd276b1f1249 228 } //Init_motion_sensor()
Anubus 0:bd276b1f1249 229
Anubus 0:bd276b1f1249 230 void Read_motion_sensor()
Anubus 0:bd276b1f1249 231 {
Anubus 0:bd276b1f1249 232 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
Anubus 0:bd276b1f1249 233 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
Anubus 0:bd276b1f1249 234 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
Anubus 0:bd276b1f1249 235 if (bMotionSensor_present)
Anubus 0:bd276b1f1249 236 {
Anubus 0:bd276b1f1249 237 fxos.enable();
Anubus 0:bd276b1f1249 238 fxos.get_data(&accel_data, &magn_data);
Anubus 0:bd276b1f1249 239 //PRINTF("Roll=%5d, Pitch=%5d, Yaw=%5d;\r\n", magn_data.x, magn_data.y, magn_data.z);
Anubus 0:bd276b1f1249 240 sprintf(SENSOR_DATA.MagnetometerX, "%5d", magn_data.x);
Anubus 0:bd276b1f1249 241 sprintf(SENSOR_DATA.MagnetometerY, "%5d", magn_data.y);
Anubus 0:bd276b1f1249 242 sprintf(SENSOR_DATA.MagnetometerZ, "%5d", magn_data.z);
Anubus 0:bd276b1f1249 243
Anubus 0:bd276b1f1249 244 //Try to normalize (/2048) the values so they will match the eCompass output:
Anubus 0:bd276b1f1249 245 float fAccelScaled_x, fAccelScaled_y, fAccelScaled_z;
Anubus 0:bd276b1f1249 246 fAccelScaled_x = (accel_data.x/2048.0);
Anubus 0:bd276b1f1249 247 fAccelScaled_y = (accel_data.y/2048.0);
Anubus 0:bd276b1f1249 248 fAccelScaled_z = (accel_data.z/2048.0);
Anubus 0:bd276b1f1249 249 PRINTF("Acc: X=%2.3f Y=%2.3f Z=%2.3f;\r\n", fAccelScaled_x, fAccelScaled_y, fAccelScaled_z);
Anubus 0:bd276b1f1249 250 sprintf(SENSOR_DATA.AccelX, "%2.3f", fAccelScaled_x);
Anubus 0:bd276b1f1249 251 sprintf(SENSOR_DATA.AccelY, "%2.3f", fAccelScaled_y);
Anubus 0:bd276b1f1249 252 sprintf(SENSOR_DATA.AccelZ, "%2.3f", fAccelScaled_z);
Anubus 0:bd276b1f1249 253 } //bMotionSensor_present
Anubus 0:bd276b1f1249 254 } //Read_motion_sensor()
Anubus 0:bd276b1f1249 255
Anubus 0:bd276b1f1249 256
Anubus 0:bd276b1f1249 257 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 258 //* Read the HTS221 temperature & humidity sensor on the Cellular Shield
Anubus 0:bd276b1f1249 259 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 260 // These are to be built on the fly
Anubus 0:bd276b1f1249 261 string my_temp;
Anubus 0:bd276b1f1249 262 string my_humidity;
Anubus 0:bd276b1f1249 263 HTS221 hts221;
Anubus 0:bd276b1f1249 264
Anubus 0:bd276b1f1249 265 //#define CTOF(x) ((x)*1.8+32)
Anubus 0:bd276b1f1249 266 bool bHTS221_present = false;
Anubus 0:bd276b1f1249 267 void Init_HTS221()
Anubus 0:bd276b1f1249 268 {
Anubus 0:bd276b1f1249 269 int i;
Anubus 0:bd276b1f1249 270 void hts221_init(void);
Anubus 0:bd276b1f1249 271 i = hts221.begin();
Anubus 0:bd276b1f1249 272 if (i)
Anubus 0:bd276b1f1249 273 {
Anubus 0:bd276b1f1249 274 bHTS221_present = true;
Anubus 0:bd276b1f1249 275 PRINTF(BLU "HTS221 Detected (0x%02X)\n\r",i);
Anubus 0:bd276b1f1249 276 PRINTF(" Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
Anubus 0:bd276b1f1249 277 PRINTF(" Humid is: %02d %%\n\r",hts221.readHumidity());
Anubus 0:bd276b1f1249 278 }
Anubus 0:bd276b1f1249 279 else
Anubus 0:bd276b1f1249 280 {
Anubus 0:bd276b1f1249 281 bHTS221_present = false;
Anubus 0:bd276b1f1249 282 PRINTF(RED "HTS221 NOT DETECTED!\n\r");
Anubus 0:bd276b1f1249 283 }
Anubus 0:bd276b1f1249 284 } //Init_HTS221()
Anubus 0:bd276b1f1249 285
Anubus 0:bd276b1f1249 286 void Read_HTS221()
Anubus 0:bd276b1f1249 287 {
Anubus 0:bd276b1f1249 288 if (bHTS221_present)
Anubus 0:bd276b1f1249 289 {
Anubus 0:bd276b1f1249 290 sprintf(SENSOR_DATA.Temperature, "%0.1f", CTOF(hts221.readTemperature()));
Anubus 0:bd276b1f1249 291 PRINTF("HTS221 Temp is: %0.1f F \n\r",CTOF(hts221.readTemperature()));
Anubus 0:bd276b1f1249 292 sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity());
Anubus 0:bd276b1f1249 293 PRINTF("HTS221 Humid is: %02d %%\n\r",hts221.readHumidity());
Anubus 0:bd276b1f1249 294
Anubus 0:bd276b1f1249 295 } //bHTS221_present
Anubus 0:bd276b1f1249 296 } //Read_HTS221()
Anubus 0:bd276b1f1249 297
Anubus 0:bd276b1f1249 298 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 299 //* Read the xadow gps module connedted to i2c1
Anubus 0:bd276b1f1249 300 //********************************************************************************************************************************************
Anubus 0:bd276b1f1249 301
Anubus 0:bd276b1f1249 302 bool bGPS_present = false;
Anubus 0:bd276b1f1249 303 void Init_GPS(void)
Anubus 0:bd276b1f1249 304 {
Anubus 0:bd276b1f1249 305 char scan_id[GPS_SCAN_SIZE+2]; //The first two bytes are the response length (0x00, 0x04)
Anubus 0:bd276b1f1249 306 I2C_WriteSingleByte(GPS_DEVICE_ADDR, GPS_SCAN_ID, true); //no hold, must do read
Anubus 0:bd276b1f1249 307
Anubus 0:bd276b1f1249 308 unsigned char i;
Anubus 0:bd276b1f1249 309 for(i=0;i<(GPS_SCAN_SIZE+2);i++)
Anubus 0:bd276b1f1249 310 {
Anubus 0:bd276b1f1249 311 scan_id[i] = I2C_ReadSingleByte(GPS_DEVICE_ADDR);
Anubus 0:bd276b1f1249 312 }
Anubus 0:bd276b1f1249 313
Anubus 0:bd276b1f1249 314 if(scan_id[5] != GPS_DEVICE_ID)
Anubus 0:bd276b1f1249 315 {
Anubus 0:bd276b1f1249 316 bGPS_present = false;
Anubus 0:bd276b1f1249 317 PRINTF("Xadow GPS not found \r\n");
Anubus 0:bd276b1f1249 318 }
Anubus 0:bd276b1f1249 319 else
Anubus 0:bd276b1f1249 320 {
Anubus 0:bd276b1f1249 321 bGPS_present = true;
Anubus 0:bd276b1f1249 322 PRINTF("Xadow GPS Scan ID response = 0x%02X%02X (length), 0x%02X%02X%02X%02X\r\n", scan_id[0], scan_id[1], scan_id[2], scan_id[3], scan_id[4], scan_id[5]);
Anubus 0:bd276b1f1249 323 char status = gps_get_status();
Anubus 0:bd276b1f1249 324
Anubus 0:bd276b1f1249 325
Anubus 0:bd276b1f1249 326 /* rather not wait for valid GPS before reporting sensors
Anubus 0:bd276b1f1249 327 if ((status != 'A') && (iSensorsToReport == TEMP_HUMIDITY_ACCELEROMETER_GPS))
Anubus 0:bd276b1f1249 328 { //we must wait for GPS to initialize
Anubus 0:bd276b1f1249 329 PRINTF("Waiting for GPS to become ready... ");
Anubus 0:bd276b1f1249 330 while (status != 'A')
Anubus 0:bd276b1f1249 331 {
Anubus 0:bd276b1f1249 332 wait (5.0);
Anubus 0:bd276b1f1249 333 status = gps_get_status();
Anubus 0:bd276b1f1249 334 unsigned char num_satellites = gps_get_sate_in_veiw();
Anubus 0:bd276b1f1249 335 PRINTF("%c%d", status, num_satellites);
Anubus 0:bd276b1f1249 336 }
Anubus 0:bd276b1f1249 337 PRINTF("\r\n");
Anubus 0:bd276b1f1249 338 } //we must wait for GPS to initialize
Anubus 0:bd276b1f1249 339 */
Anubus 0:bd276b1f1249 340
Anubus 0:bd276b1f1249 341 PRINTF("gps_check_online is %d\r\n", gps_check_online());
Anubus 0:bd276b1f1249 342 unsigned char *data;
Anubus 0:bd276b1f1249 343 data = gps_get_utc_date_time();
Anubus 0:bd276b1f1249 344 PRINTF("gps_get_utc_date_time : %d-%d-%d,%d:%d:%d\r\n", data[0], data[1], data[2], data[3], data[4], data[5]);
Anubus 0:bd276b1f1249 345 PRINTF("gps_get_status : %c ('A' = Valid, 'V' = Invalid)\r\n", gps_get_status());
Anubus 0:bd276b1f1249 346 PRINTF("gps_get_latitude : %c:%f\r\n", gps_get_ns(), gps_get_latitude());
Anubus 0:bd276b1f1249 347 PRINTF("gps_get_longitude : %c:%f\r\n", gps_get_ew(), gps_get_longitude());
Anubus 0:bd276b1f1249 348 PRINTF("gps_get_altitude : %f meters\r\n", gps_get_altitude());
Anubus 0:bd276b1f1249 349 PRINTF("gps_get_speed : %f knots\r\n", gps_get_speed());
Anubus 0:bd276b1f1249 350 PRINTF("gps_get_course : %f degrees\r\n", gps_get_course());
Anubus 0:bd276b1f1249 351 PRINTF("gps_get_position_fix : %c\r\n", gps_get_position_fix());
Anubus 0:bd276b1f1249 352 PRINTF("gps_get_sate_in_view : %d satellites\r\n", gps_get_sate_in_veiw());
Anubus 0:bd276b1f1249 353 PRINTF("gps_get_sate_used : %d\r\n", gps_get_sate_used());
Anubus 0:bd276b1f1249 354 PRINTF("gps_get_mode : %c ('A' = Automatic, 'M' = Manual)\r\n", gps_get_mode());
Anubus 0:bd276b1f1249 355 PRINTF("gps_get_mode2 : %c ('1' = no fix, '1' = 2D fix, '3' = 3D fix)\r\n", gps_get_mode2());
Anubus 0:bd276b1f1249 356 } //bool bGPS_present = true
Anubus 0:bd276b1f1249 357 } //Init_GPS()
Anubus 0:bd276b1f1249 358
Anubus 0:bd276b1f1249 359 void Read_GPS()
Anubus 0:bd276b1f1249 360 {
Anubus 0:bd276b1f1249 361 unsigned char gps_satellites = 0; //default
Anubus 0:bd276b1f1249 362 int lat_sign;
Anubus 0:bd276b1f1249 363 int long_sign;
Anubus 0:bd276b1f1249 364 if (bGPS_present)
Anubus 0:bd276b1f1249 365 {
Anubus 0:bd276b1f1249 366 if ((gps_get_status() == 'A') && (gps_get_mode2() != '1'))
Anubus 0:bd276b1f1249 367 {
Anubus 0:bd276b1f1249 368 gps_satellites = gps_get_sate_in_veiw(); //show the number of satellites
Anubus 0:bd276b1f1249 369 }
Anubus 0:bd276b1f1249 370 if (gps_get_ns() == 'S')
Anubus 0:bd276b1f1249 371 {
Anubus 0:bd276b1f1249 372 lat_sign = -1; //negative number
Anubus 0:bd276b1f1249 373 }
Anubus 0:bd276b1f1249 374 else
Anubus 0:bd276b1f1249 375 {
Anubus 0:bd276b1f1249 376 lat_sign = 1;
Anubus 0:bd276b1f1249 377 }
Anubus 0:bd276b1f1249 378 if (gps_get_ew() == 'W')
Anubus 0:bd276b1f1249 379 {
Anubus 0:bd276b1f1249 380 long_sign = -1; //negative number
Anubus 0:bd276b1f1249 381 }
Anubus 0:bd276b1f1249 382 else
Anubus 0:bd276b1f1249 383 {
Anubus 0:bd276b1f1249 384 long_sign = 1;
Anubus 0:bd276b1f1249 385 }
Anubus 0:bd276b1f1249 386 #if (1)
Anubus 0:bd276b1f1249 387 PRINTF("gps_satellites : %d\r\n", gps_satellites);
Anubus 0:bd276b1f1249 388 PRINTF("gps_get_latitude : %f\r\n", (lat_sign * gps_get_latitude()));
Anubus 0:bd276b1f1249 389 PRINTF("gps_get_longitude : %f\r\n", (long_sign * gps_get_longitude()));
Anubus 0:bd276b1f1249 390 PRINTF("gps_get_altitude : %f meters\r\n", gps_get_altitude());
Anubus 0:bd276b1f1249 391 PRINTF("gps_get_speed : %f knots\r\n", gps_get_speed());
Anubus 0:bd276b1f1249 392 PRINTF("gps_get_course : %f degrees\r\n", gps_get_course());
Anubus 0:bd276b1f1249 393 #endif
Anubus 0:bd276b1f1249 394 sprintf(SENSOR_DATA.GPS_Satellites, "%d", gps_satellites);
Anubus 0:bd276b1f1249 395 sprintf(SENSOR_DATA.GPS_Latitude, "%f", (lat_sign * gps_get_latitude()));
Anubus 0:bd276b1f1249 396 sprintf(SENSOR_DATA.GPS_Longitude, "%f", (long_sign * gps_get_longitude()));
Anubus 0:bd276b1f1249 397 sprintf(SENSOR_DATA.GPS_Altitude, "%f", gps_get_altitude());
Anubus 0:bd276b1f1249 398 sprintf(SENSOR_DATA.GPS_Speed, "%f", gps_get_speed());
Anubus 0:bd276b1f1249 399 sprintf(SENSOR_DATA.GPS_Course, "%f", gps_get_course());
Anubus 0:bd276b1f1249 400 } //bGPS_present
Anubus 0:bd276b1f1249 401 } //Read_GPS()
Anubus 0:bd276b1f1249 402
Anubus 0:bd276b1f1249 403
Anubus 0:bd276b1f1249 404 void sensors_init(void)
Anubus 0:bd276b1f1249 405 {
Anubus 0:bd276b1f1249 406 Init_HTS221();
Anubus 0:bd276b1f1249 407 Init_Si7020();
Anubus 0:bd276b1f1249 408 Init_motion_sensor();
Anubus 0:bd276b1f1249 409 Init_GPS();
Anubus 0:bd276b1f1249 410 } //sensors_init
Anubus 0:bd276b1f1249 411
Anubus 0:bd276b1f1249 412 void read_sensors(void)
Anubus 0:bd276b1f1249 413 {
Anubus 0:bd276b1f1249 414 Read_Battery_Volts();
Anubus 0:bd276b1f1249 415 Read_HTS221();
Anubus 0:bd276b1f1249 416 Read_Si7020();
Anubus 0:bd276b1f1249 417 Read_motion_sensor();
Anubus 0:bd276b1f1249 418 Read_GPS();
Anubus 0:bd276b1f1249 419 } //read_sensors