本篇文章详细讲解了如何利用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。其外观如下。

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

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

2. 硬件连接

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

目前,很多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(自带蓝牙),其界面如下,

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

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

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

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

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

参考链接:

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

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

基于Windows 10平台的PM2.5检测器制作的更多相关文章

  1. 基于windows 10打造的kali工具集

    基于windows 10打造的kali工具集.iso,适合于习惯使用windows的安全从业者.if you like it,please touch star! 作为安全从业主,Kali都是必备工具 ...

  2. 分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用

    原文:分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用 毕业半年,又总结了一下之前的工作,发现很多知识不复习都忘记了.最近新闻总是报道北京的空气污染,各种雾霾,各种PM X ...

  3. Windows 10平台安装PostgreSQL 14.2详细教程

    Windows 10平台安装postgreSQL 14.2.1,安装步骤很简单,基本上是点击下一步(next). 使用SQL Shell(psql)进行交互:使用pgAdmin工具进行管理. tips ...

  4. 【Windows 10 IoT - 2】LED闪烁及动画绘制(树莓派 Pi2)

    在上一篇博文<Windows 10 IoT系统安装>中,我们实现了在树莓派2平台上运行Window 10 IoT,本篇文章将介绍在该平台上的程序开发. 在最初获得的资讯中,以为Window ...

  5. Windows 10 版本 1507 中的新 AppLocker 功能

    要查看 Windows 10 版本信息,使用[运行]> dxdiag  回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...

  6. [深入浅出Windows 10]QuickCharts图表控件库解析

    13.4 QuickCharts图表控件库解析     QuickCharts图表控件是Amcharts公司提供的一个开源的图表控件库,这个控件库支持WPF.Silverlight.和Windows等 ...

  7. 【WinHec启示录】透过Windows 10技术布局,谈微软王者归来

    每个时代都有王者,王者的成功,往往是因为恰逢其时地发布了一个成功的产品(具有里程碑意义,划时代的产品).Windows 95的成功标示着微软是PC时代的王者:WinXP的成功标示着微软是互联网时代的王 ...

  8. Windows 10技术布局,谈微软王者归来

    Windows 10技术布局,谈微软王者归来 每个时代都有王者,王者的成功,往往是因为恰逢其时地发布了一个成功的产品(具有里程碑意义,划时代的产品).Windows 95的成功标示着微软是PC时代的王 ...

  9. Windows 10 IoT Serials 7 – 如何用树莓派制作家庭流媒体播放器

    Windows 10平台引入了AllJoyn开源软件框架,它提供了一组服务可以创建动态近端网络,让设备可以相互连接实现功能交互.目前,AllJoyn开源软件框架由AllSeen联盟负责管理.AllSe ...

随机推荐

  1. mysql相关文章

    win7系统下如何配置php-Apache-mysql环境 Mac 可设置环境变量的位置.查看和添加PATH环境变量 Mac如何删除MySQL,Mac下MySQL卸载方法 mac+apache+php ...

  2. canvas 图片拖拽旋转之二——canvas状态保存(save和restore)

    引言 在上一篇日志“canvas 图片拖拽旋转之一”中,对坐标转换有了比较深入的了解,但是仅仅利用坐标转换实现的拖拽旋转,会改变canvas坐标系的状态,从而影响画布上其他元素的绘制.因此,这个时候需 ...

  3. C# 中实现单例模式

    文章目录 简介 不安全线程的单例模式 简单安全线程带锁 双重检查 - 带锁 安全初始化 安全并且懒汉式静态初始化 带泛型的懒汉式单例 异常 提高效率 总结 简介 单例模式是软件工程中广为人知的设计模式 ...

  4. UWP开发入门(二十二)——Storyboard和Animation

    微博上有同学问我MyerSplash是如何实现那个很炫的图片点亮,然后移动到屏幕中央的效果.惭愧啊,我又不是作者哪里会知道.硬着头皮去GitHub拜读了高手的代码,自愧弗如,比我不知道高到哪里去了…… ...

  5. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法

    15年出现的JAVA反序列化漏洞,另一个是redis配置不当导致机器入侵.只要redis是用root启动的并且未授权的话,就可以通过set方式直接写入一个authorized_keys到系统的/roo ...

  6. iOS滤镜实现之LOMO(美图秀秀经典LOMO)

    LOMO追求鲜艳色彩,随意.自由的态度,是一种经常使用的滤镜,今天介绍一下iOS 中LOMO滤镜的实现 首先它有3张输入图像 1.我们要处理的图像.即我们要应用LOMO滤镜的图像 2 3 在gpuim ...

  7. 关于异步执行(Async/await)的理解(转发)

    原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...

  8. LinQ C#防注入式攻击实例代码

    注入式攻击是Web开放项目中开发人员的第一时间要考虑的问题,下面就我的开发实例分享给大家,有用的的话就点个赞吧. 定義賬戶信息類 public class UserInfors { public st ...

  9. 谈一谈SQL Server中的执行计划缓存(下)

    简介 在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突.本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法. 将执行缓存考虑在内时的流程 上篇文章中提到了查询优 ...

  10. socket编程-java

    一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...