works

Dependencies:   BLE_nRF8001 DebounceIn mbed mbed_BLEtry2

Fork of mbed_BLEfinal by SmartD

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?

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