本次设计结合日常生活中的需要,应用单片机技术、蓝牙通信技术和Android手机APP开发技术,设计了一种以Android智能手机作为指令传送和数据接收终端,获取实时温湿度信息的系统。系统整体框架如图所示。


整体设计包含硬件与软件两大部分,硬件提供数据支持,软件用于数据显示,数据传送的桥梁HC-05蓝牙模块,它支持Socket蓝牙通信协议,这种协议与4.0低功耗蓝牙通信协议有很大的区别,具体可以自己去上网查资料,这里仅介绍传统的蓝牙通信协议。程序流程如下图所示。


下面我将从硬件和软件两个方面对本系统进行详细的介绍。

1.软件部分

软件开发用的是eclipse工具,在文章结束时将一并给出手机端与硬件端完整源代码。

1.1添加蓝牙权限

在设计主程序之前,首先需要在AndroidManifest.xml文件中添加操作蓝牙的权限。

  //允许程序连接到已配对的蓝牙设备。

  //允许程序发现和配对蓝牙设备。

1.2打开蓝牙并连接设备

打开蓝牙使用的是eclipse系统自带的蓝牙适配器BluetoothAdapter,通过实例化该对象,运用条件语句判断是否打开蓝牙,具体代码如下:

if (!mBluetoothAdapter.isEnabled())

{  //蓝牙未代开时会执行此语句,提示是否打开蓝牙

IntentenableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

              startActivityForResult(enableIntent,REQUEST_ENABLE_BT);

}

当用户选择打开蓝牙时,程序会执行条件里的语句,跳转至蓝牙设备选择界面

用户点击页面底下的扫描设备时,程序会首先注册一个广播接收机制,监听蓝牙设备的变化,每搜索一个设备就会发送一个广播,当全部搜索完之后会发送该广播,注册广播接收机制的代码如下:

privatefinal BroadcastReceiver mReceiver = new BroadcastReceiver()

@Override 

  public void onReceive(Context context, Intent intent)

String action =intent.getAction();  // When discoveryfinds a device 

if (BluetoothDevice.ACTION_FOUND.equals(action))

BluetoothDevicedevice = intent.getParcelableExtra(BluetoothDevice.EXTRA _DEVICE); 

            if (device.getBondState() !=BluetoothDevice.BOND_BONDED)  

{  //设备绑定状态

mNewDevicesArrayAdapter.add(device.getName()+ "\n" + device.getAddress()); 

            } 

          }

else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))

            setProgressBarIndeterminateVisibility(false); 

         setTitle(R.string.select_device); 

         if(mNewDevicesArrayAdapter.getCount() == 0)

                   { 

                String noDevices =getResources().getText(R.string.none_found.toString();

             mNewDevicesArrayAdapter.add(noDevices); 

         }

       }

}

};   

系统扫描完所有的可用蓝牙设备后,用户点击其中一个设备,程序会根据点击的设备通过getAdress方法获取该设备地址,该地址将会通过putExtra方法传递给下一个界面。同时运用getName方法获取设备名告知用户。

1.3线程建立连接

当用户从设备选择界面返回至主界面时,首先会调用onActivityResult方法,该方法中有三个参数,第一个是请求码,即一开始调用startActivityForResult的传递过去的值,第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity,第三个是Intent对象,通过getExtra获取蓝牙设备的地址。获取地址后,通过BluetoothAdapter对象中的getRemote

Device方法生成一个BluetoothDevice对象device。重要代码如下:

String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE _AD DRESS); //获取地址

BluetoothDevice device =mBluetoothAdapter.getRemoteDevice(address); //创建bluetoothDevice对象

建立一个线程,创建BluetoothDevice类型的局部变量,生成一个构造器方法将上面的device对象传递过来。蓝牙4.0及以下运用的是BluetoothSocket蓝牙通信协议。建立连接的代码如下:

tmp =device.createRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));  //创建客户端蓝牙ClientSocket

这个线程执行后,就可以与蓝牙之间互相通信了,我们还需要建立一个线程,用于与蓝牙之间数据的传递,为了完成这一操作,我们需要创建一个输入与输出流,用于数据的发送与接收。发送指令时,规定发送一个字符型的“a”,转换为字节流型数据后发送出去,硬件识别该指令后,会调取温湿度采集模块采集周围环境的温湿度并向客户端发送该数据。客户端接收时,先通过输入流读取数据,然后进行数据类型的转换。这一部分重要代码如下:

String str="a";

mmOutStream.write(str.getBytes());  //写入该指令

bytes = mmInStream.read(buffer);   //读取数据

synchronized (mBuffer) {  //List mBuffer

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

mBuffer.add(buffer[i]& 0xFF);  //字节数组转换成整形变量

              }

}

1.4数据显示

在显示之前,我们想要接收的数据是完整的,还需要加一个延迟,这里,我加了一个线程等待时间0.1秒。这样便可达到我们的目的。

Thread.currentThread().sleep(100);

最后,通过split方法将温度和湿度数据分隔开,运用TextView组件就可以将数据展示给用户了

String[] temp=receiveData.substring(0,21).split("-");

tv_data.setText("当前温度:"+temp[0]+"℃"+"\n"+"当前湿度:"+temp[1]+"%"+"\n");

最终效果如图所示。












2.硬件部分

2.1主控模块

