Code used for Sensor Expo 2016 - Balloon Game. More details can be found here: https://github.com/ROHMUSDC/ROHM-SensorExpo2016-Pressure-Sensor-Demo/

Dependencies:   BLE_API mbed nRF51822

Fork of Nordic_UART_TEMPLATE_ROHM_SHLD1Update by ROHMUSDC

ROHM Balloon Game Demo Code featured at Sensors Expo 2016

This code was written to be used with the Nordic Semiconductor nRF51-DK.

This Code allows the user to configure two known pressure distances and save pressure readings onto the application. Then it will automatically extrapolate these values and allow the user to see the height of the board. When connected to a balloon, greater heights can be achieved and the board will return the current height of the board.

Additional information about the ROHM MultiSensor Shield Board can be found at the following link: https://github.com/ROHMUSDC/ROHM-SensorExpo2016-Pressure-Sensor-Demo/

For code example for the ROHM SENSORSHLD0-EVK-101, please see the following link: https://developer.mbed.org/teams/ROHMUSDC/code/ROHMSensorShield_BALOONGAME/

Operation

See Github Repositoy for additional information on how to operate this demo application.

Supported ROHM Sensor Devices

  • BM1383GLV Pressure Sensor

Questions/Feedback

Please feel free to let us know any questions/feedback/comments/concerns on the ROHM shield implementation by contacting the following e-mail:

Revision:
2:c7b9d588c80f
Parent:
1:2c0ab5cd1a7f
Child:
3:c3ee9d663fb8
--- a/main.cpp	Sun Jul 19 23:14:07 2015 +0000
+++ b/main.cpp	Wed Jul 22 01:05:56 2015 +0000
@@ -13,19 +13,38 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+ 
+ /*
+ *  Added Functions for ROHM's Multi-Sensor Shield Board
+ *  Supports the following Sensor Devices
+ *      > BDE0600G Temperature Sensor
+ *      > BM1383GLV Pressure Sensor
+ *      > BU52014 Hall Sensor
+ *      > ML8511 UV Sensor
+ *      > RPR-0521 ALS/PROX Sensor
+ *      > BH1745NUC Color Sensor
+ *      > KMX62 Accel/Mag Sensor
+ *      > KX122 Accel Sensor
+ *      > KXG03 Gyro (Currently Unavailable as IC hasn't docked yet)
+ *
+ *  New Code: 
+ *      Added a Section in "Main" to act as initialization
+ *      Added to the "Periodic Callback" to read sensor data and return to Phone/Host
+ */ 
+ 
 
-#define AnalogALS   //BH1620    //Change 0: Remove this completely
+//#define AnalogALS   //BH1620    //Change 0: Remove this completely
 #define AnalogTemp  //BDE0600
 #define AnalogUV    //ML8511
 #define HallSensor  //BU52011   //Change 1: Change to use GPIO for BU52014
-#define DigitalALS  //BH1721    //Change 2: Remove This and add in the RPR-0521
+#define RPR0521     //RPR0521    //Change 2: Remove This and add in the RPR-0521
                                 //Change 3: Add Code For BH1745, KX022, BM1383GLV, KMX62
 
-
 #include "mbed.h"
 #include "BLEDevice.h"
 #include "UARTService.h"
 #include "nrf_temp.h"
+#include "I2C.h"
 
 #define MAX_REPLY_LEN           (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN)    //Actually equal to 20
 #define SENSOR_READ_INTERVAL_S  (2.0F) 
@@ -50,29 +69,45 @@
 I2C         i2c(p30,p7);
 
 //Sensor Variables
-AnalogIn    BH1620_ALS(p1);
+/*
+AnalogIn    BH1620_ALS(p1);     //No Analog ALS on the shield
 uint16_t    BH1620_ALS_value;
 float       BH1620_output;
+*/
 
-AnalogIn    BDE0600_Temp(p2);
+AnalogIn    BDE0600_Temp(p3);   //p2 on the prior evk, p3 on the shield
 uint16_t    BDE0600_Temp_value;
 float       BDE0600_output;
 
