基于Windows 10平台的PM2.5检测器制作

简介:

  本篇文章详细讲解了如何利用SDS011激光式PM2.5传感器、HC-06蓝牙模块和Windows 10设备完成一个简单的PM2.5检测器及其应用程序的开发。该检测器使用蓝牙完成数据输出,方便设备连接,使用UWP模板创建的应用可以运行在Window 10 for PC、Window 10 for Mobile和树莓派(Window 10 IoT Core)平台,通过该应用查看PM2.5和PM10的动态数据。

1. 使用的硬件

    首先,我们需要选择一款PM2.5的传感器,通过淘宝搜索发现,PM2.5传感器主要有两种,一种是利用红外原理,另一种是利用激光散射原理。使用红外原理的传感器价格相对便宜,如夏普GP2Y1010AU0F,其价格在20元以内,但是校准相对较难。激光散射原理的传感器在测量准确性和数据的一致性上较好,也无需用户进行数据校准的工作,使用简单方便。因此,这里选用了激光式的PM2.5传感器:SDS011。其外观如下。

image

    SDS011的输出有串口数据和PWM波两种形式,一般来说,使用串口比较方便,以下是其通信的数据协议。

3

    其次,淘宝上拿到的SDS011是通过TTL-USB的方式输出信号的,在PC上只要有USB接口就可以虚拟一个串口出来,接收其输出的信号。但是,这对于很多应用场景都不大适合,原因就在于受限其USB的接口,需要设备具备该USB接口。目前,很多手机、PC和平板都具有蓝牙模块,因此,我考虑使用一个成本较低的蓝牙模块来替换原来的TTL-USB模块,将SDS011的TTL-UART输出直接接蓝牙模块,由蓝牙来发送数据。这样一来,很多没有USB接口的设备都可以连接检测器了。而且,蓝牙是短距离无线连接,可以在室内视距情况下完成数据的发送和接收,不受限于有线连接的形式。经过调研,发现HC-06模块可以满足要求,淘宝上价格一般在20元以下,可以拿来直接当串口蓝牙模块使用。其模块图如下。

6080e37c963eb5965635b3c04c65903d

2. 硬件连接

    这里的硬件连接主要是SDS011和蓝牙模块的连接,以及整体的供电电源。通过查看模块说明得知,这两个模块的电源电压可以在一定范围内。手头正好有一个Arduino Uno R3,提供5V的输出。因此,这里就直接使用Arduino模块的电源作为整体的电源。另外一个需要注意的地方就是,HC-06模块的UART和SDS011的UART数据收发需要交叉,即其中一个的Tx需要连接另一个模块的Rx,Rx需要连接另一个模块的Tx。已经连接好的实物图如下,这里使用了一个小面包板和跳线。

 

 

image

    目前,很多PC、平板和手机都包含了蓝牙模块,因此就可以直接与我们设计的模块通信,获取数据了。如果用户需要在没有蓝牙模块的PC上获取数据,需要在PC上插一个蓝牙USB Dongle,淘宝上也有的是,价格也不贵。另外,如果用户在Windows 10 IoT Core上运行应用程序,如树莓派2、MBM板子(高通410c除外,自带了蓝牙4.0模块),同样需要另加一个蓝牙USB Dongle。

3. UWP应用程序开发

    Windows 10 提供了通用应用模板,支持包含PC、Mobile和IoT平台的通用应用开发,真正做到了一次开发,全平台运行。因此,这里使用通用应用模板来开发程序,可以部署到多个Windows 10内核的平台。事实上,微软在Github平台上给出了通用应用的很多示例,拿来就能用。比如这里,我们可以直接下载IoT Core的串口示例,其链接为:https://github.com/ms-iot/samples/tree/develop/SerialSample。在该示例程序中,已经包含了串口设备的获取、参数的设置、数据的接收、数据的发送等基本功能。本应用中不同之处在于以下几点:首先,接收的数据编码不同,示例程序中默认是字符串,而SDS011模块发送的是16进制的数据;其次,SDS011的串口参数为9600波特率,每个一秒发送一次数据,我们的应用程序只负责打开串口,接收并处理数据就可以。因此,其具体处理如下:

    在数据接收任务ReadAsync中,关键代码如下:

        private async Task ReadAsync(CancellationToken cancellationToken) 
        { 
            Task<UInt32> loadAsyncTask; 
            。。。。       //此处省略已有代码    

            UInt32 bytesRead = await loadAsyncTask; 
            if (bytesRead > 0) 
            { 
                byte[] fileContent = new byte[dataReaderObject.UnconsumedBufferLength]; 
                try 
                {

                    //读取数据 
                    dataReaderObject.ReadBytes(fileContent);

                    //数据转换为16进制 
                    for(int i=0;i< fileContent.Length;i++) 
                    { 
                        string recvdtxt1 = fileContent[i].ToString("X2"); 
                        recvdtxt += recvdtxt1; 
                    }                     
                    System.Diagnostics.Debug.WriteLine(recvdtxt); 
                    this.textBoxRecvdText.Text = recvdtxt; 
                 } 
                catch (Exception ex) 
                { 
                    System.Diagnostics.Debug.WriteLine("ReadAsync: " + ex.Message); 
                } 
            } 
        }

     在数据处理的定时Tick中,获取字符串数据,并进行数据解析和转换,同时显示到界面上,其关键代码如下:

       private async void dataProcessTick(ThreadPoolTimer timer) 
       {

           //分别获取PM2.5和PM10数据字符串 
           string str1 = recvdtxt.Substring(4,2); 
           string str2 = recvdtxt.Substring(6,2); 
           string str3 = recvdtxt.Substring(8, 2); 
           string str4 = recvdtxt.Substring(10, 2); 
           //完成数据计算

           double pm25 = (Convert.ToInt32(str1,16) + (Convert.ToInt32(str2,16)) * 256) / 10.0
           double pm10 = (Convert.ToInt32(str3,16) + (Convert.ToInt32(str4,16)) * 256) / 10.0;

           //完成数据显示                                                                                                                                                                                                                                                                                                                                                                                                                                    

           await textBoxPM25Text.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => 
               { 
                   textBoxPM25Text.Text = Convert.ToString(pm25); 
               } 
           ); 
           await textBoxPM10Text.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => 
               { 
                   textBoxPM10Text.Text = Convert.ToString(pm10); 
               } 
           ); 
       。。。。。 
       }

