zoukankan      html  css  js  c++  java
  • 基于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

  • 相关阅读:
    WampServer Mysql配置
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 前10名
  • 原文地址:https://www.cnblogs.com/dearsj001/p/Windows10PMDetector.html
Copyright © 2011-2022 走看看