works
Dependencies: BLE_nRF8001 DebounceIn mbed mbed_BLEtry2
Fork of mbed_BLEfinal by
main.cpp@5:7a4a5fbe72ac, 2015-04-18 (annotated)
- Committer:
- sitakumar
- Date:
- Sat Apr 18 00:24:29 2015 +0000
- Revision:
- 5:7a4a5fbe72ac
- Parent:
- 4:980b93c90fb7
4-17
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sitakumar | 0:11e1f075d0d2 | 1 | #include "mbed.h" |
sitakumar | 0:11e1f075d0d2 | 2 | #include "BLEPeripheral.h" |
sitakumar | 0:11e1f075d0d2 | 3 | |
sitakumar | 0:11e1f075d0d2 | 4 | //serial connection via USB |
sitakumar | 0:11e1f075d0d2 | 5 | Serial serial(USBTX, USBRX); |
sitakumar | 0:11e1f075d0d2 | 6 | |
sitakumar | 0:11e1f075d0d2 | 7 | //Declare Input and Output pins |
sitakumar | 0:11e1f075d0d2 | 8 | DigitalIn pb(D3); |
sitakumar | 0:11e1f075d0d2 | 9 | AnalogIn pH_sensor(A0); |
sitakumar | 0:11e1f075d0d2 | 10 | InterruptIn button(D2); |
sitakumar | 0:11e1f075d0d2 | 11 | DigitalOut led(LED_RED); |
sitakumar | 4:980b93c90fb7 | 12 | AnalogIn temp_sensor(A1); |
sitakumar | 0:11e1f075d0d2 | 13 | |
sitakumar | 0:11e1f075d0d2 | 14 | // The SPI construct, REQN and RDYN IO construct should be modified manually |
sitakumar | 0:11e1f075d0d2 | 15 | // It depend on the board you are using and the REQN&RDYN configuration on BLE Shield |
sitakumar | 0:11e1f075d0d2 | 16 | SPI spi(PTD2, PTD3, PTD1); |
sitakumar | 0:11e1f075d0d2 | 17 | DigitalInOut BLE_RDY(PTD5); |
sitakumar | 0:11e1f075d0d2 | 18 | DigitalInOut BLE_REQ(PTD0); |
sitakumar | 0:11e1f075d0d2 | 19 | DigitalInOut BLE_RESET(PTA13); |
sitakumar | 0:11e1f075d0d2 | 20 | |
sitakumar | 0:11e1f075d0d2 | 21 | //for BLE |
sitakumar | 0:11e1f075d0d2 | 22 | int count = 0; |
sitakumar | 5:7a4a5fbe72ac | 23 | unsigned char tempbuf[2] = {0}; |
sitakumar | 2:f4cedbb71ef9 | 24 | unsigned char templen = 0; |
sitakumar | 5:7a4a5fbe72ac | 25 | unsigned char decbuf[2] = {0}; |
sitakumar | 2:f4cedbb71ef9 | 26 | unsigned char declen = 0; |
sitakumar | 5:7a4a5fbe72ac | 27 | unsigned char pHbuf[2] = {0}; |
sitakumar | 2:f4cedbb71ef9 | 28 | unsigned char pHlen = 0; |
sitakumar | 0:11e1f075d0d2 | 29 | |
sitakumar | 0:11e1f075d0d2 | 30 | /*----- BLE Utility -------------------------------------------------------------------------*/ |
sitakumar | 0:11e1f075d0d2 | 31 | // create peripheral instance, see pinouts above |
sitakumar | 0:11e1f075d0d2 | 32 | BLEPeripheral blePeripheral = BLEPeripheral(&BLE_REQ, &BLE_RDY, NULL); |
sitakumar | 0:11e1f075d0d2 | 33 | |
sitakumar | 0:11e1f075d0d2 | 34 | // create service |
sitakumar | 0:11e1f075d0d2 | 35 | BLEService uartService = BLEService("713d0000503e4c75ba943148f18d941e"); |
sitakumar | 0:11e1f075d0d2 | 36 | |
sitakumar | 0:11e1f075d0d2 | 37 | // create characteristic |
sitakumar | 5:7a4a5fbe72ac | 38 | BLECharacteristic txCharacteristic = BLECharacteristic("713d0002503e4c75ba943148f18d941e", BLENotify, 20, 0); |
sitakumar | 2:f4cedbb71ef9 | 39 | BLECharacteristic rxCharacteristic = BLECharacteristic("713d0003503e4c75ba943148f18d941e", BLENotify, 20, 1); |
sitakumar | 0:11e1f075d0d2 | 40 | /*--------------------------------------------------------------------------------------------*/ |
sitakumar | 0:11e1f075d0d2 | 41 | unsigned int interval = 0; |
sitakumar | 0:11e1f075d0d2 | 42 | unsigned char count_on = 0; |
sitakumar | 0:11e1f075d0d2 | 43 | |
sitakumar | 0:11e1f075d0d2 | 44 | //for pH measurement |
sitakumar | 4:980b93c90fb7 | 45 | float calib = 0; |
sitakumar | 4:980b93c90fb7 | 46 | float calib2 = 0; |
sitakumar | 4:980b93c90fb7 | 47 | float avgReading = 0; |
sitakumar | 4:980b93c90fb7 | 48 | float avgTempReading = 0; |
sitakumar | 0:11e1f075d0d2 | 49 | bool calibrationORnot = true; |
sitakumar | 0:11e1f075d0d2 | 50 | bool ready = false; |
sitakumar | 4:980b93c90fb7 | 51 | //int* reading[] = {0,0}; |
sitakumar | 0:11e1f075d0d2 | 52 | |
sitakumar | 0:11e1f075d0d2 | 53 | |
sitakumar | 0:11e1f075d0d2 | 54 | //This loop takes a reading by taking 15 measurements and averaging them when it is called in the loop "measure" |
sitakumar | 4:980b93c90fb7 | 55 | float takepHReading() |
sitakumar | 0:11e1f075d0d2 | 56 | { |
sitakumar | 4:980b93c90fb7 | 57 | float totalVal = 0.0; |
sitakumar | 4:980b93c90fb7 | 58 | float pH_sensor_read = 0.0; |
sitakumar | 0:11e1f075d0d2 | 59 | int totalReadings = 0; |
sitakumar | 0:11e1f075d0d2 | 60 | while(totalReadings < 16){ |
sitakumar | 0:11e1f075d0d2 | 61 | pH_sensor_read = pH_sensor.read(); |
sitakumar | 0:11e1f075d0d2 | 62 | totalVal = totalVal + pH_sensor_read; |
sitakumar | 0:11e1f075d0d2 | 63 | totalReadings++; |
sitakumar | 0:11e1f075d0d2 | 64 | } |
sitakumar | 4:980b93c90fb7 | 65 | float avgSensor = totalVal/totalReadings; |
sitakumar | 0:11e1f075d0d2 | 66 | return avgSensor; |
sitakumar | 0:11e1f075d0d2 | 67 | } |
sitakumar | 4:980b93c90fb7 | 68 | |
sitakumar | 4:980b93c90fb7 | 69 | float takeTempReading() |
sitakumar | 4:980b93c90fb7 | 70 | { |
sitakumar | 4:980b93c90fb7 | 71 | float totalTempVal = 0.0; |
sitakumar | 4:980b93c90fb7 | 72 | float temp_sensor_read = 0.0; |
sitakumar | 4:980b93c90fb7 | 73 | int totalReadings2 = 0; |
sitakumar | 4:980b93c90fb7 | 74 | while(totalReadings2 < 30){ |
sitakumar | 4:980b93c90fb7 | 75 | temp_sensor_read = temp_sensor.read(); |
sitakumar | 4:980b93c90fb7 | 76 | totalTempVal = totalTempVal + temp_sensor_read; |
sitakumar | 4:980b93c90fb7 | 77 | totalReadings2++; |
sitakumar | 4:980b93c90fb7 | 78 | } |
sitakumar | 4:980b93c90fb7 | 79 | float avgTempSensor = totalTempVal/totalReadings2; |
sitakumar | 4:980b93c90fb7 | 80 | return avgTempSensor; |
sitakumar | 4:980b93c90fb7 | 81 | } |
sitakumar | 0:11e1f075d0d2 | 82 | |
sitakumar | 0:11e1f075d0d2 | 83 | void calibration() |
sitakumar | 0:11e1f075d0d2 | 84 | { |
sitakumar | 4:980b93c90fb7 | 85 | //serial.printf("enter calibration loop\n"); |
sitakumar | 0:11e1f075d0d2 | 86 | //Loop to take calibration value |
sitakumar | 4:980b93c90fb7 | 87 | calib = takepHReading(); |
sitakumar | 4:980b93c90fb7 | 88 | calib2 = takeTempReading(); |
sitakumar | 2:f4cedbb71ef9 | 89 | //serial.printf("calib is %d\n", calib); |
sitakumar | 0:11e1f075d0d2 | 90 | } |
sitakumar | 0:11e1f075d0d2 | 91 | |
sitakumar | 0:11e1f075d0d2 | 92 | void calculate() |
sitakumar | 0:11e1f075d0d2 | 93 | { |
sitakumar | 2:f4cedbb71ef9 | 94 | //serial.printf("entered calc\n"); |
sitakumar | 0:11e1f075d0d2 | 95 | //Take average of readings over 10 seconds |
sitakumar | 4:980b93c90fb7 | 96 | avgReading = takepHReading(); |
sitakumar | 4:980b93c90fb7 | 97 | avgTempReading = takeTempReading(); |
sitakumar | 2:f4cedbb71ef9 | 98 | //serial.printf("took reading\n"); |
sitakumar | 0:11e1f075d0d2 | 99 | ready = true; |
sitakumar | 0:11e1f075d0d2 | 100 | } |
sitakumar | 0:11e1f075d0d2 | 101 | |
sitakumar | 0:11e1f075d0d2 | 102 | void measure() |
sitakumar | 0:11e1f075d0d2 | 103 | { |
sitakumar | 0:11e1f075d0d2 | 104 | serial.baud(115200); |
sitakumar | 2:f4cedbb71ef9 | 105 | //serial.printf("start measurement"); |
sitakumar | 0:11e1f075d0d2 | 106 | //cb.mode(PullUp); |
sitakumar | 0:11e1f075d0d2 | 107 | if(calibrationORnot) |
sitakumar | 0:11e1f075d0d2 | 108 | { |
sitakumar | 0:11e1f075d0d2 | 109 | calibration(); |
sitakumar | 0:11e1f075d0d2 | 110 | calibrationORnot = !calibrationORnot; |
sitakumar | 0:11e1f075d0d2 | 111 | } |
sitakumar | 0:11e1f075d0d2 | 112 | //Loop to take measurement |
sitakumar | 0:11e1f075d0d2 | 113 | else if(!calibrationORnot) |
sitakumar | 0:11e1f075d0d2 | 114 | { |
sitakumar | 2:f4cedbb71ef9 | 115 | // serial.printf("enter measurement loop\n"); |
sitakumar | 2:f4cedbb71ef9 | 116 | // serial.printf("calib is %d\n", calib); |
sitakumar | 0:11e1f075d0d2 | 117 | calculate(); |
sitakumar | 0:11e1f075d0d2 | 118 | } |
sitakumar | 0:11e1f075d0d2 | 119 | } |
sitakumar | 0:11e1f075d0d2 | 120 | |
sitakumar | 0:11e1f075d0d2 | 121 | |
sitakumar | 0:11e1f075d0d2 | 122 | int main() |
sitakumar | 0:11e1f075d0d2 | 123 | { |
sitakumar | 0:11e1f075d0d2 | 124 | pb.mode(PullUp); |
sitakumar | 0:11e1f075d0d2 | 125 | serial.baud(115200); |
sitakumar | 0:11e1f075d0d2 | 126 | serial.printf("Hello SmartD!\n"); |
sitakumar | 0:11e1f075d0d2 | 127 | serial.printf("Serial begin!\r\n"); |
sitakumar | 2:f4cedbb71ef9 | 128 | float pH,yint,tempC,tempF; |
sitakumar | 0:11e1f075d0d2 | 129 | |
sitakumar | 0:11e1f075d0d2 | 130 | /*----- BLE Utility ---------------------------------------------*/ |
sitakumar | 0:11e1f075d0d2 | 131 | // set advertised local name and service UUID |
sitakumar | 0:11e1f075d0d2 | 132 | blePeripheral.setLocalName("Sita"); |
sitakumar | 0:11e1f075d0d2 | 133 | |
sitakumar | 0:11e1f075d0d2 | 134 | blePeripheral.setAdvertisedServiceUuid(uartService.uuid()); |
sitakumar | 0:11e1f075d0d2 | 135 | |
sitakumar | 0:11e1f075d0d2 | 136 | // add service and characteristic |
sitakumar | 0:11e1f075d0d2 | 137 | blePeripheral.addAttribute(uartService); |
sitakumar | 0:11e1f075d0d2 | 138 | blePeripheral.addAttribute(rxCharacteristic); |
sitakumar | 2:f4cedbb71ef9 | 139 | blePeripheral.addAttribute(txCharacteristic); |
sitakumar | 0:11e1f075d0d2 | 140 | |
sitakumar | 0:11e1f075d0d2 | 141 | // begin initialization |
sitakumar | 0:11e1f075d0d2 | 142 | blePeripheral.begin(); |
sitakumar | 0:11e1f075d0d2 | 143 | /*---------------------------------------------------------------*/ |
sitakumar | 0:11e1f075d0d2 | 144 | |
sitakumar | 0:11e1f075d0d2 | 145 | //serial.printf("GOT IT pH is %d, Temp is %d\n\r", reading[0], reading[1]); |
sitakumar | 2:f4cedbb71ef9 | 146 | serial.printf("\nBLE UART Peripheral begin!\r\n"); |
sitakumar | 0:11e1f075d0d2 | 147 | if (calibrationORnot) |
sitakumar | 0:11e1f075d0d2 | 148 | { |
sitakumar | 0:11e1f075d0d2 | 149 | button.rise(&measure); |
sitakumar | 0:11e1f075d0d2 | 150 | } |
sitakumar | 0:11e1f075d0d2 | 151 | |
sitakumar | 0:11e1f075d0d2 | 152 | while(1) |
sitakumar | 0:11e1f075d0d2 | 153 | { |
sitakumar | 0:11e1f075d0d2 | 154 | BLECentral central = blePeripheral.central(); |
sitakumar | 0:11e1f075d0d2 | 155 | if (ready) |
sitakumar | 0:11e1f075d0d2 | 156 | { |
sitakumar | 0:11e1f075d0d2 | 157 | //calcuating yintercept of the ADC -> pH equation using calibration value and given that calibration liquid is pH4 |
sitakumar | 0:11e1f075d0d2 | 158 | yint = (68.97*calib)-4; |
sitakumar | 2:f4cedbb71ef9 | 159 | //serial.printf("yint is %f", yint); |
sitakumar | 0:11e1f075d0d2 | 160 | //assumes linear relationship between pin readout -> voltage ->pH |
sitakumar | 0:11e1f075d0d2 | 161 | pH = (0.0209*3300)*(avgReading)-yint; |
sitakumar | 4:980b93c90fb7 | 162 | serial.printf("avgreading = %f & yint = %f F & calib = %f\n\r", avgReading, yint, calib); |
sitakumar | 4:980b93c90fb7 | 163 | |
sitakumar | 4:980b93c90fb7 | 164 | serial.printf("pH = %f\n\r", pH); |
sitakumar | 0:11e1f075d0d2 | 165 | //conversion to degrees C from sensor output voltage |
sitakumar | 4:980b93c90fb7 | 166 | tempC = (((3000*avgTempReading/1000) - 1.022129)/-0.0018496); |
sitakumar | 0:11e1f075d0d2 | 167 | tempF = (tempC *9/5) + 32; |
sitakumar | 0:11e1f075d0d2 | 168 | //print current pH and temp |
sitakumar | 2:f4cedbb71ef9 | 169 | serial.printf("pH = %f & temp = %f F\n\r", pH, tempF); |
sitakumar | 0:11e1f075d0d2 | 170 | ready = !ready; |
sitakumar | 0:11e1f075d0d2 | 171 | } |
sitakumar | 2:f4cedbb71ef9 | 172 | |
sitakumar | 0:11e1f075d0d2 | 173 | if (central) |
sitakumar | 0:11e1f075d0d2 | 174 | { |
sitakumar | 0:11e1f075d0d2 | 175 | // central connected to peripheral |
sitakumar | 0:11e1f075d0d2 | 176 | serial.printf("Connected to central\r\n"); |
sitakumar | 0:11e1f075d0d2 | 177 | while (central.connected()) |
sitakumar | 0:11e1f075d0d2 | 178 | { |
sitakumar | 2:f4cedbb71ef9 | 179 | if(!pb) |
sitakumar | 0:11e1f075d0d2 | 180 | { |
sitakumar | 2:f4cedbb71ef9 | 181 | tempF = 98.5; |
sitakumar | 2:f4cedbb71ef9 | 182 | int tempint = tempF; |
sitakumar | 2:f4cedbb71ef9 | 183 | int tempdecimal = (tempF-tempint)*100; |
sitakumar | 2:f4cedbb71ef9 | 184 | int pHint = pH; |
sitakumar | 2:f4cedbb71ef9 | 185 | int pHdecimal = (pH-pHint)*100; |
sitakumar | 5:7a4a5fbe72ac | 186 | serial.printf("pH = %d, pHdec = %d\n\r", pHint,pHdecimal); |
sitakumar | 2:f4cedbb71ef9 | 187 | // int tempint = 20; |
sitakumar | 2:f4cedbb71ef9 | 188 | // int tempdecimal = 23; |
sitakumar | 2:f4cedbb71ef9 | 189 | // int pHint = 9; |
sitakumar | 2:f4cedbb71ef9 | 190 | tempbuf[0]= tempint; |
sitakumar | 2:f4cedbb71ef9 | 191 | tempbuf[1] = tempdecimal; |
sitakumar | 2:f4cedbb71ef9 | 192 | //tempbuf[templen] = tempint; |
sitakumar | 2:f4cedbb71ef9 | 193 | //decbuf[declen] = decimal; |
sitakumar | 2:f4cedbb71ef9 | 194 | pHbuf[0] = pHint; |
sitakumar | 2:f4cedbb71ef9 | 195 | pHbuf[1] = pHdecimal; |
sitakumar | 2:f4cedbb71ef9 | 196 | interval++; |
sitakumar | 2:f4cedbb71ef9 | 197 | } |
sitakumar | 0:11e1f075d0d2 | 198 | |
sitakumar | 2:f4cedbb71ef9 | 199 | if(interval == 1) |
sitakumar | 2:f4cedbb71ef9 | 200 | { // If there is no char available last the interval, send the received chars to central. |
sitakumar | 2:f4cedbb71ef9 | 201 | //serial.printf("Received from terminal: %d bytes\r\n", templen); |
sitakumar | 2:f4cedbb71ef9 | 202 | txCharacteristic.setValue((const unsigned char *)tempbuf, 2); |
sitakumar | 2:f4cedbb71ef9 | 203 | txCharacteristic.setValue((const unsigned char *)pHbuf, 2); |
sitakumar | 2:f4cedbb71ef9 | 204 | serial.printf("done"); |
sitakumar | 2:f4cedbb71ef9 | 205 | wait(2); |
sitakumar | 2:f4cedbb71ef9 | 206 | interval = 0; |
sitakumar | 0:11e1f075d0d2 | 207 | } |
sitakumar | 0:11e1f075d0d2 | 208 | } |
sitakumar | 0:11e1f075d0d2 | 209 | // central disconnected |
sitakumar | 0:11e1f075d0d2 | 210 | serial.printf("Disconnected from central\r\n"); |
sitakumar | 0:11e1f075d0d2 | 211 | } |
sitakumar | 0:11e1f075d0d2 | 212 | } |
sitakumar | 0:11e1f075d0d2 | 213 | } |