iot_water_monitor_v2

Dependencies:   easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ReadSensor.cpp Source File

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 }