![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Dependencies: BLE_API mbed BLE_nRF8001 DebounceIn
main.cpp@3:b3153fd49501, 2015-03-26 (annotated)
- Committer:
- sitakumar
- Date:
- Thu Mar 26 18:05:13 2015 +0000
- Revision:
- 3:b3153fd49501
- Parent:
- 2:f266f102ca80
This program takes a calibration when a button is pressed, takes the measurement and then sends pH and temp values through BLE. 3/26/15
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sitakumar | 0:adcc621e5713 | 1 | #include "mbed.h" |
sitakumar | 2:f266f102ca80 | 2 | #include "BLEPeripheral.h" |
sitakumar | 3:b3153fd49501 | 3 | |
sitakumar | 3:b3153fd49501 | 4 | //serial connection via USB |
sitakumar | 2:f266f102ca80 | 5 | Serial serial(USBTX, USBRX); |
sitakumar | 3:b3153fd49501 | 6 | |
sitakumar | 3:b3153fd49501 | 7 | //Declare Input and Output pins |
sitakumar | 3:b3153fd49501 | 8 | DigitalIn pb(D3); |
sitakumar | 3:b3153fd49501 | 9 | AnalogIn pH_sensor(A0); |
sitakumar | 3:b3153fd49501 | 10 | DigitalIn cb(D2); |
sitakumar | 3:b3153fd49501 | 11 | DigitalOut led(LED_RED); |
sitakumar | 3:b3153fd49501 | 12 | |
sitakumar | 2:f266f102ca80 | 13 | // The SPI construct, REQN and RDYN IO construct should be modified manually |
sitakumar | 2:f266f102ca80 | 14 | // It depend on the board you are using and the REQN&RDYN configuration on BLE Shield |
sitakumar | 2:f266f102ca80 | 15 | SPI spi(PTD2, PTD3, PTD1); |
sitakumar | 2:f266f102ca80 | 16 | DigitalInOut BLE_RDY(PTD5); |
sitakumar | 2:f266f102ca80 | 17 | DigitalInOut BLE_REQ(PTD0); |
sitakumar | 3:b3153fd49501 | 18 | DigitalInOut BLE_RESET(PTA13); |
sitakumar | 3:b3153fd49501 | 19 | |
sitakumar | 3:b3153fd49501 | 20 | //for BLE |
sitakumar | 2:f266f102ca80 | 21 | int count = 0; |
sitakumar | 2:f266f102ca80 | 22 | unsigned char txbuf[16] = {0}; |
sitakumar | 2:f266f102ca80 | 23 | unsigned char txlen = 0; |
sitakumar | 3:b3153fd49501 | 24 | |
sitakumar | 3:b3153fd49501 | 25 | //for pH measurement |
sitakumar | 3:b3153fd49501 | 26 | float calib = 0; |
sitakumar | 3:b3153fd49501 | 27 | float avgReading = 0; |
sitakumar | 3:b3153fd49501 | 28 | |
sitakumar | 3:b3153fd49501 | 29 | //This loop takes a reading by taking 15 measurements and averaging them when it is called in the loop "measure" |
sitakumar | 3:b3153fd49501 | 30 | int takeReading() |
sitakumar | 3:b3153fd49501 | 31 | { |
sitakumar | 3:b3153fd49501 | 32 | double totalVal = 0.0; |
sitakumar | 3:b3153fd49501 | 33 | double pH_sensor_read = 0.0; |
sitakumar | 3:b3153fd49501 | 34 | int totalReadings = 0; |
sitakumar | 3:b3153fd49501 | 35 | while(totalReadings < 16){ |
sitakumar | 3:b3153fd49501 | 36 | pH_sensor_read = pH_sensor.read(); |
sitakumar | 3:b3153fd49501 | 37 | totalVal = totalVal + pH_sensor_read; |
sitakumar | 3:b3153fd49501 | 38 | totalReadings++; |
sitakumar | 3:b3153fd49501 | 39 | } |
sitakumar | 3:b3153fd49501 | 40 | float avgSensor = totalVal/15; |
sitakumar | 3:b3153fd49501 | 41 | if (avgSensor > 0.3) |
sitakumar | 3:b3153fd49501 | 42 | { |
sitakumar | 3:b3153fd49501 | 43 | led = 1; |
sitakumar | 3:b3153fd49501 | 44 | } |
sitakumar | 3:b3153fd49501 | 45 | return avgSensor; |
sitakumar | 3:b3153fd49501 | 46 | } |
sitakumar | 3:b3153fd49501 | 47 | |
sitakumar | 3:b3153fd49501 | 48 | int* measure() |
sitakumar | 3:b3153fd49501 | 49 | { |
sitakumar | 3:b3153fd49501 | 50 | serial.baud(115200); |
sitakumar | 3:b3153fd49501 | 51 | serial.printf("start"); |
sitakumar | 3:b3153fd49501 | 52 | float voltage, pH, tempC, tempF,loopnumber,yint; |
sitakumar | 3:b3153fd49501 | 53 | cb.mode(PullUp); |
sitakumar | 3:b3153fd49501 | 54 | led = 0; |
sitakumar | 3:b3153fd49501 | 55 | loopnumber = 1; |
sitakumar | 3:b3153fd49501 | 56 | |
sitakumar | 3:b3153fd49501 | 57 | //Loop to run calibration value |
sitakumar | 3:b3153fd49501 | 58 | while(loopnumber==1) |
sitakumar | 3:b3153fd49501 | 59 | { |
sitakumar | 3:b3153fd49501 | 60 | if(!cb) |
sitakumar | 3:b3153fd49501 | 61 | { |
sitakumar | 3:b3153fd49501 | 62 | serial.printf("calib is %f\n", calib); |
sitakumar | 3:b3153fd49501 | 63 | calib = takeReading(); |
sitakumar | 3:b3153fd49501 | 64 | serial.printf("calib is %d\n", calib); |
sitakumar | 3:b3153fd49501 | 65 | loopnumber = 2; |
sitakumar | 3:b3153fd49501 | 66 | } |
sitakumar | 3:b3153fd49501 | 67 | } |
sitakumar | 3:b3153fd49501 | 68 | |
sitakumar | 3:b3153fd49501 | 69 | //Loop to take measurement |
sitakumar | 3:b3153fd49501 | 70 | while(loopnumber==2) |
sitakumar | 3:b3153fd49501 | 71 | { |
sitakumar | 3:b3153fd49501 | 72 | serial.printf("enter new loop\n"); |
sitakumar | 3:b3153fd49501 | 73 | serial.printf("calib is %d\n", calib); |
sitakumar | 3:b3153fd49501 | 74 | //Take average of readings over 10 seconds |
sitakumar | 3:b3153fd49501 | 75 | avgReading = takeReading(); |
sitakumar | 3:b3153fd49501 | 76 | //Hard coded calibration values taken at pH 4 solution to return voltage in mV |
sitakumar | 3:b3153fd49501 | 77 | //.24 is the pin read out at pH4 |
sitakumar | 3:b3153fd49501 | 78 | //800 is mV at ph4 |
sitakumar | 3:b3153fd49501 | 79 | //voltage = avgReading*(800/.24); |
sitakumar | 3:b3153fd49501 | 80 | |
sitakumar | 3:b3153fd49501 | 81 | //trying to get voltage straight from MicroController -- this command does not work |
sitakumar | 3:b3153fd49501 | 82 | //voltage = ADC_GetConversionValue(pH_sensor); |
sitakumar | 3:b3153fd49501 | 83 | |
sitakumar | 3:b3153fd49501 | 84 | //conversion to pH from sensor output voltage per LM61 data sheet |
sitakumar | 3:b3153fd49501 | 85 | //pH = (0.0209*voltage)-12.696; |
sitakumar | 3:b3153fd49501 | 86 | |
sitakumar | 3:b3153fd49501 | 87 | //calcuating yintercept of the ADC -> pH equation using calibration value and given that calibration liquid is pH4 |
sitakumar | 3:b3153fd49501 | 88 | yint = (68.97*calib)-4; |
sitakumar | 3:b3153fd49501 | 89 | serial.printf("yint is %f", yint); |
sitakumar | 3:b3153fd49501 | 90 | //assumes linear relationship between pin readout -> voltage ->pH |
sitakumar | 3:b3153fd49501 | 91 | pH = (0.0209*3300)*(avgReading)-yint; |
sitakumar | 3:b3153fd49501 | 92 | //conversion to degrees C from sensor output voltage |
sitakumar | 3:b3153fd49501 | 93 | tempC = (((voltage/1000) - 1.022129)/-0.0018496); |
sitakumar | 3:b3153fd49501 | 94 | tempF = (tempC *9/5) + 32; |
sitakumar | 3:b3153fd49501 | 95 | //print current pH and temp |
sitakumar | 3:b3153fd49501 | 96 | serial.printf("pH = %5.2F & temp = %5.2F F\n\r", pH, tempF); |
sitakumar | 3:b3153fd49501 | 97 | } |
sitakumar | 3:b3153fd49501 | 98 | int pHtemparray[] = {pH,tempF}; |
sitakumar | 3:b3153fd49501 | 99 | return pHtemparray; |
sitakumar | 3:b3153fd49501 | 100 | } |
sitakumar | 3:b3153fd49501 | 101 | |
sitakumar | 3:b3153fd49501 | 102 | |
sitakumar | 2:f266f102ca80 | 103 | /*----- BLE Utility -------------------------------------------------------------------------*/ |
sitakumar | 2:f266f102ca80 | 104 | // create peripheral instance, see pinouts above |
sitakumar | 2:f266f102ca80 | 105 | BLEPeripheral blePeripheral = BLEPeripheral(&BLE_REQ, &BLE_RDY, NULL); |
sitakumar | 2:f266f102ca80 | 106 | |
sitakumar | 2:f266f102ca80 | 107 | // create service |
sitakumar | 2:f266f102ca80 | 108 | BLEService uartService = BLEService("713d0000503e4c75ba943148f18d941e"); |
sitakumar | 2:f266f102ca80 | 109 | |
sitakumar | 2:f266f102ca80 | 110 | // create characteristic |
sitakumar | 2:f266f102ca80 | 111 | BLECharacteristic txCharacteristic = BLECharacteristic("713d0002503e4c75ba943148f18d941e", BLENotify, 20); |
sitakumar | 2:f266f102ca80 | 112 | BLECharacteristic rxCharacteristic = BLECharacteristic("713d0003503e4c75ba943148f18d941e", BLEWriteWithoutResponse, 20); |
sitakumar | 2:f266f102ca80 | 113 | /*--------------------------------------------------------------------------------------------*/ |
sitakumar | 2:f266f102ca80 | 114 | |
sitakumar | 2:f266f102ca80 | 115 | unsigned int interval = 0; |
sitakumar | 2:f266f102ca80 | 116 | unsigned char count_on = 0; |
sitakumar | 2:f266f102ca80 | 117 | |
sitakumar | 2:f266f102ca80 | 118 | int main() |
sitakumar | 2:f266f102ca80 | 119 | { |
sitakumar | 3:b3153fd49501 | 120 | |
sitakumar | 3:b3153fd49501 | 121 | pb.mode(PullUp); |
sitakumar | 3:b3153fd49501 | 122 | serial.baud(115200); |
sitakumar | 2:f266f102ca80 | 123 | serial.printf("Hello SmartD!\n"); |
sitakumar | 2:f266f102ca80 | 124 | serial.printf("Serial begin!\r\n"); |
sitakumar | 3:b3153fd49501 | 125 | void begin(); |
sitakumar | 3:b3153fd49501 | 126 | |
sitakumar | 2:f266f102ca80 | 127 | /*----- BLE Utility ---------------------------------------------*/ |
sitakumar | 2:f266f102ca80 | 128 | // set advertised local name and service UUID |
sitakumar | 2:f266f102ca80 | 129 | blePeripheral.setLocalName("Sita"); |
sitakumar | 2:f266f102ca80 | 130 | |
sitakumar | 2:f266f102ca80 | 131 | blePeripheral.setAdvertisedServiceUuid(uartService.uuid()); |
sitakumar | 3:b3153fd49501 | 132 | |
sitakumar | 2:f266f102ca80 | 133 | // add service and characteristic |
sitakumar | 2:f266f102ca80 | 134 | blePeripheral.addAttribute(uartService); |
sitakumar | 2:f266f102ca80 | 135 | blePeripheral.addAttribute(rxCharacteristic); |
sitakumar | 2:f266f102ca80 | 136 | blePeripheral.addAttribute(txCharacteristic); |
sitakumar | 3:b3153fd49501 | 137 | |
sitakumar | 2:f266f102ca80 | 138 | // begin initialization |
sitakumar | 2:f266f102ca80 | 139 | blePeripheral.begin(); |
sitakumar | 2:f266f102ca80 | 140 | /*---------------------------------------------------------------*/ |
sitakumar | 2:f266f102ca80 | 141 | |
sitakumar | 2:f266f102ca80 | 142 | serial.printf("BLE UART Peripheral begin!\r\n"); |
sitakumar | 3:b3153fd49501 | 143 | int* reading = measure(); |
sitakumar | 3:b3153fd49501 | 144 | serial.printf("pH is %d, Temp is %d\n\r", reading[0], reading[1]); |
sitakumar | 2:f266f102ca80 | 145 | while(1) |
sitakumar | 2:f266f102ca80 | 146 | { |
sitakumar | 2:f266f102ca80 | 147 | BLECentral central = blePeripheral.central(); |
sitakumar | 2:f266f102ca80 | 148 | if (central) |
sitakumar | 2:f266f102ca80 | 149 | { |
sitakumar | 2:f266f102ca80 | 150 | // central connected to peripheral |
sitakumar | 2:f266f102ca80 | 151 | serial.printf("Connected to central\r\n"); |
sitakumar | 2:f266f102ca80 | 152 | while (central.connected()) |
sitakumar | 2:f266f102ca80 | 153 | { |
sitakumar | 3:b3153fd49501 | 154 | if (!pb) // if button pushed |
sitakumar | 2:f266f102ca80 | 155 | { |
sitakumar | 3:b3153fd49501 | 156 | // Read and send out pH value from measure function |
sitakumar | 3:b3153fd49501 | 157 | unsigned short value = reading[0]; |
sitakumar | 3:b3153fd49501 | 158 | const unsigned char val[1] = {value}; |
sitakumar | 3:b3153fd49501 | 159 | txCharacteristic.setValue(val,1); |
sitakumar | 2:f266f102ca80 | 160 | } |
sitakumar | 2:f266f102ca80 | 161 | } |
sitakumar | 2:f266f102ca80 | 162 | |
sitakumar | 2:f266f102ca80 | 163 | // central disconnected |
sitakumar | 2:f266f102ca80 | 164 | serial.printf("Disconnected from central\r\n"); |
sitakumar | 2:f266f102ca80 | 165 | } |
sitakumar | 2:f266f102ca80 | 166 | } |
sitakumar | 3:b3153fd49501 | 167 | } |