iot_water_monitor_v2

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

Sensor/ReadSensor.cpp

Committer:
DuyLionTran
Date:
2018-02-21
Revision:
39:a5ee98bd0050
Parent:
38:64e3e9acb49c
Child:
40:4356c209c58d

File content as of revision 39:a5ee98bd0050:

#include "mbed.h"
#include "ReadSensor.h"
#include "flash_programming.h"

const float SaturationValueTab[41] = {      /* saturation dissolved oxygen concentrations at various temperatures */
14.46, 14.22, 13.82, 13.44, 13.09,
12.74, 12.42, 12.11, 11.81, 11.53,
11.26, 11.01, 10.77, 10.53, 10.30,
10.08, 9.86,  9.66,  9.46,  9.27,
9.08,  8.90,  8.73,  8.57,  8.41,
8.25,  8.11,  7.96,  7.82,  7.69,
7.56,  7.43,  7.30,  7.18,  7.07,
6.95,  6.84,  6.73,  6.63,  6.53,
6.41,
};

float   doValue;                                /* current dissolved oxygen value, unit; mg/L */
float   temperature = 25;                       /* default temperature is 25^C, you can use a temperature sensor to read it */
int     analogBuffer[SCOUNT];                   /* store the analog value in the array, readed from ADC */
int     analogBufferTemp[SCOUNT];
int     analogBufferIndex = 0;
int     copyIndex = 0;
float        SaturationDoVoltage;                    /* mV */
float        SaturationDoTemperature = 25.0;         /* ^C */
float        averageVoltage;
AnalogIn     DOSensor(SENSOR_1_PIN);

int getMedianNum(int bArray[], int iFilterLen) {
    int bTab[iFilterLen];
    for (uint8_t i = 0; i < iFilterLen; i++) {
        bTab[i] = bArray[i];
    }
    int i, j;
    int bTemp;
    for (j = 0; j < iFilterLen - 1; j++) {
        for (i = 0; i < iFilterLen - j - 1; i++) {
            if (bTab[i] > bTab[i + 1]) {
                bTemp = bTab[i];
                bTab[i] = bTab[i + 1];
                bTab[i + 1] = bTemp;
            }
        }
    }
    if ((iFilterLen & 1) > 0) {
        bTemp = bTab[(iFilterLen - 1) / 2];
    }
    else {
        bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
    }
    return bTemp;
}

void SENSOR_AnalogRead() {
    float analogReadRaw = DOSensor.read();
    float voltageRaw    = analogReadRaw*3.3;
    analogBuffer[analogBufferIndex] = (int)((voltageRaw * 1023.0)/5.0);
    printf("Analog read %d %d\r\n", analogBufferIndex, analogBuffer[analogBufferIndex]);
    analogBufferIndex++;
    if(analogBufferIndex == SCOUNT) {
        analogBufferIndex = 0;
    }
}

void SENSOR_GetDOValue() {
    for(copyIndex = 0; copyIndex < SCOUNT; copyIndex++) {
        analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
    }   
    /* read the value more stable by the median filtering algorithm */
    averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF/1024.0; 
    printf("Average voltage %.2f\r\n", averageVoltage);
    /* calculate the do value, doValue = Voltage / SaturationDoVoltage * SaturationDoValue(with temperature compensation) */
    doValue =  (SaturationValueTab[(int)(SaturationDoTemperature + 0.5)] * averageVoltage) / (float)(SaturationDoVoltage);  
    float a = 1;
    printf("SaturationDoVoltage %.2f; DO Value %.2f mg/L\r\n", SaturationDoVoltage, doValue/a);
}

void SENSOR_DoCalibration() {
    
}

void SENSOR_ReadDoCharacteristicValues() {
    FP_WriteConfigValues(1255);
    uint32_t int_SaturationDoVoltage = FP_ReadValue(SAT_DO_VOLT_ADDRESS);
    printf("Read SaturationDoVoltage %d\r\n", int_SaturationDoVoltage);
    SaturationDoVoltage = (float)int_SaturationDoVoltage;
    printf("SaturationDoVoltage %f\r\n", SaturationDoVoltage);
    if (FP_ReadValue(SAT_DO_VOLT_ADDRESS) == 0xFF) {
        /* default voltage: 1127V */
        SaturationDoVoltage = 1127.6;     
        int_SaturationDoVoltage = (uint32_t)SaturationDoVoltage;
        if ((SaturationDoVoltage - 0.5) >= (float)(int_SaturationDoVoltage)) {
            int_SaturationDoVoltage++;
        }
        printf("SaturationDoVoltage %d\r\n", (uint32_t)int_SaturationDoVoltage);  
        FP_WriteConfigValues((uint32_t)(int_SaturationDoVoltage));
    }
}