• 智能家居入门DIY——【三、GP2Y10之颗粒物传感器】


            这个传感器接线算比较简单的,程序也不麻烦。不过这东西是颗粒物传感器吧,不是神马PM2.5(总悬浮颗粒物),不是神马PM10(可吸入颗粒物)。插个螺丝刀进去度数也是变的,不是说的很清楚原理是反光嘛…………这个在弄的时候也狠狠的参照了官方文档:

    一、连线:

    蓝V-LED:过150Ω电阻接5V

    绿LED-GND:接GND

    白LED:接一个用于你输出周期信号的PIN(不是用PWM),我接的是3

    黄S-GND:接GND

    黑VO:接一个模拟输入PIN,我接的A0

    红:VCC:接5V

    在5V和GND之间接一个220μF的电容。

    二、程序:

    1、输出周期信号:

            官方文档上说,这个东西需要的信号是10±1ms周期内0.32±0.02ms高电平。所以,可以知道,最少需要9毫秒(9000-320),而剩下的2毫秒我们假定各种write,delay函数以及其他计算函数在2毫秒内可以完成。所以,第一次延时为320,第二次为8680。

    int ParticulateWork() {
        digitalWrite(ledPower, HIGH);
        delayMicroseconds(320);
        digitalWrite(ledPower, LOW);
        delayMicroseconds(8680);            
        return analogRead(dustPin);
    }

    2、读取和计算:

    double ParticulateTest(int testcount) {
    
        double result = 0.0;
        for (int i = 0; i < testcount; i++) {
            result += ParticulateWork();
        }
        //取平均值并映射为电压。
        result = result * VoMax / testcount / 1024 ;
        //if (result <= CalibrationVoltage) {
        //    return 0.0;
        //}else{
        //    //将平均电压带入公式:(CalibrationVoltage为无尘电压,RatioK为系数。)
        //    result = (result - CalibrationVoltage) * 10.0 * RatioK * 1000;
        //    return result;
        //}
        return result;
    }

             先不要关注注释掉的部分,也不要关注公式是怎么来的——先来校准一下你的传感器,没有专业设备来校准这十几块的东西时,我是这样做的:

    堵住两侧的孔洞,调节传感器孔洞右下角的电位器,观察上面函数的输出值(注意格式化输出位数:Serial.println(ParticulateTest(10),6);),反正我是没调节到0,调节到某一个范围时,输出值比较稳定了,此时,记录输出中的最小值,把这个值作为无尘电压。当然,这个值不是准确值,我也无法得到准确值,所以后面函数中还做了比较。

            现在,关注一下注释掉的部分,这公式就是一个颗粒物浓度和电压的一次函数。我用VS写代码,所以选定它们之后,按下CTRL+K、CTRL+U取消注释,现在再次运行代码,你将得到当前空气中颗粒物浓度(微克每立方米),然后点上一颗烟,朝着检测孔吹一下,(不管你笑没笑,反正我是这么干的),输出数值接近250,对你没看错就是二百五……不管你笑没笑,若按照现行标准,151-200μg/m3已经是重度污染,大于250就是严重污染。所以,我认为这个公式还是有一定的准确度的。

            最后,解释一下这个公式,它是我从官方文档上扒下来的,这样说是不是像很有理有据了?那么我来解释一下这个道理:首先计算电压偏移,然后*10,我不知道为啥文档上这么写的……然后*K,我也不知道为啥是0.5,文档上也是这么写的,只有最后一个1000我知道,因为测量单位是毫克每立方米把它换算成微克每立方米就要*1000。所以呢?道理解释完了,很有道理吧。其实,总体来说,10也好K也好都是一个系数,讲道理应该是根据电路计算得来的,用来放大结果到符合客观事实的。但无论如何,我觉得它符合我的要求,知道一口二手烟过来已经重度污染了这就可以了。下面是我的参数:

    double CalibrationVoltage = 0.003;         //注释掉换算部分实测得出的
    double RatioK = 0.5;                       //官方文档上扒下来的
    double VoMax = 1.5;                        //官方文档上扒下来的,实测1.47

    好了,又可以愉快的玩耍一个新玩具了……

  • 相关阅读:
    SaaS模式应用之多租户系统开发(单数据库多Schema设计)
    web-api POST body object always null
    linq to js 用法
    c#导出数据到csv文本文档中,数据前面的0不见了解决方法
    金蝶BOS元模型分析
    DotNet 资源大全中文版
    JavaScript中的类方法、对象方法、原型方法
    解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题
    在需要隐藏navigationController控制器
    升级macOS Sierra系统 导致错误 app: resource fork, Finder information, or similar detritus not allowed
  • 原文地址:https://www.cnblogs.com/zcsor/p/9218242.html
Copyright © 2020-2023  润新知