4. 程序调试和部署

    在PC上调试时,先打开蓝牙模块,与HC-06进行绑定,默认密码为1234,对象选择x86,local machine,就可以部署到PC上进行调试了。我这里使用了SP3(自带蓝牙),其界面如下,

image

    其中,1处为原始接收的16进制数据,2处为计算得到的PM2.5数据,3处为PM10的数据。

    在Mobile上调试时,选择ARM-Device,其运行效果如前面2.硬件连接一节所示。

    在树莓派上调试时,先插上蓝牙USB Dongle,如下图所示,

image

    然后,参考《Pairing a BLE Device and GATT Attribute Table Dump Tool》,利用SSH或者Powershell与树莓派建立连接,使用指令将树莓派与HC-06建立绑定,绑定以后,可以通过设备页面查看,其效果如下,

12

    之后,选择ARM,Remote Machine,输入树莓派的IP地址,点击调试,就可以看到应用程序在树莓派上运行了。其输出界面如下图所示。

image

参考链接:

1. https://github.com/ms-iot/samples/tree/develop/SerialSample

2. Pairing a BLE Device and GATT Attribute Table Dump Tool



 本文转自灵动生活博客园博客,原文链接:http://www.cnblogs.com/dearsj001/p/Windows10PMDetector.html,如需转载请自行联系原作者

相关文章
|
7月前
|
开发工具 C# C++
Windows平台RTMP|RTSP播放器实现画面全屏功能
我们在Windows平台实现RTSP或者RTMP播放的时候,有个功能是绕不开的,那就是播放窗口全屏。本文就以大牛直播SDK(官方)的Windows播放器为例,大概讲下大概实现:
154 0
|
7月前
|
开发工具 Windows
Windows平台RTMP推送|轻量级RTSP服务实现本地摄像头|屏幕|叠加数据预览
大家在做Windows平台RTMP推送或轻量级RTSP服务的时候,不管是采集屏幕还是采集摄像头,亦或屏幕摄像头的叠加模式,总会有这样的诉求,采集到的数据,希望能本地看看具体采集的数据或者图像实际效果,也就是本次介绍的“预览”功能。
190 0
|
7月前
|
监控 开发工具 C++
Windows平台RTMP/RTSP播放器如何实现实时音量调节
RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们通用的做法是支持播放端实时静音,更细粒度的做法是可以实时调节每一路RTMP/RTSP流的音量。
172 0
|
7月前
|
数据采集 开发工具 图形学
Windows平台实现Unity下窗体|摄像头|屏幕采集推送
随着Unity3D的应用范围越来越广,越来越多的行业开始基于Unity3D开发产品,如传统行业中虚拟仿真教育、航空工业、室内设计、城市规划、工业仿真等领域。
|
7月前
|
编解码 应用服务中间件 开发工具
Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制
先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模式。
|
3月前
|
编解码 数据挖掘 异构计算
Windows平台实现超高分辨率或帧率硬编码
Windows平台实现超高分辨率或帧率硬编码
|
3月前
|
C# 数据安全/隐私保护 开发者
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?
|
3月前
|
C++ Windows
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
|
4月前
|
Linux Shell 开发工具
Git 安装和配置教程:Windows - Mac - Linux 三平台详细图文教程,带你一次性搞 Git 环境
Git是一款免费、开源的分布式版本控制系统,广泛应用于软件开发领域。随着开源和云计算的发展,Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法,带你一次性搞定Git环境
1581 0
|
6月前
|
存储 JavaScript Unix
[笔记]c++Windows平台代码规范(下)
[笔记]c++Windows平台代码规范(下)
111 0