Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code
Sensor/ReadSensor.cpp@55:c405323f8d5a, 2018-03-29 (annotated)
- Committer:
- DuyLionTran
- Date:
- Thu Mar 29 16:52:35 2018 +0000
- Revision:
- 55:c405323f8d5a
- Parent:
- 49:d45c534ec444
* version 2.9.7 03-29-2018: Try to upload 1 more time if upload fail
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| DuyLionTran | 32:8226837c56ae | 1 | #include "mbed.h" |
| DuyLionTran | 40:4356c209c58d | 2 | #include "DS1820.h" |
| DuyLionTran | 32:8226837c56ae | 3 | #include "ReadSensor.h" |
| DuyLionTran | 38:64e3e9acb49c | 4 | #include "flash_programming.h" |
| DuyLionTran | 32:8226837c56ae | 5 | |
| DuyLionTran | 36:d0b628087ac8 | 6 | const float SaturationValueTab[41] = { /* saturation dissolved oxygen concentrations at various temperatures */ |
| DuyLionTran | 41:6aed398adcc4 | 7 | 14.46, 14.22, 13.82, 13.44, 13.09, /* 0 degree Celcius */ |
| DuyLionTran | 32:8226837c56ae | 8 | 12.74, 12.42, 12.11, 11.81, 11.53, |
| DuyLionTran | 32:8226837c56ae | 9 | 11.26, 11.01, 10.77, 10.53, 10.30, |
| DuyLionTran | 32:8226837c56ae | 10 | 10.08, 9.86, 9.66, 9.46, 9.27, |
| DuyLionTran | 32:8226837c56ae | 11 | 9.08, 8.90, 8.73, 8.57, 8.41, |
| DuyLionTran | 32:8226837c56ae | 12 | 8.25, 8.11, 7.96, 7.82, 7.69, |
| DuyLionTran | 32:8226837c56ae | 13 | 7.56, 7.43, 7.30, 7.18, 7.07, |
| DuyLionTran | 32:8226837c56ae | 14 | 6.95, 6.84, 6.73, 6.63, 6.53, |
| DuyLionTran | 41:6aed398adcc4 | 15 | 6.41, /* 40 degree Celcius */ |
| DuyLionTran | 32:8226837c56ae | 16 | }; |
| DuyLionTran | 32:8226837c56ae | 17 | |
| DuyLionTran | 41:6aed398adcc4 | 18 | enum { |
| DuyLionTran | 41:6aed398adcc4 | 19 | CALIBRATION = 1, |
| DuyLionTran | 41:6aed398adcc4 | 20 | SATCAL, |
| DuyLionTran | 41:6aed398adcc4 | 21 | EXIT |
| DuyLionTran | 41:6aed398adcc4 | 22 | } Calibration_Mode; |
| DuyLionTran | 41:6aed398adcc4 | 23 | |
| DuyLionTran | 41:6aed398adcc4 | 24 | float doValue; /* current dissolved oxygen value, unit; mg/L or ppm */ |
| DuyLionTran | 41:6aed398adcc4 | 25 | #ifdef PROBE_EXIST |
| DuyLionTran | 41:6aed398adcc4 | 26 | float temperature; |
| DuyLionTran | 41:6aed398adcc4 | 27 | #else |
| DuyLionTran | 41:6aed398adcc4 | 28 | float temperature = 25.0; /* default temperature is 25^C, you can use a temperature sensor to read it */ |
| DuyLionTran | 41:6aed398adcc4 | 29 | #endif |
| DuyLionTran | 36:d0b628087ac8 | 30 | int analogBuffer[SCOUNT]; /* store the analog value in the array, readed from ADC */ |
| DuyLionTran | 36:d0b628087ac8 | 31 | int analogBufferTemp[SCOUNT]; |
| DuyLionTran | 41:6aed398adcc4 | 32 | int analogBufferIndex = 0; |
| DuyLionTran | 41:6aed398adcc4 | 33 | int copyIndex = 0; |
| DuyLionTran | 41:6aed398adcc4 | 34 | float SaturationDoVoltage; /* mV */ |
| DuyLionTran | 41:6aed398adcc4 | 35 | float SaturationDoTemperature; /* ^C */ |
| DuyLionTran | 41:6aed398adcc4 | 36 | float averageVoltage; |
| DuyLionTran | 41:6aed398adcc4 | 37 | bool isCalibrating = false; |
| DuyLionTran | 41:6aed398adcc4 | 38 | |
| DuyLionTran | 49:d45c534ec444 | 39 | AnalogIn DOSensor(SENSOR_2_PIN); |
| DuyLionTran | 45:92da959d624b | 40 | |
| DuyLionTran | 45:92da959d624b | 41 | /* Error often occurs here */ |
| DuyLionTran | 49:d45c534ec444 | 42 | DS1820 probe(SENSOR_1_PIN); |
| DuyLionTran | 32:8226837c56ae | 43 | |
| DuyLionTran | 36:d0b628087ac8 | 44 | int getMedianNum(int bArray[], int iFilterLen) { |
| DuyLionTran | 36:d0b628087ac8 | 45 | int bTab[iFilterLen]; |
| DuyLionTran | 36:d0b628087ac8 | 46 | for (uint8_t i = 0; i < iFilterLen; i++) { |
| DuyLionTran | 36:d0b628087ac8 | 47 | bTab[i] = bArray[i]; |
| DuyLionTran | 36:d0b628087ac8 | 48 | } |
| DuyLionTran | 38:64e3e9acb49c | 49 | int i, j; |
| DuyLionTran | 38:64e3e9acb49c | 50 | int bTemp; |
| DuyLionTran | 36:d0b628087ac8 | 51 | for (j = 0; j < iFilterLen - 1; j++) { |
| DuyLionTran | 36:d0b628087ac8 | 52 | for (i = 0; i < iFilterLen - j - 1; i++) { |
| DuyLionTran | 36:d0b628087ac8 | 53 | if (bTab[i] > bTab[i + 1]) { |
| DuyLionTran | 36:d0b628087ac8 | 54 | bTemp = bTab[i]; |
| DuyLionTran | 36:d0b628087ac8 | 55 | bTab[i] = bTab[i + 1]; |
| DuyLionTran | 36:d0b628087ac8 | 56 | bTab[i + 1] = bTemp; |
| DuyLionTran | 36:d0b628087ac8 | 57 | } |
| DuyLionTran | 36:d0b628087ac8 | 58 | } |
| DuyLionTran | 36:d0b628087ac8 | 59 | } |
| DuyLionTran | 36:d0b628087ac8 | 60 | if ((iFilterLen & 1) > 0) { |
| DuyLionTran | 36:d0b628087ac8 | 61 | bTemp = bTab[(iFilterLen - 1) / 2]; |
| DuyLionTran | 36:d0b628087ac8 | 62 | } |
| DuyLionTran | 36:d0b628087ac8 | 63 | else { |
| DuyLionTran | 36:d0b628087ac8 | 64 | bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2; |
| DuyLionTran | 36:d0b628087ac8 | 65 | } |
| DuyLionTran | 36:d0b628087ac8 | 66 | return bTemp; |
| DuyLionTran | 36:d0b628087ac8 | 67 | } |
| DuyLionTran | 36:d0b628087ac8 | 68 | |
| DuyLionTran | 36:d0b628087ac8 | 69 | void SENSOR_AnalogRead() { |
| DuyLionTran | 41:6aed398adcc4 | 70 | /* Convert from 0 - 1 (float) resolution to 10-bit ADC resolution */ |
| DuyLionTran | 41:6aed398adcc4 | 71 | /* Same as the example from DFRobot Arduino */ |
| DuyLionTran | 38:64e3e9acb49c | 72 | float analogReadRaw = DOSensor.read(); |
| DuyLionTran | 38:64e3e9acb49c | 73 | float voltageRaw = analogReadRaw*3.3; |
| DuyLionTran | 38:64e3e9acb49c | 74 | analogBuffer[analogBufferIndex] = (int)((voltageRaw * 1023.0)/5.0); |
| DuyLionTran | 41:6aed398adcc4 | 75 | |
| DuyLionTran | 43:dcde0e66874a | 76 | // printf("Analog read %d %d\r\n", analogBufferIndex, analogBuffer[analogBufferIndex]); |
| DuyLionTran | 36:d0b628087ac8 | 77 | analogBufferIndex++; |
| DuyLionTran | 36:d0b628087ac8 | 78 | if(analogBufferIndex == SCOUNT) { |
| DuyLionTran | 36:d0b628087ac8 | 79 | analogBufferIndex = 0; |
| DuyLionTran | 36:d0b628087ac8 | 80 | } |
| DuyLionTran | 36:d0b628087ac8 | 81 | } |
| DuyLionTran | 36:d0b628087ac8 | 82 | |
| DuyLionTran | 36:d0b628087ac8 | 83 | void SENSOR_GetDOValue() { |
| DuyLionTran | 41:6aed398adcc4 | 84 | /* Read temperature */ |
| DuyLionTran | 41:6aed398adcc4 | 85 | #ifdef PROBE_EXIST |
| DuyLionTran | 49:d45c534ec444 | 86 | wait(0.2); |
| DuyLionTran | 49:d45c534ec444 | 87 | probe.startConversion(); |
| DuyLionTran | 49:d45c534ec444 | 88 | temperature = probe.read(); |
| DuyLionTran | 41:6aed398adcc4 | 89 | #endif |
| DuyLionTran | 41:6aed398adcc4 | 90 | |
| DuyLionTran | 36:d0b628087ac8 | 91 | for(copyIndex = 0; copyIndex < SCOUNT; copyIndex++) { |
| DuyLionTran | 36:d0b628087ac8 | 92 | analogBufferTemp[copyIndex]= analogBuffer[copyIndex]; |
| DuyLionTran | 36:d0b628087ac8 | 93 | } |
| DuyLionTran | 36:d0b628087ac8 | 94 | /* read the value more stable by the median filtering algorithm */ |
| DuyLionTran | 38:64e3e9acb49c | 95 | averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF/1024.0; |
| DuyLionTran | 37:338e3bc04e57 | 96 | printf("Average voltage %.2f\r\n", averageVoltage); |
| DuyLionTran | 36:d0b628087ac8 | 97 | /* calculate the do value, doValue = Voltage / SaturationDoVoltage * SaturationDoValue(with temperature compensation) */ |
| DuyLionTran | 41:6aed398adcc4 | 98 | SaturationDoTemperature = temperature; |
| DuyLionTran | 39:a5ee98bd0050 | 99 | doValue = (SaturationValueTab[(int)(SaturationDoTemperature + 0.5)] * averageVoltage) / (float)(SaturationDoVoltage); |
| DuyLionTran | 38:64e3e9acb49c | 100 | float a = 1; |
| DuyLionTran | 43:dcde0e66874a | 101 | printf("SaturationDoTemperature %.2f; SaturationDoVoltage %.2f; DO Value %.2f mg/L\r\n", SaturationDoTemperature, SaturationDoVoltage, doValue/a); |
| DuyLionTran | 36:d0b628087ac8 | 102 | } |
| DuyLionTran | 32:8226837c56ae | 103 | |
| DuyLionTran | 41:6aed398adcc4 | 104 | void SENSOR_DoCalibration(uint8_t CurrentCalibrationMode) { |
| DuyLionTran | 41:6aed398adcc4 | 105 | static bool doCalibrationFinishFlag = false, enterCalibrationFlag = false; |
| DuyLionTran | 41:6aed398adcc4 | 106 | float voltageValueStore; |
| DuyLionTran | 32:8226837c56ae | 107 | |
| DuyLionTran | 41:6aed398adcc4 | 108 | switch (CurrentCalibrationMode) { |
| DuyLionTran | 41:6aed398adcc4 | 109 | case 0: |
| DuyLionTran | 41:6aed398adcc4 | 110 | if(enterCalibrationFlag) { |
| DuyLionTran | 41:6aed398adcc4 | 111 | printf("Command Error\r\n"); |
| DuyLionTran | 41:6aed398adcc4 | 112 | } |
| DuyLionTran | 41:6aed398adcc4 | 113 | break; |
| DuyLionTran | 41:6aed398adcc4 | 114 | |
| DuyLionTran | 41:6aed398adcc4 | 115 | case CALIBRATION: |
| DuyLionTran | 41:6aed398adcc4 | 116 | enterCalibrationFlag = true; |
| DuyLionTran | 41:6aed398adcc4 | 117 | doCalibrationFinishFlag = false; |
| DuyLionTran | 41:6aed398adcc4 | 118 | printf(">>>Enter Calibration Mode<<<\r\n"); |
| DuyLionTran | 41:6aed398adcc4 | 119 | printf(">>>Please put the probe into the saturation oxygen water!<<<\r\n\r\n"); |
| DuyLionTran | 41:6aed398adcc4 | 120 | break; |
| DuyLionTran | 41:6aed398adcc4 | 121 | |
| DuyLionTran | 41:6aed398adcc4 | 122 | case SATCAL: |
| DuyLionTran | 41:6aed398adcc4 | 123 | if (enterCalibrationFlag) { |
| DuyLionTran | 41:6aed398adcc4 | 124 | printf("\r\n>>>Saturation Calibration Finish!<<<\r\n\r\n"); |
| DuyLionTran | 41:6aed398adcc4 | 125 | /* Convert from float to uint32_t */ |
| DuyLionTran | 41:6aed398adcc4 | 126 | uint32_t tempAverageVoltage = (uint32_t)averageVoltage; |
| DuyLionTran | 41:6aed398adcc4 | 127 | if ((averageVoltage - 0.5) >= (float)(tempAverageVoltage)) { |
| DuyLionTran | 41:6aed398adcc4 | 128 | tempAverageVoltage++; |
| DuyLionTran | 41:6aed398adcc4 | 129 | } |
| DuyLionTran | 41:6aed398adcc4 | 130 | printf("averageVoltage %d\r\n", (uint32_t)tempAverageVoltage); |
| DuyLionTran | 41:6aed398adcc4 | 131 | |
| DuyLionTran | 41:6aed398adcc4 | 132 | FP_WriteConfigValues((uint32_t)(tempAverageVoltage)); |
| DuyLionTran | 41:6aed398adcc4 | 133 | SaturationDoVoltage = averageVoltage; |
| DuyLionTran | 41:6aed398adcc4 | 134 | doCalibrationFinishFlag = true; |
| DuyLionTran | 41:6aed398adcc4 | 135 | } |
| DuyLionTran | 41:6aed398adcc4 | 136 | break; |
| DuyLionTran | 41:6aed398adcc4 | 137 | |
| DuyLionTran | 41:6aed398adcc4 | 138 | case EXIT: |
| DuyLionTran | 41:6aed398adcc4 | 139 | if (enterCalibrationFlag) { |
| DuyLionTran | 41:6aed398adcc4 | 140 | if(doCalibrationFinishFlag) { |
| DuyLionTran | 41:6aed398adcc4 | 141 | printf("\r\n>>>Calibration Successful\r\n"); |
| DuyLionTran | 41:6aed398adcc4 | 142 | } |
| DuyLionTran | 41:6aed398adcc4 | 143 | else { |
| DuyLionTran | 41:6aed398adcc4 | 144 | printf(">>>Calibration Failed\r\n"); |
| DuyLionTran | 41:6aed398adcc4 | 145 | } |
| DuyLionTran | 41:6aed398adcc4 | 146 | printf("Exit Calibration Mode<<<\r\n\r\n"); |
| DuyLionTran | 41:6aed398adcc4 | 147 | doCalibrationFinishFlag = false; |
| DuyLionTran | 41:6aed398adcc4 | 148 | enterCalibrationFlag = false; |
| DuyLionTran | 55:c405323f8d5a | 149 | NVIC_SystemReset(); |
| DuyLionTran | 41:6aed398adcc4 | 150 | } |
| DuyLionTran | 41:6aed398adcc4 | 151 | break; |
| DuyLionTran | 41:6aed398adcc4 | 152 | |
| DuyLionTran | 41:6aed398adcc4 | 153 | default: break; |
| DuyLionTran | 41:6aed398adcc4 | 154 | } |
| DuyLionTran | 38:64e3e9acb49c | 155 | } |
| DuyLionTran | 38:64e3e9acb49c | 156 | |
| DuyLionTran | 38:64e3e9acb49c | 157 | void SENSOR_ReadDoCharacteristicValues() { |
| DuyLionTran | 49:d45c534ec444 | 158 | if (probe.begin()) { |
| DuyLionTran | 49:d45c534ec444 | 159 | printf("sensor found\r\n"); |
| DuyLionTran | 49:d45c534ec444 | 160 | probe.startConversion(); |
| DuyLionTran | 49:d45c534ec444 | 161 | wait(0.5); |
| DuyLionTran | 49:d45c534ec444 | 162 | } |
| DuyLionTran | 38:64e3e9acb49c | 163 | uint32_t int_SaturationDoVoltage = FP_ReadValue(SAT_DO_VOLT_ADDRESS); |
| DuyLionTran | 38:64e3e9acb49c | 164 | printf("Read SaturationDoVoltage %d\r\n", int_SaturationDoVoltage); |
| DuyLionTran | 38:64e3e9acb49c | 165 | SaturationDoVoltage = (float)int_SaturationDoVoltage; |
| DuyLionTran | 38:64e3e9acb49c | 166 | printf("SaturationDoVoltage %f\r\n", SaturationDoVoltage); |
| DuyLionTran | 38:64e3e9acb49c | 167 | if (FP_ReadValue(SAT_DO_VOLT_ADDRESS) == 0xFF) { |
| DuyLionTran | 38:64e3e9acb49c | 168 | /* default voltage: 1127V */ |
| DuyLionTran | 38:64e3e9acb49c | 169 | SaturationDoVoltage = 1127.6; |
| DuyLionTran | 38:64e3e9acb49c | 170 | int_SaturationDoVoltage = (uint32_t)SaturationDoVoltage; |
| DuyLionTran | 38:64e3e9acb49c | 171 | if ((SaturationDoVoltage - 0.5) >= (float)(int_SaturationDoVoltage)) { |
| DuyLionTran | 38:64e3e9acb49c | 172 | int_SaturationDoVoltage++; |
| DuyLionTran | 38:64e3e9acb49c | 173 | } |
| DuyLionTran | 38:64e3e9acb49c | 174 | printf("SaturationDoVoltage %d\r\n", (uint32_t)int_SaturationDoVoltage); |
| DuyLionTran | 38:64e3e9acb49c | 175 | FP_WriteConfigValues((uint32_t)(int_SaturationDoVoltage)); |
| DuyLionTran | 38:64e3e9acb49c | 176 | } |
| DuyLionTran | 18:5585365d6951 | 177 | } |