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
sensors.cpp@0:bd276b1f1249, 2017-04-02 (annotated)
- Committer:
- Anubus
- Date:
- Sun Apr 02 12:28:21 2017 +0000
- Revision:
- 0:bd276b1f1249
public version commit
Who changed what in which revision?
User | Revision | Line number | New 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 |