Duy tran / Mbed OS iot_water_monitor_v2

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

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?

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