-AnalogIn    ML8511_UV(p3);
+AnalogIn    ML8511_UV(p5);      //p3 on prior EVK, p5 on the shield
 uint16_t    ML8511_UV_value;
 float       ML8511_output;
 
-DigitalIn   Hall_GPIO0(p28);
-DigitalIn   Hall_GPIO1(p29);
+DigitalIn   Hall_GPIO0(p14);    //
+DigitalIn   Hall_GPIO1(p15);    //
 int         Hall_Return1;
 int         Hall_Return0;
 
-int         ALS_addr_w = 0x46;   //7bit addr = 0x23, with write bit 0
-int         ALS_addr_r = 0x47;  //7bit addr = 0x23, with read bit 1
-char        ALS_PwrOn_cmd = 0x01;
-char        ALS_ContAuto_cmd = 0x10;
-char        ALS_ReturnData_raw[2];
-float       ALS_Return = 0;
+bool        RepStart = true;
+bool        NoRepStart = false;
+
+#ifdef RPR0521
+int         RPR0521_addr_w = 0x70;          //7bit addr = 0x38, with write bit 0
+int         RPR0521_addr_r = 0x71;          //7bit addr = 0x38, with read bit 1
+
+char        RPR0521_ModeControl[2] = {0x41, 0xE6};  
+char        RPR0521_ALSPSControl[2] = {0x42, 0x03};
+char        RPR0521_Persist[2] = {0x43, 0x20};
+char        RPR0521_Addr_ReadData = 0x44;
+char        RPR0521_Content_ReadData[6];
+
+int         RPR0521_PS_RAWOUT = 0;
+float       RPR0521_PS_OUT = 0;
+int         RPR0521_ALS_D0_RAWOUT = 0;
+int         RPR0521_ALS_D1_RAWOUT = 0;
+float       RPR0521_ALS_DataRatio = 0;
+float       RPR0521_ALS_OUT = 0;
+#endif
 
 /**
  * This callback is used whenever a disconnection occurs.
@@ -117,10 +152,10 @@
                 len = snprintf((char*) buf, MAX_REPLY_LEN, "OK... LED OFF");
                 break;
             case 'a':
-                len = snprintf((char*) buf, MAX_REPLY_LEN, "ALSRaw = %d", BH1620_ALS_value);
+                //len = snprintf((char*) buf, MAX_REPLY_LEN, "ALSRaw = %d", BH1620_ALS_value);
                 break;
             case 'b':
-                len = snprintf((char*) buf, MAX_REPLY_LEN, "ALS = %.2f lx", BH1620_output);
+                //len = snprintf((char*) buf, MAX_REPLY_LEN, "ALS = %.2f lx", BH1620_output);
                 break;
             default:
                 len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR");
@@ -157,8 +192,9 @@
     uint8_t  buf[MAX_REPLY_LEN];
     uint32_t len = 0;
     
-    
-#ifdef AnalogALS    
+
+/*    
+#ifdef AnalogALS
     if (m_ble.getGapState().connected) {
         BH1620_ALS_value = BH1620_ALS.read_u16();
         BH1620_output = (float)BH1620_ALS_value * 1.543;
@@ -167,6 +203,7 @@
         m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
     }
 #endif
+*/
 
 #ifdef AnalogTemp
     if (m_ble.getGapState().connected) {
@@ -212,14 +249,42 @@
     }
 #endif
 
