iot_water_monitor_v2
Dependencies: easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code
ReadSensor.cpp
00001 #include "mbed.h" 00002 #include "DS1820.h" 00003 #include "ReadSensor.h" 00004 #include "flash_programming.h" 00005 00006 const float SaturationValueTab[41] = { /* saturation dissolved oxygen concentrations at various temperatures */ 00007 14.46, 14.22, 13.82, 13.44, 13.09, /* 0 degree Celcius */ 00008 12.74, 12.42, 12.11, 11.81, 11.53, 00009 11.26, 11.01, 10.77, 10.53, 10.30, 00010 10.08, 9.86, 9.66, 9.46, 9.27, 00011 9.08, 8.90, 8.73, 8.57, 8.41, 00012 8.25, 8.11, 7.96, 7.82, 7.69, 00013 7.56, 7.43, 7.30, 7.18, 7.07, 00014 6.95, 6.84, 6.73, 6.63, 6.53, 00015 6.41, /* 40 degree Celcius */ 00016 }; 00017 00018 enum { 00019 CALIBRATION = 1, 00020 SATCAL, 00021 EXIT 00022 } Calibration_Mode; 00023 00024 float doValue; /* current dissolved oxygen value, unit; mg/L or ppm */ 00025 #ifdef PROBE_EXIST 00026 float temperature; 00027 #else 00028 float temperature = 25.0; /* default temperature is 25^C, you can use a temperature sensor to read it */ 00029 #endif 00030 int analogBuffer[SCOUNT]; /* store the analog value in the array, readed from ADC */ 00031 int analogBufferTemp[SCOUNT]; 00032 int analogBufferIndex = 0; 00033 int copyIndex = 0; 00034 float SaturationDoVoltage; /* mV */ 00035 float SaturationDoTemperature; /* ^C */ 00036 float averageVoltage; 00037 bool isCalibrating = false; 00038 00039 AnalogIn DOSensor(SENSOR_2_PIN); 00040 00041 /* Error often occurs here */ 00042 DS1820 probe(SENSOR_1_PIN); 00043 00044 int getMedianNum(int bArray[], int iFilterLen) { 00045 int bTab[iFilterLen]; 00046 for (uint8_t i = 0; i < iFilterLen; i++) { 00047 bTab[i] = bArray[i]; 00048 } 00049 int i, j; 00050 int bTemp; 00051 for (j = 0; j < iFilterLen - 1; j++) { 00052 for (i = 0; i < iFilterLen - j - 1; i++) { 00053 if (bTab[i] > bTab[i + 1]) { 00054 bTemp = bTab[i]; 00055 bTab[i] = bTab[i + 1]; 00056 bTab[i + 1] = bTemp; 00057 } 00058 } 00059 } 00060 if ((iFilterLen & 1) > 0) { 00061 bTemp = bTab[(iFilterLen - 1) / 2]; 00062 } 00063 else { 00064 bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2; 00065 } 00066 return bTemp; 00067 } 00068 00069 void SENSOR_AnalogRead() { 00070 /* Convert from 0 - 1 (float) resolution to 10-bit ADC resolution */ 00071 /* Same as the example from DFRobot Arduino */ 00072 float analogReadRaw = DOSensor.read(); 00073 float voltageRaw = analogReadRaw*3.3; 00074 analogBuffer[analogBufferIndex] = (int)((voltageRaw * 1023.0)/5.0); 00075 00076 // printf("Analog read %d %d\r\n", analogBufferIndex, analogBuffer[analogBufferIndex]); 00077 analogBufferIndex++; 00078 if(analogBufferIndex == SCOUNT) { 00079 analogBufferIndex = 0; 00080 } 00081 } 00082 00083 void SENSOR_GetDOValue() { 00084 /* Read temperature */ 00085 #ifdef PROBE_EXIST 00086 wait(0.2); 00087 probe.startConversion(); 00088 temperature = probe.read(); 00089 #endif 00090 00091 for(copyIndex = 0; copyIndex < SCOUNT; copyIndex++) { 00092 analogBufferTemp[copyIndex]= analogBuffer[copyIndex]; 00093 } 00094 /* read the value more stable by the median filtering algorithm */ 00095 averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF/1024.0; 00096 printf("Average voltage %.2f\r\n", averageVoltage); 00097 /* calculate the do value, doValue = Voltage / SaturationDoVoltage * SaturationDoValue(with temperature compensation) */ 00098 SaturationDoTemperature = temperature; 00099 doValue = (SaturationValueTab[(int)(SaturationDoTemperature + 0.5)] * averageVoltage) / (float)(SaturationDoVoltage); 00100 float a = 1; 00101 printf("SaturationDoTemperature %.2f; SaturationDoVoltage %.2f; DO Value %.2f mg/L\r\n", SaturationDoTemperature, SaturationDoVoltage, doValue/a); 00102 } 00103 00104 void SENSOR_DoCalibration(uint8_t CurrentCalibrationMode) { 00105 static bool doCalibrationFinishFlag = false, enterCalibrationFlag = false; 00106 float voltageValueStore; 00107 00108 switch (CurrentCalibrationMode) { 00109 case 0: 00110 if(enterCalibrationFlag) { 00111 printf("Command Error\r\n"); 00112 } 00113 break; 00114 00115 case CALIBRATION: 00116 enterCalibrationFlag = true; 00117 doCalibrationFinishFlag = false; 00118 printf(">>>Enter Calibration Mode<<<\r\n"); 00119 printf(">>>Please put the probe into the saturation oxygen water!<<<\r\n\r\n"); 00120 break; 00121 00122 case SATCAL: 00123 if (enterCalibrationFlag) { 00124 printf("\r\n>>>Saturation Calibration Finish!<<<\r\n\r\n"); 00125 /* Convert from float to uint32_t */ 00126 uint32_t tempAverageVoltage = (uint32_t)averageVoltage; 00127 if ((averageVoltage - 0.5) >= (float)(tempAverageVoltage)) { 00128 tempAverageVoltage++; 00129 } 00130 printf("averageVoltage %d\r\n", (uint32_t)tempAverageVoltage); 00131 00132 FP_WriteConfigValues((uint32_t)(tempAverageVoltage)); 00133 SaturationDoVoltage = averageVoltage; 00134 doCalibrationFinishFlag = true; 00135 } 00136 break; 00137 00138 case EXIT: 00139 if (enterCalibrationFlag) { 00140 if(doCalibrationFinishFlag) { 00141 printf("\r\n>>>Calibration Successful\r\n"); 00142 } 00143 else { 00144 printf(">>>Calibration Failed\r\n"); 00145 } 00146 printf("Exit Calibration Mode<<<\r\n\r\n"); 00147 doCalibrationFinishFlag = false; 00148 enterCalibrationFlag = false; 00149 NVIC_SystemReset(); 00150 } 00151 break; 00152 00153 default: break; 00154 } 00155 } 00156 00157 void SENSOR_ReadDoCharacteristicValues() { 00158 if (probe.begin()) { 00159 printf("sensor found\r\n"); 00160 probe.startConversion(); 00161 wait(0.5); 00162 } 00163 uint32_t int_SaturationDoVoltage = FP_ReadValue(SAT_DO_VOLT_ADDRESS); 00164 printf("Read SaturationDoVoltage %d\r\n", int_SaturationDoVoltage); 00165 SaturationDoVoltage = (float)int_SaturationDoVoltage; 00166 printf("SaturationDoVoltage %f\r\n", SaturationDoVoltage); 00167 if (FP_ReadValue(SAT_DO_VOLT_ADDRESS) == 0xFF) { 00168 /* default voltage: 1127V */ 00169 SaturationDoVoltage = 1127.6; 00170 int_SaturationDoVoltage = (uint32_t)SaturationDoVoltage; 00171 if ((SaturationDoVoltage - 0.5) >= (float)(int_SaturationDoVoltage)) { 00172 int_SaturationDoVoltage++; 00173 } 00174 printf("SaturationDoVoltage %d\r\n", (uint32_t)int_SaturationDoVoltage); 00175 FP_WriteConfigValues((uint32_t)(int_SaturationDoVoltage)); 00176 } 00177 }
Generated on Tue Jul 12 2022 20:06:04 by 1.7.2