This is sample code for interfacing ROHM's SENSORSHLD1-EVK-101 with Nordic Semiconductor's nRF51-DK Development Kit Host BTLE Board

Dependencies:   BLE_API mbed nRF51822

Fork of Nordic_UART_TEMPLATE_ROHM by ROHMUSDC

Code Example for ROHM Mutli-Sensor Shield on the Nordic Semiconductor nRF51-DK

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

This is the basic example code for interfacing ROHM's Multi-sensor Shield Board onto this board.

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

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

Operation

Ultimately, this code will initialize all the sensors on the Multi-sensor shield board and then poll the sensors. The sensor data will then be returned to the BTLE COM port link and will be view-able on any BTLE enabled phone that can connect to the Nordic UART Application.

Supported ROHM 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
  • BM1422 MI Magnetometer Sensor
  • KXG03 Gyro/Accel Sensor

Updates from SHLD0 to SHLD1

  • Pressure Sensor Changes: Fixed Register Map Changes for BM1383AGLV, See Pressure Sensor Datasheet for more details - TEMP and PRES output switched
  • Added new #ifdef section for Magnetometer
  • Changed Gyro Device Address (7bit addr now 0x4F, not 0x4E)

Sensor Applicable Code Sections

  • Added a Section in "Main" to act as initialization
  • Added to the "Periodic Callback" to read sensor data and return to Phone/Host

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
--- 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);