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
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:
Diff: main.cpp
- 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);