Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API TMP_nrf51 mbed nRF51822
Fork of VTT_NODEV3_BMP180_Si7021 by
Diff: main.cpp
- Revision:
- 2:b221ba23b37f
- Parent:
- 1:bd7fd35251ab
- Child:
- 3:101b0f081435
--- a/main.cpp Mon Jan 25 13:27:15 2016 +0000
+++ b/main.cpp Mon Jan 25 14:36:57 2016 +0000
@@ -1,8 +1,6 @@
/**
-* LIS3DH & BLE broadcast example for VTT Node V3 & mbed
-* broadcasts accelerometer xyz values.
-* Also generates LIS3DH interrupt on position change and lights up leds based on that interrupt.
-* As a bonus, read temperature values from SOC and transmit those as well.
+* Temperature/humidity/pressure broadcast example for mbed / VTT Node V3
+* o Using BMP180 & Si7021 and onboard temperature sensor
* Juho Eskeli, VTT
*/
@@ -18,9 +16,11 @@
#endif
#include "AT45.h"
-#include "LIS3DH.h"
#include "TMP_nrf51.h"
+#include "BMP180.h"
+#include "Si7021.h"
+
//interrupt /gpio configuration
#include "nrf_gpio.h"
#include "nrf_gpiote.h"
@@ -35,8 +35,10 @@
#define MISO SPI_PSELMISO0
#define CS SPI_PSELSS0
#define SCLK SPI_PSELSCK0
-static LIS3DH lis(MOSI, MISO, CS, SCLK);
-static TMP_nrf51 tempSensor;
+
+static TMP_nrf51 tempSensor;
+BMP180 bmp180(I2C_SDA0, I2C_SCL0);
+SI7021_I2C si7021(I2C_SDA0, I2C_SCL0);
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
@@ -45,79 +47,23 @@
DigitalOut AT_CS(p5); //Dataflash CS
DigitalOut AT_RS(p6); //Dataflash reset
-/** @brief Function for initializing the GPIO Tasks/Events peripheral.
-*/
-static void gpiote_init(void)
-{
- // Configure accelerometer interrupt pin
- nrf_gpio_cfg_input(3, NRF_GPIO_PIN_PULLDOWN);
- //nrf_gpio_cfg_input(4, NRF_GPIO_PIN_PULLDOWN);
-
- // Configure GPIOTE channel 0 to generate event when MOTION_INTERRUPT_PIN_NUMBER goes from Low to High
- nrf_gpiote_event_config(0, 3, NRF_GPIOTE_POLARITY_LOTOHI); //accelerometer int1
- //nrf_gpiote_event_config(1, 4, NRF_GPIOTE_POLARITY_LOTOHI); //accelerometer int2
-
- // Enable interrupt for NRF_GPIOTE->EVENTS_IN[0] event
- NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_IN0_Msk;
- //NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN1_Msk;
-}
-
-extern "C"
-void GPIOTE_IRQHandler(void)
-{
- // Event causing the interrupt must be cleared
- NRF_GPIOTE->EVENTS_IN[0] = 0;
- //NRF_GPIOTE->EVENTS_IN[1] = 0;
- lis.LIS3DH_ResetInt1Latch();
-
- myled1 = !myled1;
- myled2 = !myled2;
-}
-
-void disconnect_input_buffers()
-{
- for(uint8_t i = 0; i < 3; i++)
- {
- NRF_GPIO->PIN_CNF[i] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
- | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
- | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
- | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
- | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
- }
- //Omit accelerometer interrupt pins (3&4)
- for(uint8_t i = 5; i < 21; i++)
- {
- NRF_GPIO->PIN_CNF[i] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
- | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
- | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
- | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
- | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
- }
- //Omit I2C pins (21 & 22)
- for(uint8_t i = 23; i < 31; i++)
- {
- NRF_GPIO->PIN_CNF[i] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
- | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
- | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
- | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
- | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
- }
-}
-
__packed struct ApplicationData_t {
uint16_t applicationSpecificId; /* An ID used to identify temperature value in the manufacture specific AD data field */
- TMP_nrf51::tmpSensorValue_t tmpSensorValue; /* User defined application data */
- int8_t accel_temp;
- AxesRaw_t accel_raw;
+ TMP_nrf51::tmpSensorValue_t tmpSensorValue; /* User defined application data */
+ int16_t bmp180_temp;
+ uint32_t bmp180_press;
+ float si7021_temperature;
+ float si7021_humidity;
};
void setupApplicationData(ApplicationData_t &appData)
{
static const uint16_t APP_SPECIFIC_ID_TEST = 0xFEFE;
appData.applicationSpecificId = APP_SPECIFIC_ID_TEST;
- appData.tmpSensorValue = tempSensor.get();
- lis.LIS3DH_GetAccAxesRaw(&appData.accel_raw);
- lis.LIS3DH_GetTempRaw(&appData.accel_temp);
+ appData.tmpSensorValue = tempSensor.get();
+ appData.bmp180_temp = bmp180.BMP180GetTemperature();
+ appData.bmp180_press = bmp180.BMP180GetPressure();
+ si7021.Measure_Humidity_Temp((float*)&(appData.si7021_humidity), (float*)&(appData.si7021_temperature));
}
void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
@@ -142,6 +88,23 @@
AT_RS = 1;
}
+bool init_bmp180(void)
+{
+ // Read the WHO_AM_I register of the BMP-180, this is a good test of communication
+ uint8_t c = bmp180.readByte(BMP180_ADDRESS, BMP180_WHO_AM_I);
+ if(c == 0x55) {
+ //BMP-180 should be 0x55
+ //BMP-180 online...
+ bmp180.BMP180Calibration();
+ //BMP-180 calibration complete
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
int main()
{
//LEDS off
@@ -156,25 +119,9 @@
spi.frequency(8000000);
//setup AT45 dataflash to powersaving mode
AT45* flash = new AT45(spi, p5);
- flash->ultra_deep_power_down(true);
-
- //Accelerometer interrupt pin configuration
- gpiote_init();
-
- //Disconnect input buffers to save power
- disconnect_input_buffers();
+ flash->ultra_deep_power_down(true);
- //Initialize LIS3DH driver
- lis.InitLIS3DH(LIS3DH_NORMAL, LIS3DH_ODR_100Hz, LIS3DH_FULLSCALE_2); //Init Acc-sensor
- //enable threshold to generate interrupt
- lis.SetLIS3DHActivityDetection(3, LIS3DH_INT_MODE_6D_POSITION, 1);
-
- // Enable GPIOTE interrupt in Nested Vector Interrupt Controller.
- NVIC_ClearPendingIRQ(GPIOTE_IRQn);
- NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_PORT_Set << GPIOTE_INTENSET_PORT_Pos;
- NVIC_SetPriority(GPIOTE_IRQn, 1);
- NVIC_EnableIRQ(GPIOTE_IRQn);
- //sd_nvic_EnableIRQ(GPIOTE_IRQn);
+ init_bmp180();
//Initialize BLE stuff
ble.init();
