YW51 module library for calculating PM2.5

Dependencies:   SoftSerial

YW51.cpp

Committer:
bojun0220
Date:
2019-03-07
Revision:
1:9b8788ea7c85
Parent:
0:1abc1344f5eb

File content as of revision 1:9b8788ea7c85:

/* YW51 module Library
 *
 * Copyright (c) 2019, 黃博鈞, National Taiwan University
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#include "YW51.h"

YW51::YW51(PinName rx, int Baud) : _YW51(NC, rx)
{
    _YW51.baud(Baud);
}

int YW51::readData()
{
    double vo;
    getline();
    if(msg[0]+ msg[1]+ msg[2]+ msg[3] == msg[4]) {
        vo = (msg[0] * 256.0 + msg[1])* 2.5 / 1024.0;
        pm = findK(vo) * vo;
        return 0;
    } else {
        return 1;
    }
}

double YW51::ShowPM()
{
    return pm;

}
int YW51::findK(double vo)
{
    if(vo <= 0.045) {
        return 200;
    } else if(vo > 0.046 && vo < 0.048) {
        return 400;
    } else if(vo > 0.049 && vo < 0.051) {
        return 600;
    } else if(vo > 0.052 && vo < 0.054) {
        return 750;
    } else if(vo > 0.055 && vo < 0.058) {
        return 900;
    } else if(vo > 0.059 && vo < 0.064) {
        return 1000;
    } else if(vo > 0.065 && vo < 0.070) {
        return 1250;
    } else if(vo > 0.071 && vo < 0.075) {
        return 1400;
    } else if(vo > 0.076 && vo < 0.080) {
        return 1700;
    } else if(vo > 0.081 && vo < 0.085) {
        return 1800;
    } else if(vo > 0.086 && vo < 0.090) {
        return 1900;
    } else if(vo > 0.091 && vo < 0.100) {
        return 2000;
    } else if(vo > 0.101 && vo < 0.110) {
        return 2200;
    } else if(vo >= 0.111) {
        return 3000;
    }
}
int YW51::PMStage(double pm)
{
    if(pm <= 35) {
        return 1;//good
    } else if(pm > 35 && pm <= 53 ) {
        return 2; //medium
    } else if(pm > 53 && pm <= 70 ) {
        return 3;//bad
    } else {
        return 4;//very bad
    }
}
void YW51::getline()
{
    while(_YW51.getc() != 170);    // wait for the start of a line
    for(int i = 0; i < 6; i++) {
        msg[i] = _YW51.getc();
        if(msg[i] == 255) {
            return;
        }
    }
    error("Overflowed message limit");
}