Remote I/O Sensor bus with AT&T flow and M2X cloud

Dependencies:   DHT11 FXOS8700CQ MODSERIAL mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Committer:
agaikwad
Date:
Tue Apr 17 21:29:20 2018 +0000
Revision:
82:4e608375910a
Parent:
77:c65eae5b9958
Remote I/O Sensor bus with AT&T flow and M2X cloud

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkellermavnet 68:6e311c747045 1 /* ===================================================================
fkellermavnet 68:6e311c747045 2 Copyright © 2016, AVNET Inc.
fkellermavnet 68:6e311c747045 3
fkellermavnet 68:6e311c747045 4 Licensed under the Apache License, Version 2.0 (the "License");
fkellermavnet 68:6e311c747045 5 you may not use this file except in compliance with the License.
fkellermavnet 68:6e311c747045 6 You may obtain a copy of the License at
fkellermavnet 68:6e311c747045 7
fkellermavnet 68:6e311c747045 8 http://www.apache.org/licenses/LICENSE-2.0
fkellermavnet 68:6e311c747045 9
fkellermavnet 68:6e311c747045 10 Unless required by applicable law or agreed to in writing,
fkellermavnet 68:6e311c747045 11 software distributed under the License is distributed on an
fkellermavnet 68:6e311c747045 12 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
fkellermavnet 68:6e311c747045 13 either express or implied. See the License for the specific
fkellermavnet 68:6e311c747045 14 language governing permissions and limitations under the License.
fkellermavnet 68:6e311c747045 15
fkellermavnet 68:6e311c747045 16 ======================================================================== */
fkellermavnet 68:6e311c747045 17
stefanrousseau 4:f83bedd9cab4 18 #include "mbed.h"
stefanrousseau 57:d184175b6b03 19 #include "sensors.h"
stefanrousseau 55:3abf9e3f42e6 20 #include "hardware.h"
stefanrousseau 69:5a3414cc7531 21 #include "config_me.h"
stefanrousseau 57:d184175b6b03 22 #include "FXOS8700CQ.h"
stefanrousseau 61:f6b93129f954 23 #include "HTS221.h"
stefanrousseau 69:5a3414cc7531 24 #include "xadow_gps.h"
stefanrousseau 61:f6b93129f954 25 #include <string>
agaikwad 82:4e608375910a 26 #include "DHT.h"
agaikwad 82:4e608375910a 27 #include<stdio.h>
agaikwad 82:4e608375910a 28 #include<math.h>
stefanrousseau 4:f83bedd9cab4 29
stefanrousseau 4:f83bedd9cab4 30 //I2C for pmod sensors:
stefanrousseau 4:f83bedd9cab4 31 #define Si1145_PMOD_I2C_ADDR 0xC0 //this is for 7-bit addr 0x60 for the Si7020
stefanrousseau 4:f83bedd9cab4 32 #define Si7020_PMOD_I2C_ADDR 0x80 //this is for 7-bit addr 0x4 for the Si7020
stefanrousseau 4:f83bedd9cab4 33
agaikwad 82:4e608375910a 34 //for light code
agaikwad 82:4e608375910a 35 I2C akash(PTE25,PTE24);
agaikwad 82:4e608375910a 36 const int addr = 0x88;
agaikwad 82:4e608375910a 37 // light code end
agaikwad 82:4e608375910a 38
agaikwad 82:4e608375910a 39 //DHT code
agaikwad 82:4e608375910a 40 DHT sensor(PTC10,DHT11);
agaikwad 82:4e608375910a 41
agaikwad 82:4e608375910a 42
agaikwad 82:4e608375910a 43 //For Ammeter and Voltmeter
agaikwad 82:4e608375910a 44 SPI SPI_Bus(PTC6,PTC7,PTC5); // (MOSI MISO CLK)setup SPI interface
agaikwad 82:4e608375910a 45 DigitalOut SPI_CS_AMM(PTC8);
agaikwad 82:4e608375910a 46 DigitalOut SPI_CS_VOLT(PTC9);
agaikwad 82:4e608375910a 47
agaikwad 82:4e608375910a 48
agaikwad 82:4e608375910a 49
agaikwad 82:4e608375910a 50 float Amm_Out = 0;
agaikwad 82:4e608375910a 51 float Volt_Out = 0;
agaikwad 82:4e608375910a 52 int SPI_High_byte = 0;
agaikwad 82:4e608375910a 53 int SPI_Low_byte = 0;
agaikwad 82:4e608375910a 54 float Temp_f_1 = 0.00;
agaikwad 82:4e608375910a 55 float Temp_f_2 = 0.00;
agaikwad 82:4e608375910a 56 int Temp_i_1 = 0;
agaikwad 82:4e608375910a 57 int Temp_i_2 = 0;
agaikwad 82:4e608375910a 58 int Temp_i_3 = 0;
agaikwad 82:4e608375910a 59 int Temp_i_4 = 0;
agaikwad 82:4e608375910a 60 char I2C_Cmd[3];
agaikwad 82:4e608375910a 61
stefanrousseau 57:d184175b6b03 62 // Storage for the data from the motion sensor
stefanrousseau 4:f83bedd9cab4 63 SRAWDATA accel_data;
stefanrousseau 4:f83bedd9cab4 64 SRAWDATA magn_data;
stefanrousseau 4:f83bedd9cab4 65 //InterruptIn fxos_int1(PTC6); // unused, common with SW2 on FRDM-K64F
stefanrousseau 4:f83bedd9cab4 66 InterruptIn fxos_int2(PTC13); // should just be the Data-Ready interrupt
stefanrousseau 4:f83bedd9cab4 67 bool fxos_int2_triggered = false;
stefanrousseau 4:f83bedd9cab4 68 void trigger_fxos_int2(void)
stefanrousseau 4:f83bedd9cab4 69 {
stefanrousseau 4:f83bedd9cab4 70 fxos_int2_triggered = true;
stefanrousseau 57:d184175b6b03 71
stefanrousseau 4:f83bedd9cab4 72 }
stefanrousseau 4:f83bedd9cab4 73
stefanrousseau 4:f83bedd9cab4 74 /*------------------------------------------------------------------------------
stefanrousseau 4:f83bedd9cab4 75 * Perform I2C single read.
stefanrousseau 4:f83bedd9cab4 76 *------------------------------------------------------------------------------*/
stefanrousseau 4:f83bedd9cab4 77 unsigned char I2C_ReadSingleByte(unsigned char ucDeviceAddress)
stefanrousseau 4:f83bedd9cab4 78 {
stefanrousseau 4:f83bedd9cab4 79 char rxbuffer [1];
stefanrousseau 11:e6602513730f 80 i2c.read(ucDeviceAddress, rxbuffer, 1 );
stefanrousseau 4:f83bedd9cab4 81 return (unsigned char)rxbuffer[0];
stefanrousseau 4:f83bedd9cab4 82 } //I2C_ReadSingleByte()
stefanrousseau 4:f83bedd9cab4 83
stefanrousseau 4:f83bedd9cab4 84 /*------------------------------------------------------------------------------
stefanrousseau 4:f83bedd9cab4 85 * Perform I2C single read from address.
stefanrousseau 4:f83bedd9cab4 86 *------------------------------------------------------------------------------*/
stefanrousseau 4:f83bedd9cab4 87 unsigned char I2C_ReadSingleByteFromAddr(unsigned char ucDeviceAddress, unsigned char Addr)
stefanrousseau 4:f83bedd9cab4 88 {
stefanrousseau 4:f83bedd9cab4 89 char txbuffer [1];
stefanrousseau 4:f83bedd9cab4 90 char rxbuffer [1];
stefanrousseau 4:f83bedd9cab4 91 txbuffer[0] = (char)Addr;
stefanrousseau 11:e6602513730f 92 i2c.write(ucDeviceAddress, txbuffer, 1 );
stefanrousseau 11:e6602513730f 93 i2c.read(ucDeviceAddress, rxbuffer, 1 );
stefanrousseau 4:f83bedd9cab4 94 return (unsigned char)rxbuffer[0];
stefanrousseau 4:f83bedd9cab4 95 } //I2C_ReadSingleByteFromAddr()
stefanrousseau 4:f83bedd9cab4 96
stefanrousseau 4:f83bedd9cab4 97 /*------------------------------------------------------------------------------
stefanrousseau 4:f83bedd9cab4 98 * Perform I2C read of more than 1 byte.
stefanrousseau 4:f83bedd9cab4 99 *------------------------------------------------------------------------------*/
stefanrousseau 4:f83bedd9cab4 100 int I2C_ReadMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength)
stefanrousseau 4:f83bedd9cab4 101 {
stefanrousseau 4:f83bedd9cab4 102 int status;
stefanrousseau 11:e6602513730f 103 status = i2c.read(ucDeviceAddress, ucData, ucLength);
stefanrousseau 4:f83bedd9cab4 104 return status;
stefanrousseau 4:f83bedd9cab4 105 } //I2C_ReadMultipleBytes()
stefanrousseau 4:f83bedd9cab4 106
stefanrousseau 4:f83bedd9cab4 107 /*------------------------------------------------------------------------------
stefanrousseau 4:f83bedd9cab4 108 * Perform I2C write of a single byte.
stefanrousseau 4:f83bedd9cab4 109 *------------------------------------------------------------------------------*/
stefanrousseau 4:f83bedd9cab4 110 int I2C_WriteSingleByte(unsigned char ucDeviceAddress, unsigned char Data, bool bSendStop)
stefanrousseau 4:f83bedd9cab4 111 {
stefanrousseau 4:f83bedd9cab4 112 int status;
stefanrousseau 4:f83bedd9cab4 113 char txbuffer [1];
stefanrousseau 4:f83bedd9cab4 114 txbuffer[0] = (char)Data; //data
stefanrousseau 11:e6602513730f 115 status = i2c.write(ucDeviceAddress, txbuffer, 1, !bSendStop); //true: do not send stop
stefanrousseau 4:f83bedd9cab4 116 return status;
stefanrousseau 4:f83bedd9cab4 117 } //I2C_WriteSingleByte()
stefanrousseau 4:f83bedd9cab4 118
stefanrousseau 4:f83bedd9cab4 119 /*------------------------------------------------------------------------------
stefanrousseau 4:f83bedd9cab4 120 * Perform I2C write of 1 byte to an address.
stefanrousseau 4:f83bedd9cab4 121 *------------------------------------------------------------------------------*/
stefanrousseau 4:f83bedd9cab4 122 int I2C_WriteSingleByteToAddr(unsigned char ucDeviceAddress, unsigned char Addr, unsigned char Data, bool bSendStop)
stefanrousseau 4:f83bedd9cab4 123 {
stefanrousseau 4:f83bedd9cab4 124 int status;
stefanrousseau 4:f83bedd9cab4 125 char txbuffer [2];
stefanrousseau 4:f83bedd9cab4 126 txbuffer[0] = (char)Addr; //address
stefanrousseau 4:f83bedd9cab4 127 txbuffer[1] = (char)Data; //data
stefanrousseau 11:e6602513730f 128 //status = i2c.write(ucDeviceAddress, txbuffer, 2, false); //stop at end
stefanrousseau 11:e6602513730f 129 status = i2c.write(ucDeviceAddress, txbuffer, 2, !bSendStop); //true: do not send stop
stefanrousseau 4:f83bedd9cab4 130 return status;
stefanrousseau 4:f83bedd9cab4 131 } //I2C_WriteSingleByteToAddr()
stefanrousseau 4:f83bedd9cab4 132
stefanrousseau 4:f83bedd9cab4 133 /*------------------------------------------------------------------------------
stefanrousseau 4:f83bedd9cab4 134 * Perform I2C write of more than 1 byte.
stefanrousseau 4:f83bedd9cab4 135 *------------------------------------------------------------------------------*/
stefanrousseau 4:f83bedd9cab4 136 int I2C_WriteMultipleBytes(unsigned char ucDeviceAddress, char *ucData, unsigned char ucLength, bool bSendStop)
stefanrousseau 4:f83bedd9cab4 137 {
stefanrousseau 4:f83bedd9cab4 138 int status;
stefanrousseau 11:e6602513730f 139 status = i2c.write(ucDeviceAddress, ucData, ucLength, !bSendStop); //true: do not send stop
stefanrousseau 4:f83bedd9cab4 140 return status;
stefanrousseau 4:f83bedd9cab4 141 } //I2C_WriteMultipleBytes()
stefanrousseau 4:f83bedd9cab4 142
stefanrousseau 4:f83bedd9cab4 143 bool bSi7020_present = false;
stefanrousseau 4:f83bedd9cab4 144 void Init_Si7020(void)
stefanrousseau 4:f83bedd9cab4 145 {
stefanrousseau 4:f83bedd9cab4 146 char SN_7020 [8];
stefanrousseau 4:f83bedd9cab4 147 //SN part 1:
stefanrousseau 4:f83bedd9cab4 148 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFA, 0x0F, false);
stefanrousseau 4:f83bedd9cab4 149 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[0], 4);
stefanrousseau 4:f83bedd9cab4 150
stefanrousseau 4:f83bedd9cab4 151 //SN part 1:
stefanrousseau 4:f83bedd9cab4 152 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0xFC, 0xC9, false);
stefanrousseau 4:f83bedd9cab4 153 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &SN_7020[4], 4);
stefanrousseau 4:f83bedd9cab4 154
stefanrousseau 4:f83bedd9cab4 155 char Ver_7020 [2];
stefanrousseau 4:f83bedd9cab4 156 //FW version:
stefanrousseau 4:f83bedd9cab4 157 I2C_WriteSingleByteToAddr(Si7020_PMOD_I2C_ADDR, 0x84, 0xB8, false);
stefanrousseau 4:f83bedd9cab4 158 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Ver_7020[0], 2);
stefanrousseau 4:f83bedd9cab4 159
stefanrousseau 4:f83bedd9cab4 160 if (SN_7020[4] != 0x14)
stefanrousseau 4:f83bedd9cab4 161 {
stefanrousseau 4:f83bedd9cab4 162 bSi7020_present = false;
fkellermavnet 77:c65eae5b9958 163 PRINTF("Si7020 sensor not found\r\n");
stefanrousseau 4:f83bedd9cab4 164 }
stefanrousseau 4:f83bedd9cab4 165 else
stefanrousseau 4:f83bedd9cab4 166 {
stefanrousseau 4:f83bedd9cab4 167 bSi7020_present = true;
stefanrousseau 64:09004cd610df 168 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]);
stefanrousseau 64:09004cd610df 169 PRINTF("Si7020 Version# = 0x%02X\n", Ver_7020[0]);
stefanrousseau 4:f83bedd9cab4 170 } //bool bSi7020_present = true
stefanrousseau 4:f83bedd9cab4 171
stefanrousseau 4:f83bedd9cab4 172 } //Init_Si7020()
stefanrousseau 4:f83bedd9cab4 173
stefanrousseau 4:f83bedd9cab4 174 void Read_Si7020(void)
stefanrousseau 4:f83bedd9cab4 175 {
stefanrousseau 4:f83bedd9cab4 176 if (bSi7020_present)
stefanrousseau 4:f83bedd9cab4 177 {
stefanrousseau 4:f83bedd9cab4 178 char Humidity [2];
stefanrousseau 4:f83bedd9cab4 179 char Temperature [2];
stefanrousseau 4:f83bedd9cab4 180 //Command to measure humidity (temperature also gets measured):
stefanrousseau 4:f83bedd9cab4 181 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xF5, false); //no hold, must do dummy read
stefanrousseau 4:f83bedd9cab4 182 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 1); //dummy read, should get an nack until it is done
stefanrousseau 4:f83bedd9cab4 183 wait (0.05); //wait for measurement. Can also keep reading until no NACK is received
stefanrousseau 4:f83bedd9cab4 184 //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...
stefanrousseau 4:f83bedd9cab4 185 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Humidity[0], 2); //read humidity
stefanrousseau 64:09004cd610df 186 //PRINTF("Read Si7020 Humidity = 0x%02X%02X\n", Humidity[0], Humidity[1]);
stefanrousseau 4:f83bedd9cab4 187 int rh_code = (Humidity[0] << 8) + Humidity[1];
stefanrousseau 4:f83bedd9cab4 188 float fRh = (125.0*rh_code/65536.0) - 6.0; //from datasheet
stefanrousseau 64:09004cd610df 189 //PRINTF("Si7020 Humidity = %*.*f %%\n", 4, 2, fRh); //double % sign for escape //PRINTF("%*.*f\n", myFieldWidth, myPrecision, myFloatValue);
stefanrousseau 4:f83bedd9cab4 190 sprintf(SENSOR_DATA.Humidity_Si7020, "%0.2f", fRh);
stefanrousseau 4:f83bedd9cab4 191
stefanrousseau 4:f83bedd9cab4 192 //Command to read temperature when humidity is already done:
stefanrousseau 4:f83bedd9cab4 193 I2C_WriteSingleByte(Si7020_PMOD_I2C_ADDR, 0xE0, false);
stefanrousseau 4:f83bedd9cab4 194 I2C_ReadMultipleBytes(Si7020_PMOD_I2C_ADDR, &Temperature[0], 2); //read temperature
stefanrousseau 64:09004cd610df 195 //PRINTF("Read Si7020 Temperature = 0x%02X%02X\n", Temperature[0], Temperature[1]);
stefanrousseau 4:f83bedd9cab4 196 int temp_code = (Temperature[0] << 8) + Temperature[1];
stefanrousseau 4:f83bedd9cab4 197 float fTemp = (175.72*temp_code/65536.0) - 46.85; //from datasheet in Celcius
stefanrousseau 64:09004cd610df 198 //PRINTF("Si7020 Temperature = %*.*f deg C\n", 4, 2, fTemp);
stefanrousseau 4:f83bedd9cab4 199 sprintf(SENSOR_DATA.Temperature_Si7020, "%0.2f", fTemp);
stefanrousseau 4:f83bedd9cab4 200 } //bool bSi7020_present = true
stefanrousseau 4:f83bedd9cab4 201
stefanrousseau 4:f83bedd9cab4 202 } //Read_Si7020()
stefanrousseau 4:f83bedd9cab4 203
stefanrousseau 4:f83bedd9cab4 204 /*------------------------------------------------------------------------------
stefanrousseau 4:f83bedd9cab4 205 * The following are aliases so that the Si1145 coding examples can be used as-is.
stefanrousseau 4:f83bedd9cab4 206 *------------------------------------------------------------------------------*/
stefanrousseau 4:f83bedd9cab4 207 unsigned char ReadFrom_Si1145_Register(unsigned char reg) //returns byte from I2C Register 'reg'
stefanrousseau 4:f83bedd9cab4 208 {
stefanrousseau 4:f83bedd9cab4 209 unsigned char result = I2C_ReadSingleByteFromAddr(Si1145_PMOD_I2C_ADDR, reg);
stefanrousseau 4:f83bedd9cab4 210 return (result);
stefanrousseau 4:f83bedd9cab4 211 } //ReadFrom_Si1145_Register()
stefanrousseau 4:f83bedd9cab4 212
stefanrousseau 4:f83bedd9cab4 213 void WriteTo_Si1145_Register(unsigned char reg, unsigned char value) //writes 'value' into I2C Register reg'
stefanrousseau 4:f83bedd9cab4 214 {
stefanrousseau 4:f83bedd9cab4 215 I2C_WriteSingleByteToAddr(Si1145_PMOD_I2C_ADDR, reg, value, true);
stefanrousseau 4:f83bedd9cab4 216 } //WriteTo_Si1145_Register()
stefanrousseau 4:f83bedd9cab4 217
stefanrousseau 4:f83bedd9cab4 218 #define REG_PARAM_WR 0x17
stefanrousseau 4:f83bedd9cab4 219 #define REG_PARAM_RD 0x2E
stefanrousseau 4:f83bedd9cab4 220 #define REG_COMMAND 0x18
stefanrousseau 4:f83bedd9cab4 221 #define REG_RESPONSE 0x20
stefanrousseau 4:f83bedd9cab4 222 #define REG_HW_KEY 0x07
stefanrousseau 4:f83bedd9cab4 223 #define HW_KEY_VAL0 0x17
stefanrousseau 4:f83bedd9cab4 224 #define REG_MEAS_RATE_LSB 0x08
stefanrousseau 4:f83bedd9cab4 225 #define REG_MEAS_RATE_MSB 0x09
stefanrousseau 4:f83bedd9cab4 226 #define REG_PS_LED21 0x0F
stefanrousseau 4:f83bedd9cab4 227 #define REG_PS_LED3 0x10
stefanrousseau 4:f83bedd9cab4 228 #define MAX_LED_CURRENT 0xF
stefanrousseau 4:f83bedd9cab4 229 #define PARAM_CH_LIST 0x01
stefanrousseau 4:f83bedd9cab4 230 #define REG_ALS_VIS_DATA0 0x22
stefanrousseau 4:f83bedd9cab4 231 #define REG_ALS_VIS_DATA1 0x23
stefanrousseau 4:f83bedd9cab4 232 #define REG_ALS_IR_DATA0 0x24
stefanrousseau 4:f83bedd9cab4 233 #define REG_ALS_IR_DATA1 0x25
stefanrousseau 4:f83bedd9cab4 234 #define REG_PS1_DATA0 0x26
stefanrousseau 4:f83bedd9cab4 235 #define REG_PS1_DATA1 0x27
stefanrousseau 4:f83bedd9cab4 236 #define REG_PS2_DATA0 0x28
stefanrousseau 4:f83bedd9cab4 237 #define REG_PS2_DATA1 0x29
stefanrousseau 4:f83bedd9cab4 238 #define REG_PS3_DATA0 0x2A
stefanrousseau 4:f83bedd9cab4 239 #define REG_PS3_DATA1 0x2B
stefanrousseau 4:f83bedd9cab4 240 #define REG_UVINDEX0 0x2C
stefanrousseau 4:f83bedd9cab4 241 #define REG_UVINDEX1 0x2D
stefanrousseau 4:f83bedd9cab4 242 int Si1145_ParamSet(unsigned char address, unsigned char value) //writes 'value' into Parameter 'address'
stefanrousseau 4:f83bedd9cab4 243 {
stefanrousseau 4:f83bedd9cab4 244 char txbuffer [3];
stefanrousseau 4:f83bedd9cab4 245 txbuffer[0] = (char)REG_PARAM_WR; //destination
stefanrousseau 4:f83bedd9cab4 246 txbuffer[1] = (char)value;
stefanrousseau 4:f83bedd9cab4 247 txbuffer[2] = (char)(0xA0 + (address & 0x1F));
stefanrousseau 4:f83bedd9cab4 248 int retval;
stefanrousseau 4:f83bedd9cab4 249 //if((retval = _waitUntilSleep(si114x_handle))!=0) return retval;
stefanrousseau 4:f83bedd9cab4 250 retval = I2C_WriteMultipleBytes(Si1145_PMOD_I2C_ADDR, &txbuffer[0], 3, true);
stefanrousseau 4:f83bedd9cab4 251 if(retval!=0) return retval;
stefanrousseau 4:f83bedd9cab4 252 while(1)
stefanrousseau 4:f83bedd9cab4 253 {
stefanrousseau 4:f83bedd9cab4 254 retval=ReadFrom_Si1145_Register(REG_PARAM_RD);
stefanrousseau 4:f83bedd9cab4 255 if (retval==value) break;
stefanrousseau 4:f83bedd9cab4 256 }
stefanrousseau 4:f83bedd9cab4 257 return (0);
stefanrousseau 4:f83bedd9cab4 258 } //Si1145_ParamSet()
stefanrousseau 4:f83bedd9cab4 259
stefanrousseau 4:f83bedd9cab4 260 void PsAlsForce(void) //equivalent to WriteTo_Si1145_Register(REG_COMMAND,0x07). This forces PS and ALS measurements
stefanrousseau 4:f83bedd9cab4 261 {
stefanrousseau 4:f83bedd9cab4 262 WriteTo_Si1145_Register(REG_COMMAND,0x07);
stefanrousseau 4:f83bedd9cab4 263 } //PsAlsForce()
stefanrousseau 4:f83bedd9cab4 264
stefanrousseau 4:f83bedd9cab4 265 bool bSi1145_present = false;
stefanrousseau 4:f83bedd9cab4 266 void Init_Si1145(void)
stefanrousseau 4:f83bedd9cab4 267 {
stefanrousseau 4:f83bedd9cab4 268 unsigned char readbyte;
stefanrousseau 4:f83bedd9cab4 269 //Read Si1145 part ID:
stefanrousseau 4:f83bedd9cab4 270 readbyte = ReadFrom_Si1145_Register(0x00);
stefanrousseau 4:f83bedd9cab4 271 if (readbyte != 0x45)
stefanrousseau 4:f83bedd9cab4 272 {
stefanrousseau 4:f83bedd9cab4 273 bSi1145_present = false;
fkellermavnet 77:c65eae5b9958 274 PRINTF("Si1145 sensor not found\r\n");
stefanrousseau 4:f83bedd9cab4 275 }
stefanrousseau 4:f83bedd9cab4 276 else
stefanrousseau 4:f83bedd9cab4 277 {
stefanrousseau 4:f83bedd9cab4 278 bSi1145_present = true;
stefanrousseau 64:09004cd610df 279 PRINTF("Si1145 Part ID : 0x%02X\n", readbyte);
stefanrousseau 4:f83bedd9cab4 280 //Initialize Si1145 by writing to HW_KEY (I2C Register 0x07 = 0x17)
stefanrousseau 4:f83bedd9cab4 281 WriteTo_Si1145_Register(REG_HW_KEY, HW_KEY_VAL0);
stefanrousseau 4:f83bedd9cab4 282
stefanrousseau 4:f83bedd9cab4 283 // Initialize LED Current
stefanrousseau 4:f83bedd9cab4 284 // I2C Register 0x0F = 0xFF
stefanrousseau 4:f83bedd9cab4 285 // I2C Register 0x10 = 0x0F
stefanrousseau 4:f83bedd9cab4 286 WriteTo_Si1145_Register(REG_PS_LED21,(MAX_LED_CURRENT<<4) + MAX_LED_CURRENT);
stefanrousseau 4:f83bedd9cab4 287 WriteTo_Si1145_Register(REG_PS_LED3, MAX_LED_CURRENT);
stefanrousseau 4:f83bedd9cab4 288
stefanrousseau 4:f83bedd9cab4 289 // Parameter 0x01 = 0x37
stefanrousseau 4:f83bedd9cab4 290 //Si1145_ParamSet(PARAM_CH_LIST, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK);
stefanrousseau 4:f83bedd9cab4 291 //Si1145_ParamSet(0x01, 0x37); //CHLIST is address 0x01 in the parameter RAM. It defines which sensors are enabled (here, some)
stefanrousseau 4:f83bedd9cab4 292 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...)
stefanrousseau 4:f83bedd9cab4 293 // 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...
stefanrousseau 4:f83bedd9cab4 294 PsAlsForce(); // can also be written as WriteTo_Si1145_Register(REG_COMMAND,0x07);
stefanrousseau 4:f83bedd9cab4 295 WriteTo_Si1145_Register(REG_COMMAND, 0x0F);//command to put it into auto mode
stefanrousseau 4:f83bedd9cab4 296 //Set MES_RATE to 0x1000. I.e. the device will automatically wake up every 16 * 256* 31.25 us = 0.128 seconds to measure
stefanrousseau 4:f83bedd9cab4 297 WriteTo_Si1145_Register(REG_MEAS_RATE_LSB, 0x00);
stefanrousseau 4:f83bedd9cab4 298 WriteTo_Si1145_Register(REG_MEAS_RATE_MSB, 0x10);
stefanrousseau 4:f83bedd9cab4 299 } //bSi1145_present = true
stefanrousseau 4:f83bedd9cab4 300 } //Init_Si1145()
stefanrousseau 4:f83bedd9cab4 301
stefanrousseau 4:f83bedd9cab4 302 void Read_Si1145(void)
stefanrousseau 4:f83bedd9cab4 303 {
stefanrousseau 4:f83bedd9cab4 304 if (bSi1145_present)
stefanrousseau 4:f83bedd9cab4 305 {
stefanrousseau 4:f83bedd9cab4 306 // Once the measurements are completed, here is how to reconstruct them
stefanrousseau 4:f83bedd9cab4 307 // Note very carefully that 16-bit registers are in the 'Little Endian' byte order
stefanrousseau 4:f83bedd9cab4 308 // It may be more efficient to perform block I2C Reads, but this example shows
stefanrousseau 4:f83bedd9cab4 309 // individual reads of registers
stefanrousseau 4:f83bedd9cab4 310
stefanrousseau 4:f83bedd9cab4 311 int PS1 = ReadFrom_Si1145_Register(REG_PS1_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS1_DATA1);
stefanrousseau 4:f83bedd9cab4 312 int PS2 = ReadFrom_Si1145_Register(REG_PS2_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS2_DATA1);
stefanrousseau 4:f83bedd9cab4 313 int PS3 = ReadFrom_Si1145_Register(REG_PS3_DATA0) + 256 * ReadFrom_Si1145_Register(REG_PS3_DATA1);
stefanrousseau 64:09004cd610df 314 //PRINTF("PS1_Data = %d\n", PS1);
stefanrousseau 64:09004cd610df 315 //PRINTF("PS2_Data = %d\n", PS2);
stefanrousseau 64:09004cd610df 316 //PRINTF("PS3_Data = %d\n", PS3);
stefanrousseau 4:f83bedd9cab4 317 //OBJECT PRESENT?
stefanrousseau 57:d184175b6b03 318 #if (0)
stefanrousseau 4:f83bedd9cab4 319 if(PS1 < 22000){
stefanrousseau 64:09004cd610df 320 //PRINTF("Object Far\n");
stefanrousseau 57:d184175b6b03 321 sprintf(SENSOR_DATA.Proximity, "Object Far\0");
stefanrousseau 4:f83bedd9cab4 322 }
stefanrousseau 4:f83bedd9cab4 323 else if(PS1 < 24000)
stefanrousseau 4:f83bedd9cab4 324 {
stefanrousseau 64:09004cd610df 325 //PRINTF("Object in Vicinity\n");
stefanrousseau 57:d184175b6b03 326 sprintf(SENSOR_DATA.Proximity, "Object in Vicinity\0");
stefanrousseau 4:f83bedd9cab4 327 }
stefanrousseau 4:f83bedd9cab4 328 else if (PS1 < 30000)
stefanrousseau 4:f83bedd9cab4 329 {
stefanrousseau 64:09004cd610df 330 //PRINTF("Object Near\n");
stefanrousseau 57:d184175b6b03 331 sprintf(SENSOR_DATA.Proximity, "Object Near\0");
stefanrousseau 4:f83bedd9cab4 332 }
stefanrousseau 4:f83bedd9cab4 333 else
stefanrousseau 4:f83bedd9cab4 334 {
stefanrousseau 64:09004cd610df 335 //PRINTF("Object Very Near\n");
stefanrousseau 57:d184175b6b03 336 sprintf(SENSOR_DATA.Proximity, "Object Very Near\0");
stefanrousseau 4:f83bedd9cab4 337 }
stefanrousseau 57:d184175b6b03 338 #else
stefanrousseau 57:d184175b6b03 339 sprintf(SENSOR_DATA.Proximity, "%d\0", PS1);
stefanrousseau 57:d184175b6b03 340 #endif
stefanrousseau 4:f83bedd9cab4 341
stefanrousseau 4:f83bedd9cab4 342 //Force ALS read:
stefanrousseau 4:f83bedd9cab4 343 //WriteTo_Si1145_Register(REG_COMMAND, 0x06);
stefanrousseau 4:f83bedd9cab4 344 //wait (0.1);
stefanrousseau 4:f83bedd9cab4 345 int ALS_VIS = ReadFrom_Si1145_Register(REG_ALS_VIS_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_VIS_DATA1);
stefanrousseau 4:f83bedd9cab4 346 int ALS_IR = ReadFrom_Si1145_Register(REG_ALS_IR_DATA0) + 256 * ReadFrom_Si1145_Register(REG_ALS_IR_DATA1);
stefanrousseau 4:f83bedd9cab4 347 int UV_INDEX = ReadFrom_Si1145_Register(REG_UVINDEX0) + 256 * ReadFrom_Si1145_Register(REG_UVINDEX1);
stefanrousseau 64:09004cd610df 348 //PRINTF("ALS_VIS_Data = %d\n", ALS_VIS);
stefanrousseau 64:09004cd610df 349 //PRINTF("ALS_IR_Data = %d\n", ALS_IR);
stefanrousseau 64:09004cd610df 350 //PRINTF("UV_INDEX_Data = %d\n", UV_INDEX);
stefanrousseau 4:f83bedd9cab4 351
stefanrousseau 64:09004cd610df 352 //PRINTF("Ambient Light Visible Sensor = %d\n", ALS_VIS);
stefanrousseau 4:f83bedd9cab4 353 sprintf(SENSOR_DATA.AmbientLightVis, "%d", ALS_VIS);
stefanrousseau 64:09004cd610df 354 //PRINTF("Ambient Light Infrared Sensor = %d\n", ALS_IR);
stefanrousseau 4:f83bedd9cab4 355 sprintf(SENSOR_DATA.AmbientLightIr, "%d", ALS_IR);
stefanrousseau 4:f83bedd9cab4 356 //float fUV_value = (UV_INDEX -50.0)/10000.0;
stefanrousseau 4:f83bedd9cab4 357 float fUV_value = (UV_INDEX)/100.0; //this is the aux reading
stefanrousseau 64:09004cd610df 358 //PRINTF("UV_Data = %0.2f\n", fUV_value);
stefanrousseau 4:f83bedd9cab4 359 sprintf(SENSOR_DATA.UVindex, "%0.2f", fUV_value);
stefanrousseau 4:f83bedd9cab4 360 } //bSi1145_present = true
stefanrousseau 4:f83bedd9cab4 361 } //Read_Si1145()
stefanrousseau 4:f83bedd9cab4 362
stefanrousseau 4:f83bedd9cab4 363 //********************************************************************************************************************************************
stefanrousseau 4:f83bedd9cab4 364 //* Read the FXOS8700CQ - 6-axis combo Sensor Accelerometer and Magnetometer
stefanrousseau 4:f83bedd9cab4 365 //********************************************************************************************************************************************
stefanrousseau 11:e6602513730f 366 bool bMotionSensor_present = false;
stefanrousseau 61:f6b93129f954 367 void Init_motion_sensor()
stefanrousseau 4:f83bedd9cab4 368 {
stefanrousseau 57:d184175b6b03 369 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
stefanrousseau 57:d184175b6b03 370 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
stefanrousseau 57:d184175b6b03 371 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
stefanrousseau 11:e6602513730f 372 int iWhoAmI = fxos.get_whoami();
stefanrousseau 57:d184175b6b03 373
stefanrousseau 64:09004cd610df 374 PRINTF("FXOS8700CQ WhoAmI = %X\r\n", iWhoAmI);
stefanrousseau 4:f83bedd9cab4 375 // Iterrupt for active-low interrupt line from FXOS
stefanrousseau 4:f83bedd9cab4 376 // Configured with only one interrupt on INT2 signaling Data-Ready
stefanrousseau 4:f83bedd9cab4 377 //fxos_int2.fall(&trigger_fxos_int2);
stefanrousseau 11:e6602513730f 378 if (iWhoAmI != 0xC7)
stefanrousseau 11:e6602513730f 379 {
stefanrousseau 11:e6602513730f 380 bMotionSensor_present = false;
fkellermavnet 77:c65eae5b9958 381 PRINTF("FXOS8700CQ motion sensor not found\r\n");
stefanrousseau 11:e6602513730f 382 }
stefanrousseau 11:e6602513730f 383 else
stefanrousseau 11:e6602513730f 384 {
stefanrousseau 11:e6602513730f 385 bMotionSensor_present = true;
stefanrousseau 11:e6602513730f 386 fxos.enable();
stefanrousseau 11:e6602513730f 387 }
stefanrousseau 61:f6b93129f954 388 } //Init_motion_sensor()
stefanrousseau 4:f83bedd9cab4 389
stefanrousseau 61:f6b93129f954 390 void Read_motion_sensor()
stefanrousseau 11:e6602513730f 391 {
stefanrousseau 57:d184175b6b03 392 // Note: this class is instantiated here because if it is statically declared, the cellular shield init kills the I2C bus...
stefanrousseau 57:d184175b6b03 393 // Class instantiation with pin names for the motion sensor on the FRDM-K64F board:
stefanrousseau 57:d184175b6b03 394 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
stefanrousseau 11:e6602513730f 395 if (bMotionSensor_present)
stefanrousseau 11:e6602513730f 396 {
stefanrousseau 57:d184175b6b03 397 fxos.enable();
stefanrousseau 11:e6602513730f 398 fxos.get_data(&accel_data, &magn_data);
stefanrousseau 64:09004cd610df 399 //PRINTF("Roll=%5d, Pitch=%5d, Yaw=%5d;\r\n", magn_data.x, magn_data.y, magn_data.z);
stefanrousseau 11:e6602513730f 400 sprintf(SENSOR_DATA.MagnetometerX, "%5d", magn_data.x);
stefanrousseau 11:e6602513730f 401 sprintf(SENSOR_DATA.MagnetometerY, "%5d", magn_data.y);
stefanrousseau 11:e6602513730f 402 sprintf(SENSOR_DATA.MagnetometerZ, "%5d", magn_data.z);
stefanrousseau 11:e6602513730f 403
stefanrousseau 11:e6602513730f 404 //Try to normalize (/2048) the values so they will match the eCompass output:
stefanrousseau 11:e6602513730f 405 float fAccelScaled_x, fAccelScaled_y, fAccelScaled_z;
stefanrousseau 11:e6602513730f 406 fAccelScaled_x = (accel_data.x/2048.0);
stefanrousseau 11:e6602513730f 407 fAccelScaled_y = (accel_data.y/2048.0);
stefanrousseau 11:e6602513730f 408 fAccelScaled_z = (accel_data.z/2048.0);
stefanrousseau 64:09004cd610df 409 //PRINTF("Acc: X=%2.3f Y=%2.3f Z=%2.3f;\r\n", fAccelScaled_x, fAccelScaled_y, fAccelScaled_z);
stefanrousseau 11:e6602513730f 410 sprintf(SENSOR_DATA.AccelX, "%2.3f", fAccelScaled_x);
stefanrousseau 11:e6602513730f 411 sprintf(SENSOR_DATA.AccelY, "%2.3f", fAccelScaled_y);
stefanrousseau 11:e6602513730f 412 sprintf(SENSOR_DATA.AccelZ, "%2.3f", fAccelScaled_z);
stefanrousseau 11:e6602513730f 413 } //bMotionSensor_present
stefanrousseau 61:f6b93129f954 414 } //Read_motion_sensor()
stefanrousseau 61:f6b93129f954 415
stefanrousseau 61:f6b93129f954 416
stefanrousseau 61:f6b93129f954 417 //********************************************************************************************************************************************
stefanrousseau 61:f6b93129f954 418 //* Read the HTS221 temperature & humidity sensor on the Cellular Shield
stefanrousseau 61:f6b93129f954 419 //********************************************************************************************************************************************
stefanrousseau 61:f6b93129f954 420 // These are to be built on the fly
stefanrousseau 61:f6b93129f954 421 string my_temp;
stefanrousseau 61:f6b93129f954 422 string my_humidity;
stefanrousseau 61:f6b93129f954 423 HTS221 hts221;
stefanrousseau 11:e6602513730f 424
stefanrousseau 61:f6b93129f954 425 #define CTOF(x) ((x)*1.8+32)
stefanrousseau 61:f6b93129f954 426 bool bHTS221_present = false;
stefanrousseau 61:f6b93129f954 427 void Init_HTS221()
stefanrousseau 61:f6b93129f954 428 {
stefanrousseau 61:f6b93129f954 429 int i;
stefanrousseau 61:f6b93129f954 430 void hts221_init(void);
stefanrousseau 61:f6b93129f954 431 i = hts221.begin();
stefanrousseau 61:f6b93129f954 432 if (i)
stefanrousseau 61:f6b93129f954 433 {
stefanrousseau 61:f6b93129f954 434 bHTS221_present = true;
stefanrousseau 64:09004cd610df 435 PRINTF(BLU "HTS221 Detected (0x%02X)\n\r",i);
stefanrousseau 64:09004cd610df 436 PRINTF(" Temp is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
stefanrousseau 64:09004cd610df 437 PRINTF(" Humid is: %02d %%\n\r",hts221.readHumidity());
stefanrousseau 61:f6b93129f954 438 }
stefanrousseau 61:f6b93129f954 439 else
stefanrousseau 61:f6b93129f954 440 {
stefanrousseau 61:f6b93129f954 441 bHTS221_present = false;
stefanrousseau 64:09004cd610df 442 PRINTF(RED "HTS221 NOT DETECTED!\n\r");
stefanrousseau 61:f6b93129f954 443 }
stefanrousseau 61:f6b93129f954 444 } //Init_HTS221()
stefanrousseau 61:f6b93129f954 445
agaikwad 82:4e608375910a 446 void Read_temp_humid()
agaikwad 82:4e608375910a 447 {
agaikwad 82:4e608375910a 448 int error = 0;
agaikwad 82:4e608375910a 449 float h = 0.0f, c = 0.0f, f = 0.0f, k = 0.0f, dp = 0.0f, dpf = 0.0f;
agaikwad 82:4e608375910a 450
agaikwad 82:4e608375910a 451
agaikwad 82:4e608375910a 452 wait(2.0f);
agaikwad 82:4e608375910a 453 error = sensor.readData();
agaikwad 82:4e608375910a 454 PRINTF("Error: %d\n", error);
agaikwad 82:4e608375910a 455 if (0 == error) {
agaikwad 82:4e608375910a 456 c = sensor.ReadTemperature(CELCIUS);
agaikwad 82:4e608375910a 457 f = sensor.ReadTemperature(FARENHEIT);
agaikwad 82:4e608375910a 458 k = sensor.ReadTemperature(KELVIN);
agaikwad 82:4e608375910a 459 h = sensor.ReadHumidity();
agaikwad 82:4e608375910a 460 dp = sensor.CalcdewPoint(c, h);
agaikwad 82:4e608375910a 461 dpf = sensor.CalcdewPointFast(c, h);
agaikwad 82:4e608375910a 462 PRINTF("Temperature in Celcius is %4.2f \n\r", c);
agaikwad 82:4e608375910a 463 PRINTF("Humidity is %4.2f\n\r", h);
agaikwad 82:4e608375910a 464
agaikwad 82:4e608375910a 465 sprintf(SENSOR_DATA.Temperature, "%.2f", f);
agaikwad 82:4e608375910a 466 sprintf(SENSOR_DATA.Humidity, "%.2f", h);
agaikwad 82:4e608375910a 467
agaikwad 82:4e608375910a 468 } else {
agaikwad 82:4e608375910a 469 PRINTF("Error: %d\n", error);
agaikwad 82:4e608375910a 470 }
agaikwad 82:4e608375910a 471
agaikwad 82:4e608375910a 472 }
agaikwad 82:4e608375910a 473
agaikwad 82:4e608375910a 474
agaikwad 82:4e608375910a 475 //Read_Ammeter
agaikwad 82:4e608375910a 476
agaikwad 82:4e608375910a 477 void Read_Ammeter()
agaikwad 82:4e608375910a 478 {
agaikwad 82:4e608375910a 479 SPI_High_byte = 0;
agaikwad 82:4e608375910a 480 SPI_Low_byte = 0;
agaikwad 82:4e608375910a 481 Temp_f_1 = 0.00;
agaikwad 82:4e608375910a 482 Temp_f_2 = 0.00;
agaikwad 82:4e608375910a 483 Temp_i_1 = 0;
agaikwad 82:4e608375910a 484 Temp_i_2 = 0;
agaikwad 82:4e608375910a 485 Temp_i_3 = 0;
agaikwad 82:4e608375910a 486 I2C_Cmd[0] = 0;
agaikwad 82:4e608375910a 487 I2C_Cmd[1] = 0;
agaikwad 82:4e608375910a 488 I2C_Cmd[2] = 0;
agaikwad 82:4e608375910a 489
agaikwad 82:4e608375910a 490
agaikwad 82:4e608375910a 491 SPI_CS_AMM = 0;
agaikwad 82:4e608375910a 492
agaikwad 82:4e608375910a 493 SPI_High_byte = SPI_Bus.write(0);
agaikwad 82:4e608375910a 494 SPI_Low_byte = SPI_Bus.write(0);
agaikwad 82:4e608375910a 495
agaikwad 82:4e608375910a 496 SPI_CS_AMM = 1;
agaikwad 82:4e608375910a 497
agaikwad 82:4e608375910a 498 Temp_f_1 = (( SPI_High_byte & 0x1F ) << 7 ) | (( SPI_Low_byte >> 1 ));
agaikwad 82:4e608375910a 499
agaikwad 82:4e608375910a 500 Temp_f_2= (float)(( Temp_f_1 * 1.00 ) / 4096.00 ); // Converting to volts
agaikwad 82:4e608375910a 501
agaikwad 82:4e608375910a 502 Amm_Out = (float)(( Temp_f_2 - 0.50 ) * 1000.00);
agaikwad 82:4e608375910a 503
agaikwad 82:4e608375910a 504
agaikwad 82:4e608375910a 505 //FRDM_UART_Debug.printf("Current value = %f mA\r\n", Amm_Out);
agaikwad 82:4e608375910a 506 PRINTF("Current value = %f mA\r\n", Amm_Out);
agaikwad 82:4e608375910a 507 sprintf(SENSOR_DATA.Ammeter, "%0.2f", Amm_Out);
agaikwad 82:4e608375910a 508
agaikwad 82:4e608375910a 509 wait_ms(100);
agaikwad 82:4e608375910a 510 }
agaikwad 82:4e608375910a 511
agaikwad 82:4e608375910a 512
agaikwad 82:4e608375910a 513
agaikwad 82:4e608375910a 514 void Read_Voltmeter()
agaikwad 82:4e608375910a 515 {
agaikwad 82:4e608375910a 516 /*SPI_High_byte = 0;
agaikwad 82:4e608375910a 517 SPI_Low_byte = 0;
agaikwad 82:4e608375910a 518 Temp_f_1 = 0.00;
agaikwad 82:4e608375910a 519 Temp_f_2 = 0.00;
agaikwad 82:4e608375910a 520 Temp_i_1 = 0;
agaikwad 82:4e608375910a 521 Temp_i_2 = 0;
agaikwad 82:4e608375910a 522 Temp_i_3 = 0;
agaikwad 82:4e608375910a 523 I2C_Cmd[0] = 0;
agaikwad 82:4e608375910a 524 I2C_Cmd[1] = 0;
agaikwad 82:4e608375910a 525 I2C_Cmd[2] = 0;
agaikwad 82:4e608375910a 526
agaikwad 82:4e608375910a 527
agaikwad 82:4e608375910a 528 SPI_CS_VOLT = 0;
agaikwad 82:4e608375910a 529
agaikwad 82:4e608375910a 530 SPI_High_byte = SPI_Bus.write(0);
agaikwad 82:4e608375910a 531 SPI_Low_byte = SPI_Bus.write(0);
agaikwad 82:4e608375910a 532
agaikwad 82:4e608375910a 533 SPI_CS_VOLT = 1;
agaikwad 82:4e608375910a 534
agaikwad 82:4e608375910a 535 Temp_f_1 = ((SPI_High_byte & 0x1f) << 7) | ((SPI_Low_byte >> 1));
agaikwad 82:4e608375910a 536
agaikwad 82:4e608375910a 537 Temp_f_2 = (float)((Temp_f_1 * 33.3405) / 4096); // show value in volts.
agaikwad 82:4e608375910a 538
agaikwad 82:4e608375910a 539 Volt_Out = (float)(Temp_f_2 - 16.5)*2;
agaikwad 82:4e608375910a 540
agaikwad 82:4e608375910a 541
agaikwad 82:4e608375910a 542 PRINTF("Voltage value = %f V\r\n", Volt_Out);
agaikwad 82:4e608375910a 543 sprintf(SENSOR_DATA.Voltmeter, "%0.2f", Volt_Out);
agaikwad 82:4e608375910a 544 wait_ms(100); */
agaikwad 82:4e608375910a 545
agaikwad 82:4e608375910a 546
agaikwad 82:4e608375910a 547
agaikwad 82:4e608375910a 548 SPI_CS_VOLT=0;
agaikwad 82:4e608375910a 549 //spi.write();
agaikwad 82:4e608375910a 550 //pc.printf("%d\r\n",k);
agaikwad 82:4e608375910a 551 int high_byte = SPI_Bus.write(0);
agaikwad 82:4e608375910a 552 int low_byte = SPI_Bus.write(0);
agaikwad 82:4e608375910a 553 SPI_CS_VOLT=1;
agaikwad 82:4e608375910a 554
agaikwad 82:4e608375910a 555 float x = ((high_byte & 0x1f) << 7) | ((low_byte >> 1));
agaikwad 82:4e608375910a 556 pc.printf("x= %f \r\n", x);
agaikwad 82:4e608375910a 557
agaikwad 82:4e608375910a 558 float r= (float)((x * 33.3405) / 4096); // show value in volts.
agaikwad 82:4e608375910a 559 float Volt_Out = (float)(r - 16.5)*2;
agaikwad 82:4e608375910a 560
agaikwad 82:4e608375910a 561 PRINTF("Voltage value = %f V\r\n", Volt_Out);
agaikwad 82:4e608375910a 562 sprintf(SENSOR_DATA.Voltmeter, "%0.2f", Volt_Out);
agaikwad 82:4e608375910a 563
agaikwad 82:4e608375910a 564
agaikwad 82:4e608375910a 565
agaikwad 82:4e608375910a 566
agaikwad 82:4e608375910a 567
agaikwad 82:4e608375910a 568 }
agaikwad 82:4e608375910a 569
agaikwad 82:4e608375910a 570
agaikwad 82:4e608375910a 571
agaikwad 82:4e608375910a 572 //Read_light Code Start
agaikwad 82:4e608375910a 573
agaikwad 82:4e608375910a 574 void Read_light()
agaikwad 82:4e608375910a 575 {
agaikwad 82:4e608375910a 576
agaikwad 82:4e608375910a 577 // light code
agaikwad 82:4e608375910a 578 int exp,exp1,l=1;
agaikwad 82:4e608375910a 579 float z;
agaikwad 82:4e608375910a 580 float x;
agaikwad 82:4e608375910a 581
agaikwad 82:4e608375910a 582 akash.frequency(100000); // set required i2c frequency
agaikwad 82:4e608375910a 583 //pc.baud(9600); //set baud rate
agaikwad 82:4e608375910a 584 // pc.printf("I2C started!\r\n");
agaikwad 82:4e608375910a 585 char cmd[3]; //for byte transfer
agaikwad 82:4e608375910a 586
agaikwad 82:4e608375910a 587 //ambient light sensor code
agaikwad 82:4e608375910a 588 cmd[0] = 0x01; //configuration register
agaikwad 82:4e608375910a 589 cmd[1]= 0xCC; //configuration data
agaikwad 82:4e608375910a 590 cmd[2]= 0x01; //configuration data
agaikwad 82:4e608375910a 591 akash.write(addr, cmd, 3);
agaikwad 82:4e608375910a 592 cmd[0] = 0x00; // data register
agaikwad 82:4e608375910a 593 akash.write(addr, cmd, 1);
agaikwad 82:4e608375910a 594 wait(0.5);
agaikwad 82:4e608375910a 595 akash.read(addr, cmd, 2);
agaikwad 82:4e608375910a 596
agaikwad 82:4e608375910a 597 exp= cmd[0]>>4;
agaikwad 82:4e608375910a 598 exp1= (cmd[0]-(exp<<4))*256+cmd[1];
agaikwad 82:4e608375910a 599 l=1;
agaikwad 82:4e608375910a 600 for(int r=0;r<exp;r++){l=l*2;};
agaikwad 82:4e608375910a 601 z= (exp1*l)/100;
agaikwad 82:4e608375910a 602 //pc.printf("Lux = %.2f\n\r", z); // printing LUX value
agaikwad 82:4e608375910a 603
agaikwad 82:4e608375910a 604 sprintf(SENSOR_DATA.Light, "%.2f", z);
agaikwad 82:4e608375910a 605
agaikwad 82:4e608375910a 606 /*
agaikwad 82:4e608375910a 607
agaikwad 82:4e608375910a 608 //sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature()));
agaikwad 82:4e608375910a 609 sprintf(SENSOR_DATA.Temperature, "36.33");
agaikwad 82:4e608375910a 610 //sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity());
agaikwad 82:4e608375910a 611 sprintf(SENSOR_DATA.Humidity, "99");
agaikwad 82:4e608375910a 612 */
agaikwad 82:4e608375910a 613
agaikwad 82:4e608375910a 614 } //Read_light()
agaikwad 82:4e608375910a 615
agaikwad 82:4e608375910a 616
agaikwad 82:4e608375910a 617 //Read_light Code Start
agaikwad 82:4e608375910a 618
agaikwad 82:4e608375910a 619
stefanrousseau 61:f6b93129f954 620 void Read_HTS221()
stefanrousseau 61:f6b93129f954 621 {
agaikwad 82:4e608375910a 622
agaikwad 82:4e608375910a 623
stefanrousseau 61:f6b93129f954 624 } //Read_HTS221()
stefanrousseau 55:3abf9e3f42e6 625
stefanrousseau 69:5a3414cc7531 626 bool bGPS_present = false;
stefanrousseau 69:5a3414cc7531 627 void Init_GPS(void)
stefanrousseau 69:5a3414cc7531 628 {
stefanrousseau 69:5a3414cc7531 629 char scan_id[GPS_SCAN_SIZE+2]; //The first two bytes are the response length (0x00, 0x04)
stefanrousseau 71:45a5e426df81 630 I2C_WriteSingleByte(GPS_DEVICE_ADDR, GPS_SCAN_ID, true); //no hold, must do read
stefanrousseau 69:5a3414cc7531 631
stefanrousseau 69:5a3414cc7531 632 unsigned char i;
stefanrousseau 69:5a3414cc7531 633 for(i=0;i<(GPS_SCAN_SIZE+2);i++)
stefanrousseau 69:5a3414cc7531 634 {
stefanrousseau 69:5a3414cc7531 635 scan_id[i] = I2C_ReadSingleByte(GPS_DEVICE_ADDR);
stefanrousseau 69:5a3414cc7531 636 }
stefanrousseau 69:5a3414cc7531 637
stefanrousseau 69:5a3414cc7531 638 if(scan_id[5] != GPS_DEVICE_ID)
stefanrousseau 69:5a3414cc7531 639 {
stefanrousseau 69:5a3414cc7531 640 bGPS_present = false;
stefanrousseau 69:5a3414cc7531 641 PRINTF("Xadow GPS not found\n");
stefanrousseau 69:5a3414cc7531 642 }
stefanrousseau 69:5a3414cc7531 643 else
stefanrousseau 69:5a3414cc7531 644 {
stefanrousseau 69:5a3414cc7531 645 bGPS_present = true;
stefanrousseau 69:5a3414cc7531 646 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]);
stefanrousseau 69:5a3414cc7531 647 char status = gps_get_status();
stefanrousseau 70:24d5800f27be 648 if ((status != 'A') && (iSensorsToReport == TEMP_HUMIDITY_ACCELEROMETER_GPS))
stefanrousseau 69:5a3414cc7531 649 { //we must wait for GPS to initialize
stefanrousseau 69:5a3414cc7531 650 PRINTF("Waiting for GPS to become ready... ");
stefanrousseau 69:5a3414cc7531 651 while (status != 'A')
stefanrousseau 69:5a3414cc7531 652 {
stefanrousseau 69:5a3414cc7531 653 wait (5.0);
stefanrousseau 70:24d5800f27be 654 status = gps_get_status();
stefanrousseau 69:5a3414cc7531 655 unsigned char num_satellites = gps_get_sate_in_veiw();
stefanrousseau 69:5a3414cc7531 656 PRINTF("%c%d", status, num_satellites);
stefanrousseau 69:5a3414cc7531 657 }
stefanrousseau 69:5a3414cc7531 658 PRINTF("\r\n");
stefanrousseau 69:5a3414cc7531 659 } //we must wait for GPS to initialize
stefanrousseau 69:5a3414cc7531 660 PRINTF("gps_check_online is %d\r\n", gps_check_online());
stefanrousseau 69:5a3414cc7531 661 unsigned char *data;
stefanrousseau 69:5a3414cc7531 662 data = gps_get_utc_date_time();
stefanrousseau 69:5a3414cc7531 663 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]);
stefanrousseau 69:5a3414cc7531 664 PRINTF("gps_get_status : %c ('A' = Valid, 'V' = Invalid)\r\n", gps_get_status());
stefanrousseau 69:5a3414cc7531 665 PRINTF("gps_get_latitude : %c:%f\r\n", gps_get_ns(), gps_get_latitude());
stefanrousseau 69:5a3414cc7531 666 PRINTF("gps_get_longitude : %c:%f\r\n", gps_get_ew(), gps_get_longitude());
stefanrousseau 69:5a3414cc7531 667 PRINTF("gps_get_altitude : %f meters\r\n", gps_get_altitude());
stefanrousseau 69:5a3414cc7531 668 PRINTF("gps_get_speed : %f knots\r\n", gps_get_speed());
stefanrousseau 69:5a3414cc7531 669 PRINTF("gps_get_course : %f degrees\r\n", gps_get_course());
stefanrousseau 69:5a3414cc7531 670 PRINTF("gps_get_position_fix : %c\r\n", gps_get_position_fix());
stefanrousseau 69:5a3414cc7531 671 PRINTF("gps_get_sate_in_view : %d satellites\r\n", gps_get_sate_in_veiw());
stefanrousseau 69:5a3414cc7531 672 PRINTF("gps_get_sate_used : %d\r\n", gps_get_sate_used());
stefanrousseau 69:5a3414cc7531 673 PRINTF("gps_get_mode : %c ('A' = Automatic, 'M' = Manual)\r\n", gps_get_mode());
stefanrousseau 69:5a3414cc7531 674 PRINTF("gps_get_mode2 : %c ('1' = no fix, '1' = 2D fix, '3' = 3D fix)\r\n", gps_get_mode2());
stefanrousseau 69:5a3414cc7531 675 } //bool bGPS_present = true
stefanrousseau 69:5a3414cc7531 676 } //Init_GPS()
stefanrousseau 69:5a3414cc7531 677
stefanrousseau 69:5a3414cc7531 678 void Read_GPS()
stefanrousseau 69:5a3414cc7531 679 {
stefanrousseau 72:b500e1507b5f 680 unsigned char gps_satellites = 0; //default
stefanrousseau 71:45a5e426df81 681 int lat_sign;
stefanrousseau 71:45a5e426df81 682 int long_sign;
stefanrousseau 69:5a3414cc7531 683 if (bGPS_present)
stefanrousseau 69:5a3414cc7531 684 {
stefanrousseau 69:5a3414cc7531 685 if ((gps_get_status() == 'A') && (gps_get_mode2() != '1'))
stefanrousseau 69:5a3414cc7531 686 {
stefanrousseau 72:b500e1507b5f 687 gps_satellites = gps_get_sate_in_veiw(); //show the number of satellites
stefanrousseau 69:5a3414cc7531 688 }
stefanrousseau 70:24d5800f27be 689 if (gps_get_ns() == 'S')
stefanrousseau 70:24d5800f27be 690 {
stefanrousseau 71:45a5e426df81 691 lat_sign = -1; //negative number
stefanrousseau 71:45a5e426df81 692 }
stefanrousseau 71:45a5e426df81 693 else
stefanrousseau 71:45a5e426df81 694 {
stefanrousseau 71:45a5e426df81 695 lat_sign = 1;
stefanrousseau 71:45a5e426df81 696 }
stefanrousseau 71:45a5e426df81 697 if (gps_get_ew() == 'W')
stefanrousseau 71:45a5e426df81 698 {
stefanrousseau 71:45a5e426df81 699 long_sign = -1; //negative number
stefanrousseau 70:24d5800f27be 700 }
stefanrousseau 70:24d5800f27be 701 else
stefanrousseau 70:24d5800f27be 702 {
stefanrousseau 71:45a5e426df81 703 long_sign = 1;
stefanrousseau 70:24d5800f27be 704 }
stefanrousseau 71:45a5e426df81 705 #if (0)
stefanrousseau 72:b500e1507b5f 706 PRINTF("gps_satellites : %d\r\n", gps_satellites);
stefanrousseau 71:45a5e426df81 707 PRINTF("gps_get_latitude : %f\r\n", (lat_sign * gps_get_latitude()));
stefanrousseau 71:45a5e426df81 708 PRINTF("gps_get_longitude : %f\r\n", (long_sign * gps_get_longitude()));
stefanrousseau 69:5a3414cc7531 709 PRINTF("gps_get_altitude : %f meters\r\n", gps_get_altitude());
stefanrousseau 69:5a3414cc7531 710 PRINTF("gps_get_speed : %f knots\r\n", gps_get_speed());
stefanrousseau 69:5a3414cc7531 711 PRINTF("gps_get_course : %f degrees\r\n", gps_get_course());
stefanrousseau 71:45a5e426df81 712 #endif
stefanrousseau 72:b500e1507b5f 713 sprintf(SENSOR_DATA.GPS_Satellites, "%d", gps_satellites);
stefanrousseau 71:45a5e426df81 714 sprintf(SENSOR_DATA.GPS_Latitude, "%f", (lat_sign * gps_get_latitude()));
stefanrousseau 71:45a5e426df81 715 sprintf(SENSOR_DATA.GPS_Longitude, "%f", (long_sign * gps_get_longitude()));
stefanrousseau 71:45a5e426df81 716 sprintf(SENSOR_DATA.GPS_Altitude, "%f", gps_get_altitude());
stefanrousseau 71:45a5e426df81 717 sprintf(SENSOR_DATA.GPS_Speed, "%f", gps_get_speed());
stefanrousseau 71:45a5e426df81 718 sprintf(SENSOR_DATA.GPS_Course, "%f", gps_get_course());
stefanrousseau 69:5a3414cc7531 719 } //bGPS_present
stefanrousseau 69:5a3414cc7531 720 } //Read_GPS()
stefanrousseau 69:5a3414cc7531 721
stefanrousseau 55:3abf9e3f42e6 722 #ifdef USE_VIRTUAL_SENSORS
stefanrousseau 55:3abf9e3f42e6 723 bool bUsbConnected = false;
stefanrousseau 55:3abf9e3f42e6 724 volatile uint8_t usb_uart_rx_buff[256];
stefanrousseau 55:3abf9e3f42e6 725 //volatile uint8_t usb_uart_tx_buff[256];
stefanrousseau 55:3abf9e3f42e6 726 volatile unsigned char usb_uart_rx_buff_putptr = 0;
stefanrousseau 55:3abf9e3f42e6 727 volatile unsigned char usb_uart_rx_buff_getptr = 0;
stefanrousseau 55:3abf9e3f42e6 728 //volatile unsigned char usb_uart_tx_buff_putptr = 0;
stefanrousseau 55:3abf9e3f42e6 729 //volatile unsigned char usb_uart_tx_buff_getptr = 0;
stefanrousseau 55:3abf9e3f42e6 730 char usbhost_rx_string[256];
stefanrousseau 55:3abf9e3f42e6 731 unsigned char usbhost_rxstring_index;
stefanrousseau 55:3abf9e3f42e6 732 char usbhost_tx_string[256];
stefanrousseau 55:3abf9e3f42e6 733
stefanrousseau 55:3abf9e3f42e6 734
stefanrousseau 55:3abf9e3f42e6 735 float f_sensor1_value = 12.3;
stefanrousseau 55:3abf9e3f42e6 736 float f_sensor2_value = 45.6;
stefanrousseau 55:3abf9e3f42e6 737 float f_sensor3_value = 78.9;
stefanrousseau 55:3abf9e3f42e6 738 float f_sensor4_value = 78.9;
stefanrousseau 55:3abf9e3f42e6 739 float f_sensor5_value = 78.9;
stefanrousseau 55:3abf9e3f42e6 740 float f_sensor6_value = 78.9;
stefanrousseau 55:3abf9e3f42e6 741 float f_sensor7_value = 78.9;
stefanrousseau 55:3abf9e3f42e6 742 float f_sensor8_value = 78.9;
stefanrousseau 55:3abf9e3f42e6 743 char usb_sensor_string[110];
stefanrousseau 55:3abf9e3f42e6 744
stefanrousseau 55:3abf9e3f42e6 745
stefanrousseau 55:3abf9e3f42e6 746 //********************************************************************************************************************************************
stefanrousseau 55:3abf9e3f42e6 747 //* Parse the input sensor data from the USB host
stefanrousseau 55:3abf9e3f42e6 748 //********************************************************************************************************************************************
stefanrousseau 55:3abf9e3f42e6 749 int parse_usbhost_message()
stefanrousseau 55:3abf9e3f42e6 750 {
stefanrousseau 64:09004cd610df 751 //PRINTF("String = %s\n", usbhost_rx_string); //test
stefanrousseau 55:3abf9e3f42e6 752 uint8_t length;
stefanrousseau 55:3abf9e3f42e6 753 uint8_t x ;
stefanrousseau 55:3abf9e3f42e6 754 //It seems that sscanf needs 11 characters to store a 7-character number. There must be some formatting and termination values...
stefanrousseau 55:3abf9e3f42e6 755 char Record[8][11]; //There are 8 sensors with up to 7 characters each
stefanrousseau 55:3abf9e3f42e6 756 char StringRecord[110]; //There are is a sensor "string" with up to 100 characters in it
stefanrousseau 55:3abf9e3f42e6 757
stefanrousseau 55:3abf9e3f42e6 758 // Data format is: "S1:1234,S2:5678,S3:1234,S4:5678,S5:1234,S6:5678,S7:5678,S8:5678,S9:abcde...\n"
stefanrousseau 55:3abf9e3f42e6 759 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);
stefanrousseau 55:3abf9e3f42e6 760
stefanrousseau 55:3abf9e3f42e6 761 //StringRecord[109] = '\0';
stefanrousseau 64:09004cd610df 762 //PRINTF("Last = %s\n", StringRecord); //test
stefanrousseau 55:3abf9e3f42e6 763
stefanrousseau 55:3abf9e3f42e6 764 if (args_assigned == 9)
stefanrousseau 55:3abf9e3f42e6 765 { //sscanf was able to assign all 9 values
stefanrousseau 55:3abf9e3f42e6 766 for (x=0; x < 8; x++) // loop through the 8 sensors
stefanrousseau 55:3abf9e3f42e6 767 {
stefanrousseau 55:3abf9e3f42e6 768 // Strip the "Sx:" label characters from the field value
stefanrousseau 55:3abf9e3f42e6 769 length = strlen(Record[x]); // max of 7 characters but could be less
stefanrousseau 55:3abf9e3f42e6 770 strncpy(Record[x], Record[x] + 3, length);
stefanrousseau 55:3abf9e3f42e6 771 Record[x][length] = '\0'; // null termination character manually added
stefanrousseau 55:3abf9e3f42e6 772 }
stefanrousseau 55:3abf9e3f42e6 773 length = strlen(StringRecord);
stefanrousseau 55:3abf9e3f42e6 774 strncpy(StringRecord, StringRecord + 3, length);
stefanrousseau 55:3abf9e3f42e6 775 StringRecord[length] = '\0'; // null termination character manually added
stefanrousseau 55:3abf9e3f42e6 776
stefanrousseau 55:3abf9e3f42e6 777 if ((usbhost_rx_string[0] == 'S') && (usbhost_rx_string[1] == '1')) //The message starts with "S1"
stefanrousseau 55:3abf9e3f42e6 778 {
stefanrousseau 55:3abf9e3f42e6 779 f_sensor1_value = atof(Record[0]);
stefanrousseau 55:3abf9e3f42e6 780 f_sensor2_value = atof(Record[1]);
stefanrousseau 55:3abf9e3f42e6 781 f_sensor3_value = atof(Record[2]);
stefanrousseau 55:3abf9e3f42e6 782 f_sensor4_value = atof(Record[3]);
stefanrousseau 55:3abf9e3f42e6 783 f_sensor5_value = atof(Record[4]);
stefanrousseau 55:3abf9e3f42e6 784 f_sensor6_value = atof(Record[5]);
stefanrousseau 55:3abf9e3f42e6 785 f_sensor7_value = atof(Record[6]);
stefanrousseau 55:3abf9e3f42e6 786 f_sensor8_value = atof(Record[7]);
stefanrousseau 55:3abf9e3f42e6 787 sprintf(usb_sensor_string,StringRecord);
stefanrousseau 64:09004cd610df 788 //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
stefanrousseau 55:3abf9e3f42e6 789 sprintf(SENSOR_DATA.Virtual_Sensor1, "%s", Record[0]);
stefanrousseau 55:3abf9e3f42e6 790 sprintf(SENSOR_DATA.Virtual_Sensor2, "%s", Record[1]);
stefanrousseau 55:3abf9e3f42e6 791 sprintf(SENSOR_DATA.Virtual_Sensor3, "%s", Record[2]);
stefanrousseau 55:3abf9e3f42e6 792 sprintf(SENSOR_DATA.Virtual_Sensor4, "%s", Record[3]);
stefanrousseau 55:3abf9e3f42e6 793 sprintf(SENSOR_DATA.Virtual_Sensor5, "%s", Record[4]);
stefanrousseau 55:3abf9e3f42e6 794 sprintf(SENSOR_DATA.Virtual_Sensor6, "%s", Record[5]);
stefanrousseau 55:3abf9e3f42e6 795 sprintf(SENSOR_DATA.Virtual_Sensor7, "%s", Record[6]);
stefanrousseau 55:3abf9e3f42e6 796 sprintf(SENSOR_DATA.Virtual_Sensor8, "%s", Record[7]);
stefanrousseau 55:3abf9e3f42e6 797 }
stefanrousseau 55:3abf9e3f42e6 798 } //sscanf was able to assign all values
stefanrousseau 55:3abf9e3f42e6 799 return args_assigned;
stefanrousseau 55:3abf9e3f42e6 800 } //parse_usbhost_message()
stefanrousseau 55:3abf9e3f42e6 801
stefanrousseau 55:3abf9e3f42e6 802 //********************************************************************************************************************************************
stefanrousseau 55:3abf9e3f42e6 803 //* Process any received message from the USB host
stefanrousseau 55:3abf9e3f42e6 804 //********************************************************************************************************************************************
stefanrousseau 55:3abf9e3f42e6 805 void process_usb_rx(unsigned char ucNewRxByte)
stefanrousseau 55:3abf9e3f42e6 806 {
stefanrousseau 55:3abf9e3f42e6 807 if (ucNewRxByte == '?')
stefanrousseau 55:3abf9e3f42e6 808 { //just pinging
stefanrousseau 55:3abf9e3f42e6 809 usbhost_rxstring_index = 0;
stefanrousseau 55:3abf9e3f42e6 810 return;
stefanrousseau 55:3abf9e3f42e6 811 } //just pinging
stefanrousseau 55:3abf9e3f42e6 812 usbhost_rx_string[usbhost_rxstring_index++] = ucNewRxByte;
stefanrousseau 55:3abf9e3f42e6 813 if (ucNewRxByte == '\n')
stefanrousseau 55:3abf9e3f42e6 814 { //end of message
stefanrousseau 55:3abf9e3f42e6 815 usbhost_rx_string[usbhost_rxstring_index] = 0; //null terminate string
stefanrousseau 55:3abf9e3f42e6 816 usbhost_rxstring_index = 0;
stefanrousseau 55:3abf9e3f42e6 817 parse_usbhost_message();
stefanrousseau 55:3abf9e3f42e6 818 } //end of message
stefanrousseau 55:3abf9e3f42e6 819 } //process_usb_rx()
stefanrousseau 55:3abf9e3f42e6 820
stefanrousseau 55:3abf9e3f42e6 821 void ProcessUsbInterface(void)
stefanrousseau 55:3abf9e3f42e6 822 {
stefanrousseau 55:3abf9e3f42e6 823 //Process the USB host UART receive commands:
stefanrousseau 55:3abf9e3f42e6 824 if (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
stefanrousseau 55:3abf9e3f42e6 825 {
stefanrousseau 55:3abf9e3f42e6 826 bUsbConnected = true;
stefanrousseau 55:3abf9e3f42e6 827 while (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
stefanrousseau 55:3abf9e3f42e6 828 {
stefanrousseau 55:3abf9e3f42e6 829 unsigned char ucByteFromHost = usb_uart_rx_buff[usb_uart_rx_buff_getptr++]; //Copy latest received byte
stefanrousseau 55:3abf9e3f42e6 830 process_usb_rx(ucByteFromHost);
stefanrousseau 55:3abf9e3f42e6 831 } //while (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
stefanrousseau 55:3abf9e3f42e6 832 } // if there are USB UART bytes to receive
stefanrousseau 55:3abf9e3f42e6 833 //USB host UART transmit:
stefanrousseau 55:3abf9e3f42e6 834 //while (usb_uart_tx_buff_getptr != usb_uart_tx_buff_putptr)
stefanrousseau 55:3abf9e3f42e6 835 //{
stefanrousseau 55:3abf9e3f42e6 836 //pc.putc(usb_uart_tx_buff[usb_uart_tx_buff_getptr++]);
stefanrousseau 55:3abf9e3f42e6 837 //}
stefanrousseau 55:3abf9e3f42e6 838 } //ProcessUsbInterface()
stefanrousseau 55:3abf9e3f42e6 839
stefanrousseau 56:cb42ff383dab 840 // This function is called when a character goes into the RX buffer.
stefanrousseau 56:cb42ff383dab 841 void UsbUartRxCallback(MODSERIAL_IRQ_INFO *info)
stefanrousseau 55:3abf9e3f42e6 842 {
stefanrousseau 56:cb42ff383dab 843 // Get the pointer to our MODSERIAL object that invoked this callback.
stefanrousseau 56:cb42ff383dab 844 MODSERIAL *pc = info->serial;
stefanrousseau 56:cb42ff383dab 845 while (pc->readable())
stefanrousseau 56:cb42ff383dab 846 {
stefanrousseau 56:cb42ff383dab 847 usb_uart_rx_buff[usb_uart_rx_buff_putptr++] = pc->getcNb();
stefanrousseau 56:cb42ff383dab 848 }
stefanrousseau 55:3abf9e3f42e6 849 }
stefanrousseau 55:3abf9e3f42e6 850 #endif
stefanrousseau 55:3abf9e3f42e6 851
stefanrousseau 4:f83bedd9cab4 852 void sensors_init(void)
stefanrousseau 4:f83bedd9cab4 853 {
stefanrousseau 55:3abf9e3f42e6 854 #ifdef USE_VIRTUAL_SENSORS
stefanrousseau 56:cb42ff383dab 855 pc.attach(&UsbUartRxCallback, MODSERIAL::RxIrq);
stefanrousseau 55:3abf9e3f42e6 856 #endif
agaikwad 82:4e608375910a 857 //Init_HTS221();
agaikwad 82:4e608375910a 858 //Init_Si7020();
agaikwad 82:4e608375910a 859 // Init_Si1145();
agaikwad 82:4e608375910a 860 //Init_motion_sensor();
agaikwad 82:4e608375910a 861 // Init_GPS();
stefanrousseau 4:f83bedd9cab4 862 } //sensors_init
stefanrousseau 4:f83bedd9cab4 863
stefanrousseau 4:f83bedd9cab4 864 void read_sensors(void)
stefanrousseau 4:f83bedd9cab4 865 {
agaikwad 82:4e608375910a 866 Read_light();
agaikwad 82:4e608375910a 867 Read_temp_humid();
agaikwad 82:4e608375910a 868 Read_Ammeter();
agaikwad 82:4e608375910a 869 Read_Voltmeter();
agaikwad 82:4e608375910a 870
agaikwad 82:4e608375910a 871 //Read_HTS221();
agaikwad 82:4e608375910a 872 //Read_Si7020();
agaikwad 82:4e608375910a 873 //Read_Si1145();
agaikwad 82:4e608375910a 874 //Read_motion_sensor();
agaikwad 82:4e608375910a 875 //Read_GPS();
stefanrousseau 4:f83bedd9cab4 876 } //read_sensors