This program simply connects to a HTS221 I2C device to proximity sensor

Dependencies:   FXOS8700CQ mbed

Revision:
35:2e864bae3af0
Parent:
34:029e07b67a41
Child:
36:f8d96ff1dd1b
diff -r 029e07b67a41 -r 2e864bae3af0 main.cpp
--- a/main.cpp	Sat Jul 23 01:10:53 2016 +0000
+++ b/main.cpp	Mon Sep 19 16:16:17 2016 +0000
@@ -9,7 +9,7 @@
 
 #include "hardware.h"
 I2C i2c(PTC11, PTC10);    //SDA, SCL -- define the I2C pins being used
-
+I2C proximityi2c(PTE25, PTE24);
 // comment out the following line if color is not supported on the terminal
 #define USE_COLOR
 #ifdef USE_COLOR
@@ -63,6 +63,149 @@
 
 #define MAX_AT_RSP_LEN                          255
 
+short proximity = 0;
+
+void prox_write_reg(char address,char reg, char cmd)
+{
+    char txbuffer [2];
+    txbuffer[0] = reg;
+    txbuffer[1] = cmd;
+    proximityi2c.write(address<<1, txbuffer, 2,false );
+} 
+
+void prox_write(char address, char cmd)
+{
+    char txbuffer [1];
+    txbuffer[0] = cmd;
+    proximityi2c.write(address<<1, txbuffer, 1,false );
+}  
+
+unsigned char prox_read_reg(char address,char reg)
+{
+    char txbuffer [1];
+    char rxbuffer [1];
+    rxbuffer[0] = 0;
+    txbuffer[0] = reg;
+    proximityi2c.write(address<<1, txbuffer, 1,false );
+    proximityi2c.read(address<<1, rxbuffer, 1 );
+    return (unsigned char)rxbuffer[0];
+}
+
+void init_proximity_sensor(int sensor)
+{
+    char C25ma = 0x00;
+    char C50ma = 0x01;
+    char C100m1 = 0x02;
+    char C200ma = 0x03;
+    
+    char GainAls1Ir1 = 0x00<<2;
+    char GainAls2Ir1 = 0x04<<2;
+    char GainAls2Ir2 = 0x05<<2;
+    char GainAls64Ir64 = 0x0A<<2;
+    char GainAls128Ir64 = 0x0D<<2;
+    char GainAls128Ir128 = 0x0F<<2;
+    
+    char Als0Ps0 = 0x00;
+    char Als0Ps10 = 0x01;
+    char Als0Ps40 = 0x02;
+    char Als0Ps100 = 0x03;    
+    char Als0Ps400 = 0x04;
+    
+    char Als100Ps0 = 0x05;
+    char Als100Ps100 = 0x06;
+    char Als100Ps400 = 0x07;
+    
+    char Als401Ps0 = 0x08;
+    char Als401Ps100 = 0x09;
+    char Als400Ps0 = 0x0A;    
+    char Als400Ps400 = 0x0B;
+    
+    char Als50Ps50 = 0x0C;
+     
+    char muxaddress = 0x70;
+    char proxaddress = 0x39;
+    prox_write(muxaddress,sensor); // sensor 2
+    prox_write_reg(proxaddress,0x41,Als0Ps400); // initiate ALS: and PS
+    prox_write_reg(proxaddress,0x42,GainAls64Ir64|C25ma); // set ALS_VIS=ALS_IR GAIN = 64 current 25ma
+}
+       
+short read_proximity(int sensor)
+{
+    
+    char muxaddress = 0x70;
+    char proxaddress = 0x39;
+    prox_write(muxaddress,sensor); // sensor 2
+    unsigned char prox_lsb = prox_read_reg(proxaddress,0x44);
+    unsigned char prox_msb = prox_read_reg(proxaddress,0x45);
+    unsigned char ALS_lsb = prox_read_reg(proxaddress,0x46);
+    unsigned char ALS_msb = prox_read_reg(proxaddress,0x47);
+    unsigned char IR_lsb = prox_read_reg(proxaddress,0x48);
+    unsigned char IR_msb = prox_read_reg(proxaddress,0x49);
+    
+    short proximity = prox_msb*256+prox_lsb;
+    short ALS = ALS_msb*256+ALS_lsb;
+    short IR = IR_msb*256+IR_lsb;
+    pc.printf(GRN "Sensor %d\n\r",sensor);
+    pc.printf(GRN "Prox %d\n\r",proximity);
+    pc.printf(GRN "ALS %d\n\r",ALS);
+    pc.printf(GRN "IR %d\n\r",IR);
+    return proximity;
+}
+    
+    
+   /* 
+I2C_w_3 (sfh_address*2, 0x41, 0x08); // initiate ALS: 400ms rep rate, T_int=100ms
+I2C_w_3 (sfh_address*2, 0x42, 0x28); // set ALS_VIS=ALS_IR GAIN = 64
+I2C_w_2_r_1 (sfh_address*2, 0x46); // read lsb of ALS_VIS, register 0x46
+Content1 = Content;
+I2C_w_2_r_1 (sfh_address*2, 0x47); // read msb of ALS_VIS, register 0x47
+ALS_VIS = (Content * 256 + Content1); // combining LSB+MSB byte to decimal value
+I2C_w_2_r_1 (sfh_address*2, 0x48); // read lsb of ALS_IR, register 0x48
+Content1 = Content;
+I2C_w_2_r_1 (sfh_address*2, 0x49); // read msb of ALS_IR, register 0x49
+ALS_IR = (Content * 256 + Content1); // combining LSB+MSB byte to decimal value
+// Lux Calculation based on ALS Gain = 64 and ALS_Int_Time = 100 ms
+// Lux value in front of sensor, no cover glass
+IF ((ALS_IR / ALS_VIS) < 0.109)
+ {LUX = (1.534 * ALS_VIS / 64 - 3.759 * ALS_IR / 64) * 1};
+ELSE IF ((ALS_IR / ALS_VIS) < 0.429)
+ {LUX = (1.339 * ALS_VIS / 64 – 1.972 * ALS_IR / 64) * 1};
+ELSE IF ((ALS_IR/ALS_VIS) < (0.95 * 1.45))
+ {LUX = (0.701 * ALS_VIS / 64 – 0.483 * ALS_IR / 64) * 1};
+ELSE IF ((ALS_IR/ALS_VIS) < (1.5 * 1.45))
+ {LUX = (2 * 0.701 * ALS_VIS / 64 – 1.18 * 0.483 * ALS_IR / 64) * 1};
+ELSE IF ((ALS_IR/ALS_VIS) < (2.5 * 1.45))
+{LUX = (4 * 0.701 * ALS_VIS / 64 – 1.33 * 0.483 * ALS_IR / 64) * 1};
+Else {LUX = 8 * 0.701 * ALS_VIS / 64}; 
+*/
+short oldread_proximity( void )
+{
+    char muxaddress = (0x70<<1);
+    char proxaddress = (0x39<<1);
+    char reg = 0x40;
+    short muxvalue = 0;
+    short value = 0;
+    char sensor = 0x02;
+    
+    char txbuffer [1];
+    char rxbuffer [1];
+    rxbuffer[0] = 0;
+    txbuffer[0] = sensor;
+    proximityi2c.write(muxaddress, txbuffer, 1,false );
+    proximityi2c.read(muxaddress, rxbuffer, 1 );
+    muxvalue = (unsigned char)rxbuffer[0];
+    
+    rxbuffer[0] = 0;
+    txbuffer[0] = reg;
+    proximityi2c.write(proxaddress, txbuffer, 1,false );
+    proximityi2c.read(proxaddress, rxbuffer, 1 );
+    value = (unsigned char)rxbuffer[0];
+    pc.printf(GRN "Mux %d\n\r",muxvalue);
+    pc.printf(GRN "Proximity %d\n\r",value);
+    return value;
+    
+}
+
 ssize_t mdm_getline(char *buff, size_t size, int timeout_ms) {
     int cin = -1;
     int cin_last;
@@ -133,8 +276,66 @@
     }
     return MDM_OK;
 }
