Adaptation of SMPIR for the Window Sensor Module of the Agile-IoT project.
Dependencies: BLE_API mbed nRF51822
Fork of SensorModulePIR by
main.cpp@1:839f9cac1eca, 2016-11-22 (annotated)
- Committer:
- MisterGiet
- Date:
- Tue Nov 22 18:19:08 2016 +0000
- Revision:
- 1:839f9cac1eca
- Parent:
- 0:eb280529b0ef
- Child:
- 3:53db6c57bb61
previous to SensorModulePIR(radar-version) merge
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
waltercolitti | 0:eb280529b0ef | 1 | #include "mbed.h" |
waltercolitti | 0:eb280529b0ef | 2 | //#include "HDC1000.h" |
waltercolitti | 0:eb280529b0ef | 3 | #include "BLE.h" |
waltercolitti | 0:eb280529b0ef | 4 | #include "HealthThermometerService.h" |
waltercolitti | 0:eb280529b0ef | 5 | //#include "SetTemperatureService.h" |
waltercolitti | 0:eb280529b0ef | 6 | //#include "SetModeService.h" |
waltercolitti | 0:eb280529b0ef | 7 | //#include "UARTService.h" |
waltercolitti | 0:eb280529b0ef | 8 | #include "PresenceDetectionService.h" |
waltercolitti | 0:eb280529b0ef | 9 | #include "TemperatureMeasureService.h" |
waltercolitti | 0:eb280529b0ef | 10 | |
waltercolitti | 0:eb280529b0ef | 11 | #include "ble_gatt.h" |
waltercolitti | 0:eb280529b0ef | 12 | #include "Si7020.h" |
waltercolitti | 0:eb280529b0ef | 13 | |
waltercolitti | 0:eb280529b0ef | 14 | Serial pc(p22, p23); |
waltercolitti | 0:eb280529b0ef | 15 | //Serial pc(USBTX, USBRX); |
waltercolitti | 0:eb280529b0ef | 16 | //I2C i2c(PIN_SDA,PIN_SCL); |
waltercolitti | 0:eb280529b0ef | 17 | I2C i2c(p12, p13); |
waltercolitti | 0:eb280529b0ef | 18 | Si7020 tempsensor(&i2c); |
waltercolitti | 0:eb280529b0ef | 19 | |
waltercolitti | 0:eb280529b0ef | 20 | InterruptIn motion(p11); |
MisterGiet | 1:839f9cac1eca | 21 | //InterruptIn motion(p8); |
waltercolitti | 0:eb280529b0ef | 22 | //InterruptIn motion(p23); |
waltercolitti | 0:eb280529b0ef | 23 | |
waltercolitti | 0:eb280529b0ef | 24 | DigitalOut led(p21, 1); |
waltercolitti | 0:eb280529b0ef | 25 | //DigitalOut led(LED2, 0); |
waltercolitti | 0:eb280529b0ef | 26 | |
waltercolitti | 0:eb280529b0ef | 27 | BLE ble; |
waltercolitti | 0:eb280529b0ef | 28 | |
waltercolitti | 0:eb280529b0ef | 29 | const static char DEVICE_NAME[] = "SensorModulePIR"; |
waltercolitti | 0:eb280529b0ef | 30 | //static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE, SetTemperatureService::SET_TEMPERATURE_SERVICE_UUID}; |
waltercolitti | 0:eb280529b0ef | 31 | static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE}; |
waltercolitti | 0:eb280529b0ef | 32 | |
waltercolitti | 0:eb280529b0ef | 33 | static volatile bool triggerSensorPolling = false; |
waltercolitti | 0:eb280529b0ef | 34 | uint8_t presence_now = 0; |
waltercolitti | 0:eb280529b0ef | 35 | uint8_t presence_before = 0; |
waltercolitti | 0:eb280529b0ef | 36 | float currentTemperature; |
waltercolitti | 0:eb280529b0ef | 37 | |
waltercolitti | 0:eb280529b0ef | 38 | PresenceDetectionService *presenceService = NULL; |
waltercolitti | 0:eb280529b0ef | 39 | TemperatureMeasureService *temperatureService = NULL; |
waltercolitti | 0:eb280529b0ef | 40 | |
waltercolitti | 0:eb280529b0ef | 41 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
waltercolitti | 0:eb280529b0ef | 42 | { |
waltercolitti | 0:eb280529b0ef | 43 | //led = !led; |
waltercolitti | 0:eb280529b0ef | 44 | pc.printf("Disconnected\r\n"); |
waltercolitti | 0:eb280529b0ef | 45 | ble.gap().startAdvertising(); |
waltercolitti | 0:eb280529b0ef | 46 | } |
waltercolitti | 0:eb280529b0ef | 47 | |
waltercolitti | 0:eb280529b0ef | 48 | /** |
waltercolitti | 0:eb280529b0ef | 49 | * This function is called when the ble initialization process has failed |
waltercolitti | 0:eb280529b0ef | 50 | */ |
waltercolitti | 0:eb280529b0ef | 51 | void onBleInitError(BLE &ble, ble_error_t error) |
waltercolitti | 0:eb280529b0ef | 52 | { |
waltercolitti | 0:eb280529b0ef | 53 | /* Initialization error handling should go here */ |
waltercolitti | 0:eb280529b0ef | 54 | } |
waltercolitti | 0:eb280529b0ef | 55 | |
waltercolitti | 0:eb280529b0ef | 56 | float getTemperature(void) |
waltercolitti | 0:eb280529b0ef | 57 | { |
waltercolitti | 0:eb280529b0ef | 58 | /* |
waltercolitti | 0:eb280529b0ef | 59 | float t = hdc1000.temperature(); |
waltercolitti | 0:eb280529b0ef | 60 | t = t/0x10000*165-40; |
waltercolitti | 0:eb280529b0ef | 61 | pc.printf("Temperature: %f \n", t); |
waltercolitti | 0:eb280529b0ef | 62 | |
waltercolitti | 0:eb280529b0ef | 63 | return t; |
waltercolitti | 0:eb280529b0ef | 64 | */ |
waltercolitti | 0:eb280529b0ef | 65 | |
waltercolitti | 0:eb280529b0ef | 66 | //float t = 26.8; |
waltercolitti | 0:eb280529b0ef | 67 | //return t; |
waltercolitti | 0:eb280529b0ef | 68 | |
waltercolitti | 0:eb280529b0ef | 69 | float temp; |
waltercolitti | 0:eb280529b0ef | 70 | if(tempsensor.getTemperature(&temp) != 0) { |
waltercolitti | 0:eb280529b0ef | 71 | //pc.printf("Error getting temperature"); |
waltercolitti | 0:eb280529b0ef | 72 | temp = -1; |
waltercolitti | 0:eb280529b0ef | 73 | } |
waltercolitti | 0:eb280529b0ef | 74 | pc.printf("Temperature = %fC\n", temp); |
waltercolitti | 0:eb280529b0ef | 75 | |
waltercolitti | 0:eb280529b0ef | 76 | return temp; |
waltercolitti | 0:eb280529b0ef | 77 | } |
waltercolitti | 0:eb280529b0ef | 78 | |
waltercolitti | 0:eb280529b0ef | 79 | void onDataWrittenCallback(const GattWriteCallbackParams *params) |
waltercolitti | 0:eb280529b0ef | 80 | { |
waltercolitti | 0:eb280529b0ef | 81 | pc.printf("Resetting presence\n"); |
waltercolitti | 0:eb280529b0ef | 82 | presence_before = 0; |
waltercolitti | 0:eb280529b0ef | 83 | } |
waltercolitti | 0:eb280529b0ef | 84 | |
waltercolitti | 0:eb280529b0ef | 85 | /** |
waltercolitti | 0:eb280529b0ef | 86 | * Callback triggered when the ble initialization process has finished |
waltercolitti | 0:eb280529b0ef | 87 | */ |
waltercolitti | 0:eb280529b0ef | 88 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
waltercolitti | 0:eb280529b0ef | 89 | { |
waltercolitti | 0:eb280529b0ef | 90 | pc.printf("Init \n"); |
waltercolitti | 0:eb280529b0ef | 91 | |
waltercolitti | 0:eb280529b0ef | 92 | BLE &ble = params->ble; |
waltercolitti | 0:eb280529b0ef | 93 | ble_error_t error = params->error; |
waltercolitti | 0:eb280529b0ef | 94 | |
waltercolitti | 0:eb280529b0ef | 95 | if (error != BLE_ERROR_NONE) { |
waltercolitti | 0:eb280529b0ef | 96 | /* In case of error, forward the error handling to onBleInitError */ |
waltercolitti | 0:eb280529b0ef | 97 | onBleInitError(ble, error); |
waltercolitti | 0:eb280529b0ef | 98 | return; |
waltercolitti | 0:eb280529b0ef | 99 | } |
waltercolitti | 0:eb280529b0ef | 100 | |
waltercolitti | 0:eb280529b0ef | 101 | /* Ensure that it is the default instance of BLE */ |
waltercolitti | 0:eb280529b0ef | 102 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
waltercolitti | 0:eb280529b0ef | 103 | return; |
waltercolitti | 0:eb280529b0ef | 104 | } |
waltercolitti | 0:eb280529b0ef | 105 | |
waltercolitti | 0:eb280529b0ef | 106 | //ble.gap().onConnection(connectionCallback); |
waltercolitti | 0:eb280529b0ef | 107 | //ble.gap().onDisconnection(disconnectionCallback); |
waltercolitti | 0:eb280529b0ef | 108 | ble.onDisconnection(disconnectionCallback); |
waltercolitti | 0:eb280529b0ef | 109 | |
waltercolitti | 0:eb280529b0ef | 110 | ble.gap().setScanParams(500, 400); |
waltercolitti | 0:eb280529b0ef | 111 | //ble.gap().startScan(advertisementCallback); |
waltercolitti | 0:eb280529b0ef | 112 | |
waltercolitti | 0:eb280529b0ef | 113 | //BLE server setup |
waltercolitti | 0:eb280529b0ef | 114 | //ble.init(); |
waltercolitti | 0:eb280529b0ef | 115 | //ble_server.gap().onDisconnection(disconnectionCallbackServer); check why gives error |
waltercolitti | 0:eb280529b0ef | 116 | ble.gattServer().onDataWritten(onDataWrittenCallback); |
waltercolitti | 0:eb280529b0ef | 117 | |
waltercolitti | 0:eb280529b0ef | 118 | //Setup primary services |
waltercolitti | 0:eb280529b0ef | 119 | presenceService = new PresenceDetectionService(ble, presence_before); |
waltercolitti | 0:eb280529b0ef | 120 | temperatureService = new TemperatureMeasureService(ble, getTemperature()); |
waltercolitti | 0:eb280529b0ef | 121 | |
waltercolitti | 0:eb280529b0ef | 122 | //setup advertising |
waltercolitti | 0:eb280529b0ef | 123 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
waltercolitti | 0:eb280529b0ef | 124 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
waltercolitti | 0:eb280529b0ef | 125 | //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR); |
waltercolitti | 0:eb280529b0ef | 126 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
waltercolitti | 0:eb280529b0ef | 127 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
waltercolitti | 0:eb280529b0ef | 128 | ble.gap().setAdvertisingInterval(1000); //1000ms |
waltercolitti | 0:eb280529b0ef | 129 | ble.gap().startAdvertising(); |
waltercolitti | 0:eb280529b0ef | 130 | } |
waltercolitti | 0:eb280529b0ef | 131 | |
waltercolitti | 0:eb280529b0ef | 132 | /** |
waltercolitti | 0:eb280529b0ef | 133 | *Server functions |
waltercolitti | 0:eb280529b0ef | 134 | */ |
waltercolitti | 0:eb280529b0ef | 135 | |
waltercolitti | 0:eb280529b0ef | 136 | /* Restart Advertising on disconnection*/ |
waltercolitti | 0:eb280529b0ef | 137 | //void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
waltercolitti | 0:eb280529b0ef | 138 | //{ |
waltercolitti | 0:eb280529b0ef | 139 | // ble_server.gap().startAdvertising(); |
waltercolitti | 0:eb280529b0ef | 140 | //} |
waltercolitti | 0:eb280529b0ef | 141 | |
waltercolitti | 0:eb280529b0ef | 142 | void periodicCallbackSensor(void) |
waltercolitti | 0:eb280529b0ef | 143 | { |
waltercolitti | 0:eb280529b0ef | 144 | //led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ |
waltercolitti | 0:eb280529b0ef | 145 | |
waltercolitti | 0:eb280529b0ef | 146 | /* Note that the periodicCallback() executes in interrupt context, so it is safer to do |
waltercolitti | 0:eb280529b0ef | 147 | * heavy-weight sensor polling from the main thread. */ |
waltercolitti | 0:eb280529b0ef | 148 | triggerSensorPolling = true; |
waltercolitti | 0:eb280529b0ef | 149 | pc.printf("Periodic sensor \n"); |
waltercolitti | 0:eb280529b0ef | 150 | } |
waltercolitti | 0:eb280529b0ef | 151 | |
waltercolitti | 0:eb280529b0ef | 152 | void periodicCallbackPresence(void) |
waltercolitti | 0:eb280529b0ef | 153 | { |
waltercolitti | 0:eb280529b0ef | 154 | pc.printf("Periodic presence \n"); |
waltercolitti | 0:eb280529b0ef | 155 | //presence_before = 0; |
waltercolitti | 0:eb280529b0ef | 156 | } |
waltercolitti | 0:eb280529b0ef | 157 | |
waltercolitti | 0:eb280529b0ef | 158 | void irq_handler(void) |
waltercolitti | 0:eb280529b0ef | 159 | { |
waltercolitti | 0:eb280529b0ef | 160 | presence_now = 1; |
waltercolitti | 0:eb280529b0ef | 161 | presence_before = 1; |
waltercolitti | 0:eb280529b0ef | 162 | pc.printf("Presence detected \n"); |
waltercolitti | 0:eb280529b0ef | 163 | } |
waltercolitti | 0:eb280529b0ef | 164 | |
waltercolitti | 0:eb280529b0ef | 165 | int main(void) |
waltercolitti | 0:eb280529b0ef | 166 | { |
waltercolitti | 0:eb280529b0ef | 167 | pc.printf("Start \n"); |
waltercolitti | 0:eb280529b0ef | 168 | |
waltercolitti | 0:eb280529b0ef | 169 | Ticker ticker_sensor; |
waltercolitti | 0:eb280529b0ef | 170 | ticker_sensor.attach(periodicCallbackSensor, 5); |
waltercolitti | 0:eb280529b0ef | 171 | |
waltercolitti | 0:eb280529b0ef | 172 | Ticker ticker_presence; |
waltercolitti | 0:eb280529b0ef | 173 | ticker_presence.attach(periodicCallbackPresence, 300); |
waltercolitti | 0:eb280529b0ef | 174 | |
waltercolitti | 0:eb280529b0ef | 175 | motion.rise(&irq_handler); |
waltercolitti | 0:eb280529b0ef | 176 | |
waltercolitti | 0:eb280529b0ef | 177 | //BLE instance setup |
waltercolitti | 0:eb280529b0ef | 178 | BLE &bleptr = BLE::Instance(); |
waltercolitti | 0:eb280529b0ef | 179 | bleptr.init(bleInitComplete); |
waltercolitti | 0:eb280529b0ef | 180 | |
waltercolitti | 0:eb280529b0ef | 181 | //float initialDesiredTemperature = 20; |
waltercolitti | 0:eb280529b0ef | 182 | |
waltercolitti | 0:eb280529b0ef | 183 | while (true) { |
waltercolitti | 0:eb280529b0ef | 184 | if (triggerSensorPolling && ble.getGapState().connected) { |
waltercolitti | 0:eb280529b0ef | 185 | triggerSensorPolling = false; |
waltercolitti | 0:eb280529b0ef | 186 | |
waltercolitti | 0:eb280529b0ef | 187 | //Do blocking calls or whatever is necessary for sensor polling. |
waltercolitti | 0:eb280529b0ef | 188 | // error = sensor.readData(); |
waltercolitti | 0:eb280529b0ef | 189 | // if (!error) { |
waltercolitti | 0:eb280529b0ef | 190 | // thermometerService.updateTemperature(c); |
waltercolitti | 0:eb280529b0ef | 191 | // } |
waltercolitti | 0:eb280529b0ef | 192 | |
waltercolitti | 0:eb280529b0ef | 193 | temperatureService->updateTemperature(getTemperature()); |
waltercolitti | 0:eb280529b0ef | 194 | presenceService->updatePresence(presence_before); |
waltercolitti | 0:eb280529b0ef | 195 | } |
waltercolitti | 0:eb280529b0ef | 196 | ble.waitForEvent(); |
waltercolitti | 0:eb280529b0ef | 197 | |
waltercolitti | 0:eb280529b0ef | 198 | if(presence_now) { |
waltercolitti | 0:eb280529b0ef | 199 | led = 0; |
waltercolitti | 0:eb280529b0ef | 200 | //cnt++; |
waltercolitti | 0:eb280529b0ef | 201 | presence_now = 0; |
waltercolitti | 0:eb280529b0ef | 202 | //pc.printf("Presence detected \n", cnt); |
waltercolitti | 0:eb280529b0ef | 203 | wait(2); |
waltercolitti | 0:eb280529b0ef | 204 | led = 1; |
waltercolitti | 0:eb280529b0ef | 205 | } |
waltercolitti | 0:eb280529b0ef | 206 | } |
waltercolitti | 0:eb280529b0ef | 207 | } |