Adaptation of SMPIR for the Window Sensor Module of the Agile-IoT project.

Dependencies:   BLE_API mbed nRF51822

Fork of SensorModulePIR by ModoSmart

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?

UserRevisionLine numberNew 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 }