本系统主控采用ATmel公司生产的ATmega16单片机,ATmega16是基于增强的AVRRISC结构的低功耗8 CMOS微控制器。由于其先进的指令集以及单时钟周期指令执行时间,ATmega16数据吞吐率高达1 MIPS/MHz,从而可以减缓系统在功耗和处理速度之间的矛盾。ATmega16AVR内核具有丰富的指令集和32 个通用工作寄存器。所有的寄存器都直接与运算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的CISC微控制器最高至10 倍的数据吞吐率。

ATmega16有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫描的JTAG接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/ 计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP封装) 的ADC,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。

ATmega16为主控的最小系统图如下图所示,它包含复位电路,滤波电路和晶振电路


2.2采集模块

本系统温湿度采集模块采用的是SHT30,传感器将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数字信号。传感器采用专利的CMOSens技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与14 位的A/D转换器以及串行接口电路实现无缝连接。因此,该产品具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点。该传感器属于低成本版本的数字型温湿度传感器,其可通过IIC总线即可与单片机进行通信,电压范围较宽为2.4-5.5V且功耗低每次测量只需4.8uw,其湿度测量范围为0-100%,温度测量范围为-40-+125℃。该传感器属于电容式传感器具有精确度高,感应速度快等特点,为了防止氧化该传感器采用了电极分布和镀膜技术,使得传感器不仅不会被氧化,还能很快吸收水分子,从而提高了稳定性。

SHT30工作流程:首先,选择供电电压后将传感器通电,上电速率不能低于1V/ms。通电后传感器需要11ms进入休眠状态,在此之前不允许对传感器发送任何命令。用一组“启动传输”时序,来完成数据传输的初始化。它包括:当SCK时钟高电平时DATA翻转为低电平,紧接着SCK变为低电平,随后是在SCK时钟高电平时DATA翻转为高电平。布一组测量命令(‘00000101’表示相对湿度RH,‘00000011’表示温度T)后,控制器要等待测量结束。这个过程需要大约20/80/320ms,分别对应8/12/14bit测量。确切的时间随内部晶振速度,最多可能有-30%的变化。 SHT1x通过下拉DATA至低电平并进入空闲模式,表示测量的结束。控制器在再次触发SCK时钟前,必须等待这个“数据备妥”信号来读出数据。检测数据可以先被存储,这样控制器可以继续执行其它任务在需要时再读出数据。SHT30外形图如下图所示。


2.3无线蓝牙模块

本系统采用的蓝牙模块为支持蓝牙协议2.0的HC-05,该模块为无线透传的主从一体模块,采用AT指令可将其设置为主模块和从模块,该模块具有低功耗,高性能的特点,波特率范围较宽为4800-1382400,并且完全兼容3.3V/5V的单片机系统,其与设备进行连接时可以取代串口线通讯的应用,改为无线蓝牙通讯。与单片机通讯时连接方式如下所示,单片机与蓝牙模块之间通过串口进行通信,即单片机的TXD与蓝牙模块的RXD相连,单片机的RXD与蓝牙模块的TXD相连;只需要四根线就能轻松实现数据的无线传输,非常简单可靠。


2.4 PCB设计

本系统原理图与PCB采用AltiumDesigner10软件进行设计,由于该板所用元器件不是很多,故在设计时采用双层板即顶层(TopLayer)和底层(BottomLayer),双层板在走线时信号线与电源线采用了不同宽度的线以降低外界对电源的干扰,PCB图如下图所示。


在本系统PCB走线过程中学习到以下几点:

(1)PCB布线方向:从焊接面看,组件的排列方位尽可能保持与原理图相一致,布线方向最好与电路图走线方向相一致,因生产过程中通常需要在焊接面进行各种参数的检测,故这样做便于生产中的检查,调试及检修(在满足电路性能及整机安装与面板布局要求的前提下)。
    (2)各组件排列,分布要合理和均匀,力求整齐,美观,结构严谨的工艺要求。

(3)相关联的两引线端不要距离太大,一般为2~3/10英寸左右较合适。进出线端尽可能集中在1至2个侧面,不要太过离散。

4设计布线图时要注意管脚排列顺序,组件脚间距要合理。

(5在保证电路性能要求的前提下,设计时应力求走线合理,少用外接跨线,并按一定顺充要求走线,力求直观,便于安装,高度和检修

(6设计布线图时走线尽量少拐弯,力求线条简单明了布线条宽窄和线条间距要适中,电容器两焊盘间距应尽可能与电容引线脚的间距相符;设计应按一定顺序方向进行,例如可以由左往右和由上而下的顺序进行。


最终实物图如图所示


硬件与手机端源码链接: http://download.csdn.net/download/caicai19930805/10206496

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android优化——绘制优化之android系统显示原理(一)
  5. Android(安卓)— 之内容提供器(Content Provider)
  6. Android基础-Content Provider
  7. 【Android(安卓)数据库框架总结,总有一个适合你!】
  8. 无usb数据线在真机上调试android程序
  9. 写给Android开发者的算法与数据结构学习宝典

随机推荐

  1. Android 闹钟管理类的使用
  2. Android 命令行编译、打包生成apk文件
  3. 第一章 andriod studio 安装与环境搭建
  4. Android 中文API(86)——ResourceCursorAda
  5. android用户界面-组件Widget-地图视图Map
  6. Android开发——Android搜索框架(二)
  7. Android下Excel的操作
  8. android 创建桌面快捷方式 、插件
  9. 编译android的linux内核
  10. android图表ichartjs