Dependencies:   BLE_API mbed BLE_nRF8001 DebounceIn

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?

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