-
-
+#ifdef RPR0521
+    if (m_ble.getGapState().connected) {
+        
+        i2c.write(RPR0521_addr_w, &RPR0521_Addr_ReadData, 1, RepStart);
+        i2c.read(RPR0521_addr_r, &RPR0521_Content_ReadData[0], 6, NoRepStart);
+        
+        RPR0521_PS_RAWOUT = (RPR0521_Content_ReadData[1]<<8) | (RPR0521_Content_ReadData[0]);
+        RPR0521_ALS_D0_RAWOUT = (RPR0521_Content_ReadData[3]<<8) | (RPR0521_Content_ReadData[2]);
+        RPR0521_ALS_D1_RAWOUT = (RPR0521_Content_ReadData[5]<<8) | (RPR0521_Content_ReadData[4]);
+        RPR0521_ALS_DataRatio = (float)RPR0521_ALS_D1_RAWOUT / (float)RPR0521_ALS_D0_RAWOUT;
+         
+        if(RPR0521_ALS_DataRatio < 0.595){
+            RPR0521_ALS_OUT = (1.682*(float)RPR0521_ALS_D0_RAWOUT - 1.877*(float)RPR0521_ALS_D1_RAWOUT);
+        }
+        else if(RPR0521_ALS_DataRatio < 1.015){
+            RPR0521_ALS_OUT = (0.644*(float)RPR0521_ALS_D0_RAWOUT - 0.132*(float)RPR0521_ALS_D1_RAWOUT);
+        }
+        else if(RPR0521_ALS_DataRatio < 1.352){
+            RPR0521_ALS_OUT = (0.756*(float)RPR0521_ALS_D0_RAWOUT - 0.243*(float)RPR0521_ALS_D1_RAWOUT);
+        }
+        else if(RPR0521_ALS_DataRatio < 3.053){
+            RPR0521_ALS_OUT = (0.766*(float)RPR0521_ALS_D0_RAWOUT - 0.25*(float)RPR0521_ALS_D1_RAWOUT);
+        }
+        else{
+            RPR0521_ALS_OUT = 0;
+        }
+        
+        len = snprintf((char*) buf, MAX_REPLY_LEN, "DALS= %0.2f lx", RPR0521_ALS_OUT);
+        m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
+    }
+#endif
 
     if (m_ble.getGapState().connected) {
         len = snprintf((char*) buf, MAX_REPLY_LEN, "                ");         //Print and Extra Line to show new data
         m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
     }
-
 }
 
 
@@ -236,12 +301,15 @@
     
     m_cmd_led = !m_cmd_led;
     
+    
     if (m_ble.getGapState().connected) {
+        /*
         BH1620_ALS_value = BH1620_ALS.read_u16();
         BH1620_output = (float)BH1620_ALS_value * 1.543;
         
         len = snprintf((char*) buf, MAX_REPLY_LEN, "ALS = %.2f lx", BH1620_output);
         m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
+        */
     }
 }
 
@@ -252,21 +320,26 @@
 
     m_serial_port.baud(UART_BAUD_RATE);
 
-    DEBUG("Initialising\n\r");
+    DEBUG("Initialising...\n\r");
 
     m_cmd_led      = 0;
     m_error_led    = 0;
-    BH1620_ALS_value    = 0;
+    //BH1620_ALS_value    = 0;
 
     ticker.attach(periodicCallback, SENSOR_READ_INTERVAL_S);
 
     sw4Press.fall(&PBTrigger);
 
-#ifdef DigitalALS
-    i2c.write(ALS_addr_w, &ALS_PwrOn_cmd, 1);
-    i2c.write(ALS_addr_w, &ALS_ContAuto_cmd, 1);
+#ifdef RPR0521
+  // 1. Mode Control (0x41), write (0xC6): ALS EN, PS EN, 100ms measurement for ALS and PS, PS_PULSE=1
+  // 2. ALS_PS_CONTROL (0x42), write (0x03): LED Current = 200mA
+  // 3. PERSIST (0x43), write (0x20): PS Gain x4  
+    i2c.write(RPR0521_addr_w, &RPR0521_ModeControl[0], 2, false);
+    i2c.write(RPR0521_addr_w, &RPR0521_ALSPSControl[0], 2, false);
+    i2c.write(RPR0521_addr_w, &RPR0521_Persist[0], 2, false);
 #endif
 
+//Start BTLE Initialization Section
     m_ble.init();
     m_ble.onDisconnection(disconnectionCallback);
     m_ble.onDataWritten(dataWrittenCallback);