手把手教你做PM2.5检测仪

这几天持续有南方的朋友到北京品霾,纷纷表示虽然南方的霾湿润灵秀,但要说量足味儿正,大抵是不如北京的。也听说过河北的霾粗砺豪放,可惜又少了一点底蕴。

霾还是要讲究个积淀,北京的老霾着实是比南方新霾厚重,吸起来入鼻绵柔,却不失醇厚,仔细品味之下略有回甘。

雾是故乡厚,霾是北京纯。

既然雾霾已成常态,自己DIY一个PM2.5检测仪还是很有必要的。利用零基础入门开发板 Arduino UNO R3,只需很简单的电路和很少的代码就能自制一个PM2.5检测仪。为保证测量精度,这里选用激光粉尘传感器来测试空气中的雾霾污染程度,同时选用DHT11来检测环境温度和湿度,非常适合中小学生练习。

一、制作PM2.5检测仪所需的材料

  • Arduino UNO R3开发板,一个

  • 激光PM2.5传感器,一个

  • 1.3寸OLED屏,1个

  • 温湿度传感器DHT11,一个

  • 面包板,一个

  • 杜邦线,若干

  • 电阻,阻值约5k,1个

  • 制作PM2.5检测仪所需的全部材料

    二、元件介绍

    1. Arduino UNO R3开发板

      Arduino是一个开放源代码的设计平台,由硬件Arduino板和软件Arduino IDE集成开发环境两部分组成。Arduino板是一个以AVR单片机为核心的开源硬件平台,有多种型 和配套资源,其中最基础、最常用的是Arduino UNO R3板,价格低廉、售价约23元,体积小巧、使用方便。Arduino IDE是一款非常优秀的软件开发平台,界面简洁友好,上手快,具有很好的跨平台性。

      Arduino UNO R3板

      Arduino编程是基于入门级的C语言,门槛低,最重要的是在Arduino环境中,很多功能均已封装成函数,可直接调用函数完成相应的功能,大大降低了编程复杂度,学生无需具备太多的单片机知识就可使用 Arduino板与各种传感器、电子元件连接,快速搭建出各种有趣的、实用的电路,实现丰富的功能。Arduino还支持第三方库和硬件等,灵活性和扩展性强。

      Arduino板端口和管脚功能定义

    2. 激光PM2.5传感器

      为保证测试精度,选用了一款激光PM2.5传感器,缺点是售价比较离谱,这东西成本不高,但因为缺乏竞争,所以价格一直居高不下。

      该传感器接口有6个引脚,但实际上只用到4个,各引脚定义如下所示。

      传感器说明书下载 https://pan.baidu.com/s/1hsPyn2G

      传感器采用异步串行通信方式(UART),以帧为单位进行通讯。帧格式固定,每一帧由9 个字节组成,分命令帧和应答帧。当外部设备向传感器发送命令帧时,传感器会回复外部设备对应的应答帧。

      波特率:9600;

      校验位:无;

      停止位:1 位;

      数据位:8;

    3. OLED屏

      OLED显示屏采用有机发光二极管,不需背光源,是一种较新型的显示屏,缺点是价格较高,不如LCD寿命长。

      有机发光显示技术由非常薄的有机材料涂层和玻璃基板构成。当有电荷通过时这些有机材料就会发光。OLED发光的颜色取决于有机发光层的材料,故厂商可由改变发光层的材料而得到所需之颜色。有源阵列有机发光显示屏具有内置的电子电路系统因此每个像素都由一个对应的电路独立驱动。OLED具备有构造简单、自发光不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广等优点。

      本例程采用128×64的1.3寸OLED单色显示屏,IIC接口,参考售价约27元。

      接线时,请务必仔细核对电源和地线,不要接反。

    4. 温湿度传感器

      DHT11 是一款廉价的温湿度传感器,利用湿敏电阻测量湿度,采用数字温度传感器测试温度,并由单片机处理后采用串行输出。DHT11 售价约4元,就是略丑。DHT22 售价约15元,虽然颜色变白了,但颜值依然很低。二者管脚定义一样,但操作时序不同在应用时需要注意。这里,我们选用DTH11型 。

      DHT11的硬件连接非常简单,原理图如下:

    三、软件环境配置

    初次使用Arduino UNO R3

    下载

    从官 下载集成开发环境ARDUINO 1.8.3

    https://www.arduino.cc/en/Main/Software

    安装

    双击arduino-1.8.3-windows.exe,出现安装导向,依次确认,默认安装即可。安装完成后,桌面上会出现Arduino软件的logo,下次使用时双击。

    配置开发环境

    插入Arduino UNO R3开发板,系统自动安装USB驱动。

    选择相应的板卡

    选择端口

    可以通过设备管理器查看设备对应的端口情况,本机对应的是COM5。

    验证

    打开文件,示例,找到Blink程序

    点击对 验证程序能否通过编译,如果一切正常;点击向右的箭头将编译好的程序上传至Arduino UNO R3的AVR单片机中;也可以直接点击该箭头,IDE会先执行验证,通过验证后直接上传。

    如果看到LED灯闪烁,说明一切正常。恭喜你,安装成功,板卡正常。

    添加第三方库

    启动Adruino IDE

    项目->加载库->管理库,搜索DHT,安装 DHT sensor library,以支持DHT11

    项目->加载库->管理库,搜索U8GLIB,安装 U8GLIB,以支持OLED

    四、开始动手实践

    操作温湿度传感器

    1、先把Arduino UNO R3板子上的电源和地引到面包板上

    3、调入例程

    文件->示例->DHT sensor library ->DHTtester

    3、修改数据输入端

    #define DHTPIN A0// what digital pin we’re connected to

    4、修改例程,支持 DHT11,去掉该行前面的//

    #define DHTTYPE DHT11 // DHT 11

    5、上传程序,打开串口监视器,设置9600波特率,观察环境温湿度。

    操作OLED屏

    1、断开Arduino UNO R3板子的电源

    2、把OLED屏连接好,由于是IIC接口,电路连接很简单,OLED屏除了连接好电源和地,只需将SCL接Arduino板的A5端,SDA接Arduino板的A4端即可。

    3、调入例程

    文件->示例->U8glib ->helloword

    4、修改例程,支持OLED,去掉该行前面的//

    U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);// I2C / TWI

    5、上传程序,观察OLED屏的显示是否正确。

    操作PM2.5传感器

    该传感器是一款激光数字式PM2.5传感器,内置激光器和光电接收组件,采用光散射原理,激光在颗粒物上产生散射光,由光电接收器转变为电信 ,再通过特定算法计算出PM2.5值和PM10值。

    该传感器采用串口输出,除了1脚接地,2脚接电源,再将3脚TXD和4脚RXD分别接Arduino板的D5、D6端口,当然,您也可以接别的端口,只要程序做相应的修改即可。

    常用指令只需要三条,分别是开机指令、读取PM2.5值指令和关机指令,不妨根据手册自己编写试试,简单起见,可以用串口监视器显示结果。

    五、编写程序,实现PM2.5检测仪

    由于硬件电路已经逐步连接完毕,下面可以针对整个电路编写程序了,把各部分功能统一起来,软件示例代码如下:

    #include <DHT.h>

    #include “U8glib.h”

    #include <SoftwareSerial.h>

    // 说明,这仅是一个简单的示例程序,目的是帮助初学者入门

    #define DHTPIN A0 // 接温湿度传感器的数据端

    // 选择合适的温湿度传感器型

    #define DHTTYPE DHT11 // DHT 11

    //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321

    uint8_t PM25_OPEN[] = {0xAA,0x01,0x00,0x00,0x00,0x00,0x01,0x66,0xBB}; //开机指令

    uint8_t PM25_CLOSE[] = {0xAA,0x03,0x00,0x00,0x00,0x00,0x01,0x68,0xBB}; //关机指令

    uint8_t PM25_DATA[] = {0xAA,0x02,0x00,0x00,0x00,0x00,0x01,0x67,0xBB}; //读数据指令

    DHT dht(DHTPIN, DHTTYPE);

    // 软串口定义格式 SoftwareSerial(rxPin, txPin, inverse_logic)

    SoftwareSerial mySerial(5, 6); //定义软串口,D5、D6分别连接PM2.5传感器的3(TXD)、4(RXD)

    U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI OLED屏定义

    uint16_t pm25, pm10;

    float h, t, hic;

    void setup() {

    mySerial.begin(9600); //设置软串口波特率与PM2.5传感器一致

    if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {

    u8g.setColorIndex(255); // white

    }

    else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {

    u8g.setColorIndex(3); // max intensity

    }

    else if ( u8g.getMode() == U8G_MODE_BW ) {

    u8g.setColorIndex(1); // pixel on

    }

    else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {

    u8g.setHiColorByRGB(255,255,255);

    }

    pmOn();

    delay(2000);

    }

    int i=0;

    void loop() {

    u8g.firstPage();

    if (i==0) pmRead();

    if(i>=5) i=0;else i++;

    dhtRead();

    do {

    draw();

    } while( u8g.nextPage() );

    delay(500);

    }

    void pmOn(){

    mySerial.write(PM25_OPEN,9);

    }

    void pmOff(){

    mySerial.write(PM25_CLOSE,9);

    }

    void pmRead(){

    uint8_t data[9];

    //while(mySerial.available());

    mySerial.write(PM25_DATA,9);

    delay(100);

    for(int i=0;i<9;i++){

    if (mySerial.available()) {

    data[i] = mySerial.read();

    }

    }

    if(data[0]==0xAA && data[8]== 0xBB){

    pm25 = data[4]*256 + data[5];

    pm10 = data[2]*256 + data[3];

    }

    }

    void dhtRead(){

    // Reading temperature or humidity takes about 250 milliseconds!

    // Sensor readings may also be up to 2 seconds ‘old’ (its a very slow sensor)

    h = dht.readHumidity();

    // Read temperature as Celsius (the default)

    t = dht.readTemperature();

    // Compute heat index in Celsius (isFahreheit = false)

    hic = dht.computeHeatIndex(t, h, false);

    }

    void draw(void) {

    // graphic commands to redraw the complete screen should be placed here

    char sendBuff[20];

    u8g.setFont(u8g_font_unifont_78_79);

    sprintf(sendBuff,”%c”,14);

    u8g.drawStr( 0, 18, sendBuff);

    u8g.setFont(u8g_font_unifont);

    sprintf(sendBuff,”H:%2d%% T:%2d%cC”,(int)h,(int)t,0xB0);

    u8g.drawStr( 20, 18, sendBuff);

    u8g.setFont(u8g_font_profont22);

    sprintf(sendBuff,”PM2.5:%4d”,pm25);

    u8g.drawStr( 6, 42, sendBuff);

    sprintf(sendBuff,”PM 10:%4d”,pm10);

    u8g.drawStr( 6, 64, sendBuff);

    }

    运行结果

    六、工匠精神

    为使这款PM2.5检测仪更具有实用性,你也可以动手制作印刷电路板,为便于初学者使用,主控芯片可以采用与Arduino UNO R3板子一样的CPU。

    参加本次制作的中学生和小学生朋友们:只要你制作成功了,就会赠送一份神秘的小礼物,就是下面小姐姐展示的作品,猜猜看是什么?

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2017年5月13日
    下一篇 2017年5月14日

    相关推荐