+int mdm_init(void) {
+    // disable signal level translator (necessary
+    // for the modem to boot properly)
+    shield_3v3_1v8_sig_trans_ena = 0;
 
-int mdm_init(void) {
+    // Hard reset the modem (doesn't go through
+    // the signal level translator)
+    mdm_reset = 1;
+    
+   // wait a moment for the modem to react
+    wait_ms(10);
+    
+    // Let modem boot
+    mdm_reset = 0;
+    
+    // wait a moment for the modem to react
+    wait(1.0);
+    
+    // power modem on //off
+    mdm_power_on = 0; //1;
+    
+    // insure modem boots into normal operating mode
+    // and does not go to sleep when powered on
+    mdm_uart2_rx_boot_mode_sel = 1;
+    mdm_wakeup_in = 1;
+    
+    // initialze comm with the modem
+    mdm.baud(115200);
+    // clear out potential garbage
+    while (mdm.readable())
+      mdm.getc();
+
+    mdm_uart1_cts = 0;
+    
+    // wait a moment for the modem to react to signal
+    // conditions while the level translator is disabled
+    // (sorry, don't have enough information to know
+    // what exactly the modem is doing with the current
+    // pin settings)
+    wait(1.0);
+
+    // enable the signal level translator to start
+    // modem reset process (modem will be powered down)
+    shield_3v3_1v8_sig_trans_ena = 1;
+    
+    // Give the modem 60 secons to start responding by
+    // sending simple 'AT' commands to modem once per second.
+    Timer timer;
+    timer.start();
+    while (timer.read() < 60) {
+        const char * rsp_lst[] = { ok_str, error_str, NULL };
+        int rc = mdm_sendAtCmd("AT", rsp_lst, 500);
+        if (rc == 0)
+            return true; //timer.read();
+        wait_ms(1000 - (timer.read_ms() % 1000));
+        pc.printf("\r%d",timer.read_ms()/1000);
+    }
+    return false;       
+}
+int oldmdm_init(void) {
     // Hard reset the modem (doesn't go through
     // the signal level translator)
     mdm_reset = 0;
@@ -279,6 +480,11 @@
 {
     switch(iSensorsToReport)
     {
+        case PROXIMITY:
+        {
+            sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s&proximity=%d %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity,proximity, FLOW_URL_TYPE, MY_SERVER_URL);
+            break;
+        }
         case TEMP_HUMIDITY_ONLY:
         {
             sprintf(modem_string, "GET %s%s?serial=%s&temp=%s&humidity=%s %s%s\r\n\r\n", FLOW_BASE_URL, FLOW_INPUT_NAME, FLOW_DEVICE_NAME, SENSOR_DATA.Temperature, SENSOR_DATA.Humidity, FLOW_URL_TYPE, MY_SERVER_URL);
@@ -434,6 +640,9 @@
     int i;
     HTS221 hts221;
     pc.baud(115200);
+    proximityi2c.frequency(400000);
+    for(int i = 0;i<8;i++)
+        init_proximity_sensor(i);
     
     void hts221_init(void);
 
@@ -452,6 +661,7 @@
     printf("Temp  is: %0.2f F \n\r",CTOF(hts221.readTemperature()));
     printf("Humid is: %02d %%\n\r",hts221.readHumidity());
     
+
     sensors_init();
     read_sensors();
 
@@ -490,6 +700,8 @@
             sprintf(SENSOR_DATA.Temperature, "%0.2f", CTOF(hts221.readTemperature()));
             sprintf(SENSOR_DATA.Humidity, "%02d", hts221.readHumidity());
             read_sensors(); //read available external sensors from a PMOD and the on-board motion sensor
+            for(int i = 0;i<8;i++)
+                proximity = read_proximity(i);
             char modem_string[512];
             GenerateModemString(&modem_string[0]);
             printf(BLU "Sending to modem : %s" DEF "\n", modem_string);