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:
1:2c0ab5cd1a7f
Parent:
0:442c7a6f1978
Child:
2:c7b9d588c80f
diff -r 442c7a6f1978 -r 2c0ab5cd1a7f main.cpp
--- a/main.cpp	Mon Dec 15 21:05:18 2014 -0800
+++ b/main.cpp	Sun Jul 19 23:14:07 2015 +0000
@@ -14,29 +14,65 @@
  * limitations under the License.
  */
 
+#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
+                                //Change 3: Add Code For BH1745, KX022, BM1383GLV, KMX62
+
+
 #include "mbed.h"
 #include "BLEDevice.h"
 #include "UARTService.h"
 #include "nrf_temp.h"
 
-#define MAX_REPLY_LEN           (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN)
-#define SENSOR_READ_INTERVAL_S  (0.5F) 
+#define MAX_REPLY_LEN           (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN)    //Actually equal to 20
+#define SENSOR_READ_INTERVAL_S  (2.0F) 
 #define ADV_INTERVAL_MS         (1000UL)
 #define UART_BAUD_RATE          (19200UL)
 #define DEVICE_NAME             ("DEMO SENSOR") // This can be read AFTER connecting to the device.
-#define SHORT_NAME              ("HACKDEMO")    // Keep this short: max 8 chars if a 128bit UUID is also advertised.
+#define SHORT_NAME              ("ROHMKRIS")    // Keep this short: max 8 chars if a 128bit UUID is also advertised.
 
 #define DEBUG(...)              { m_serial_port.printf(__VA_ARGS__); }
 
+// Function Prototypes
+void PBTrigger();   //Interrupt function for PB4
 
+// Global Variables
 BLEDevice   m_ble;
 Serial      m_serial_port(p9, p11);  // TX pin, RX pin
 DigitalOut  m_cmd_led(LED1);
 DigitalOut  m_error_led(LED2);
-AnalogIn    m_analog_in(p1);
-uint16_t    m_analog_in_value;
 UARTService *m_uart_service_ptr;
+DigitalIn   testButton(p20);
+InterruptIn sw4Press(p20);
+I2C         i2c(p30,p7);
 
+//Sensor Variables
+AnalogIn    BH1620_ALS(p1);
+uint16_t    BH1620_ALS_value;
+float       BH1620_output;
+
+AnalogIn    BDE0600_Temp(p2);
+uint16_t    BDE0600_Temp_value;
+float       BDE0600_output;
+
+AnalogIn    ML8511_UV(p3);
+uint16_t    ML8511_UV_value;
+float       ML8511_output;
+
+DigitalIn   Hall_GPIO0(p28);
+DigitalIn   Hall_GPIO1(p29);
+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;
 
 /**
  * This callback is used whenever a disconnection occurs.
@@ -73,24 +109,27 @@
         if (1 == params->len) {
             switch (params->data[0]) {
             case '0':
-                m_cmd_led = 0;
-                len = snprintf((char*) buf, MAX_REPLY_LEN, "OK");
+                m_cmd_led = m_cmd_led ^ 1;
+                len = snprintf((char*) buf, MAX_REPLY_LEN, "OK... LED ON");
                 break;
             case '1':
-                m_cmd_led = 1;
-                len = snprintf((char*) buf, MAX_REPLY_LEN, "OK");
+                m_cmd_led = m_cmd_led ^ 1;
+                len = snprintf((char*) buf, MAX_REPLY_LEN, "OK... LED OFF");
                 break;
             case 'a':
-                len = snprintf((char*) buf, MAX_REPLY_LEN, "%d", m_analog_in_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);
                 break;
             default:
-                len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR: Unknown char");
+                len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR");
                 break;
             }
         }
         else
         {
-            len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR: Invalid len");
+            len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR");
         }
 
         m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
@@ -115,7 +154,72 @@
  */
 void periodicCallback(void)
 {
-    m_analog_in_value = m_analog_in.read_u16();
+    uint8_t  buf[MAX_REPLY_LEN];
+    uint32_t len = 0;
+    
+    
+#ifdef AnalogALS    
+    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);
+    }
+#endif
+
+#ifdef AnalogTemp
+    if (m_ble.getGapState().connected) {
+        BDE0600_Temp_value = BDE0600_Temp.read_u16();
+        BDE0600_output = (float)BDE0600_Temp_value * 0.00283; //(value * (2.9V/1024))
+        BDE0600_output = (BDE0600_output-1.753)/(-0.01068) + 30;
+        
+        len = snprintf((char*) buf, MAX_REPLY_LEN, "Temp = %.2f C", BDE0600_output);
+        m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
+
+    }
+#endif
+
+#ifdef AnalogUV
+    if (m_ble.getGapState().connected) {
+        ML8511_UV_value = ML8511_UV.read_u16();
+        ML8511_output = (float)ML8511_UV_value * 0.00283; //(value * (2.9V/1024))   //Note to self: when playing with this, a negative value is seen... Honestly, I think this has to do with my ADC converstion...
+        ML8511_output = (ML8511_output-2.2)/(0.129) + 15;                           // Added +5 to the offset so when inside (aka, no UV, readings show 0)... this is the wrong approach... and the readings don't make sense... Fix this.
+        
+        len = snprintf((char*) buf, MAX_REPLY_LEN, "UV = %.1f mW/cm2", ML8511_output);
+        m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
+    }
+#endif
+
+#ifdef HallSensor
+    if (m_ble.getGapState().connected) {
+        Hall_Return0 = Hall_GPIO0;
+        Hall_Return1 = Hall_GPIO1;
+        
+        len = snprintf((char*) buf, MAX_REPLY_LEN, "H0 = %d, H1 = %d", Hall_Return0, Hall_Return1);
+        m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len);
+    }
+#endif
+
+#ifdef DigitalALS
+    if (m_ble.getGapState().connected) {
+        i2c.read(ALS_addr_r, ALS_ReturnData_raw, 2);
+        ALS_Return = (ALS_ReturnData_raw[0]<<8) | ALS_ReturnData_raw[1];
+        ALS_Return = ALS_Return/1.2;
+        
+        len = snprintf((char*) buf, MAX_REPLY_LEN, "DALS= %0.2f lx", ALS_Return);
+        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);
+    }
+
 }
 
 
@@ -125,6 +229,21 @@
     DEBUG("Error %d on line number %d\n\r", err, line);
 }
 
+void PBTrigger()
+{
+    uint8_t  buf[MAX_REPLY_LEN];
+    uint32_t len = 0;
+    
+    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);
+    }
+}
 
 int main(void)
 {
@@ -137,10 +256,17 @@
 
     m_cmd_led      = 0;
     m_error_led    = 0;
-    m_analog_in_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);
+#endif
+
     m_ble.init();
     m_ble.onDisconnection(disconnectionCallback);
     m_ble.onDataWritten(dataWrittenCallback);