STM32
直播中

罗星

8年用户 1612经验值
擅长:模拟技术
私信 关注
[问答]

如何去实现一种基于蓝牙与STM32的智能家居监测系统设计呢

基于蓝牙与STM32的智能家居监测系统的软硬件该如何去实现呢?
如何去实现一种基于蓝牙与STM32的智能家居监测系统设计呢?

回帖(1)

王博

2021-11-4 14:45:12
  1 系统总体设计
  本文设计一种基于蓝牙与WEB服务器的无线传输平台,系统模块有:控制器、BC4蓝牙模块、数据采集模块、WEB服务器、安卓手机APP。该系统主要监测的室内环境参数为:室内温湿度、室内光照强度、室内一氧化碳浓度。系统总体结构如图1所示:
  
  图1 系统总体结构
  首先,传感器采集室内环境参量通过蓝牙从模块发送到蓝牙主模块,然后在STM32控制器集成电路中做信号调理(如信号放大、A/D转换等),最终的监测结果既可以通过蓝牙SPP协议传输到手机终端,通过安装在手机上的智能家居APP来查询家居环境参数,也可以通过Internet浏览器远程访问Web服务器中的监测结果。用户可以根据自身情况选择这2种不同的方式来实现对室内环境参量的实时查询。
  2 系统软硬件设计与实现:
  2.1 传感器选型
  温湿度传感器主要负责采集室内实时变化的温湿度物理数据,并将其转换为电信号。由于传感器的性能直接决定了监控系统的精度、灵敏度和测量范围,所以本系统采用SHT10数字温湿度传感器,其主要性能指标如下:湿度测量范围:0~100% RH;温度测量范围:-40~123.8 ℃;湿度测量精度:±4.5% RH;温度测量精度:±0.5 ℃;低功耗为80 μW,满足系统的监控要求。
  一氧化碳浓度检测采用MQ-2气体传感器,其使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
  光照强度检测采用BH1750传感器来测量。其内部光强检测模块的光谱范围与人眼相近,对光源依赖性不大,具有测量范围宽(1~65535勒克斯)和高分解的特点。内部带有1.8V电压的逻辑输入接口,照度数字转换器,I2C总线接口,因此无需任何外部器件即可实现实时的光照强度采样。
  2.2数据无线传输设计
  选用STM32芯片做MCU,用来进行数据采集和控制蓝牙模块发送与接收的控制器,主控芯片STM32F107是以ARM-32的Cortex-M3为内核的处理器,最高工作频率可达72 MHz,内置大容量高速存储器,轻易容纳智能家居系统所需的空间。控制器主要是完成对蓝牙主模块传送过来的数据进行处理,其数据传输链如图2所示。
  
  图2 数据传输链
  其内置模数转换模块,我们需要对其内部寄存器进行编程,用来采集传感器的数值。开启时钟,获取传感器模拟输入,然后做分频,设置ADC工作模式,设置ADC规则序列,开启AD转换并校准最后读取ADC数值,其主要程序如下:
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  PCLK2/6 = 12MHz;
  ADC_Mode =ADC_Mode_Indepengdent;
  ADC_ScanConvMode = DISABLE;
  ADC_ContinousConvMode =ENABLE;
  ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  …;
  主控制模块与蓝牙模块的通信主要是串口通信,当Stm32通过串口发送AT命令时,控制蓝牙模块进行工作,如搜索连接、配对、数据传输等任务,当数据流非AT命令时,作为监测数据流传输给主控,然后做数据处理。本系统采用 USART复用I/O口PA9作为串口发送引脚,配置为推挽输出,速度为 50MHz;USART复用I/O口PA10作为串口接收引脚, 配置为浮空输入。 串口工作方式和中断配置, 波特率为115200Baud、8 位数据位 、无校验位、1 位停止位。其初始化代码如下:
  GPIO_Init Type Def GPIO_InitStructure;
  USART_Init Type Def USART_InitStructure;
  RCC_APB2Periph Clock Cmd(RCC_APB2Periph_USART, ENABLE);
  RCC_APB2Periph Clock Cmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_Init Structure.GPIO_Pin = GPIO_Pin_9;
  GPIO_Init Structure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init Structure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_Init Structure);
  2.3 蓝牙无线通信设计
  蓝牙模块内除了BC417143芯片外,还封装了该芯片工作所需要的电源电路、振荡器电路、FLASHROM、天线接口电路等。蓝牙模块还为BC417143的各种外围接口提供了一个电路板级的插针,使用蓝牙模块时只要将蓝牙模块插在设计好接口外围电路和插座的母板上即可。蓝牙模块结构如图3所示:
  
  图3 蓝牙无线传输模块结构
  蓝牙软件需要实现功能:spp任务的注册、初始化、任务间的消息交换、任务同步、中断处理、时间管理、内存分配。通过CSR提供的SDK开发蓝牙软件,涉及任务,消息队列,和消息处理函数等API。主要是监控SPP任务主线,然后进行内存分配,判断主从,分主从模式处理SPP数据流,其处理流程如图4所示,然后通过内部DSP做处理后通过Radio发射出去。实现蓝牙主从模块之间的数据通信以及主控制器与手机APP之间的数据通信功能。
  
  图4 蓝牙软件设计流程
  蓝牙SPP协议核心代码如下:
  PioState pio_state;
  if (StreamUartSource())
  memset(&theSppApp1,0, sizeof(theSppApp1));
  theSppApp1.task.handler = app_handler;
  InitAppData(&theSppApp1);
  if(theSppApp1.work_mode ==SPP_MASTER)
  read_far_addr(&theSppApp1.remote_bd_addr);
  if(theSppApp1.work_mode == SPP_SLAVE)
  PRINT((“Init SPP Slave Mode!n”));
  if(theSppApp1.connection_mode == 1)
  read_far_addr(&theSppApp1.bind_bd_addr);
  pioInit(&pio_state, &theSppApp1.task);
  PanicNotNull(MessageSinkTask(StreamUartSink(),&theSppApp1.task));
  ConnectionInit(&theSppApp1.task);
  MessageLoop();
  2.4 Web服务器的搭建与设计
  通过在STM32上搭载uC/OS-II操作系统,并且移植LwIP协议栈到操作系统上,利用主控芯片STM32的以太网控制模块,搭建嵌入式web服务器,通过LwIP的API接口实现HTTP应用流程。主控上的以太网模块灵活性强并拥有可配置的MAC 802.3物理接口,可以通过以太网接口收发数据,
  uC/OS-II是基于优先级的抢占式的实时多任务系统,占用很少的内存空间,可以提供多任务、实时同步等服务。搭建Web服务器需要做任务处理和内存分配等工作,所以需要移植uC/OS-II系统,主要移植uC/OS-II内核代码、板级配置文件、应用程序、os_cpu.h、os_cpu_a.asm、os_cpu_c.c等文件。鉴于单纯实时系统缺少网络协议栈,无法实现网络链接,从而需要移植LwIP协议到系统中。LwIP可以不需要操作系统的支持,也可以移植到操作系统上。但是LwIP在实时操作系统的平台上的网络响应速度更快。在操作系统中,我们可以通过多任务的方式来实现以太网应用,该方式主要建立3个任务:应用程序HTTP任务、LwIP协议找处理任务、底层网络接口任务,各任务之间使用信号量、消息邮箱通讯机制实现同步。
  在STM32上移植好实时操作系统uC/OS-II和嵌入式TCP/IP协议栈LwIP以后,在多任务操作系统中添加http_task任务(即网络通信中的最上层应用层程序)来实现嵌入式web服务器的功能。实现方式如图5.其中CGI(通用网关接口)是运行在服务器上的一段程序代码,用于处理来自于客户端(本文中釆用浏览器)的请求信息,根据来自HTML页面的不同请求作出相应的响应。
  
  图5 Web的实现
  Web服务器的功能主要是由添加的http_task完成的,主要是http的初始化和http的应答两个方面的编程设计,主要由LwIP的API来实现。新建数据,然后绑定IP地址,再监听网络请求,然后建立网络连接,接着读取数据块地址,最后将包头数据和网页数据发送到终端。其设计流程如图6所示。
  
  图6 LwIP实现
  试验应用:首先将测试硬件放置在监测点上,然后将STM32开发板上电并接入以太网,将嵌入式web服务器的IP地址设为192.168.1.101,子网掩码为255.255.255.1,其网关为192.168.1.1,试验所用监测PC机IP地址为192.168.1.34。在监测PC机上打开浏览器,在浏览器网络地址栏中键入网址:http//192.168.1.101;此时浏览器进入监测界面,实现远程实时查询监测结果的功能,其监测页面如图7所示。
  
  图7 浏览器监测结果界面
  由监测界面可以看出厨房监测点温度为16.4摄氏度,舒适等级;湿度为69%,略微潮湿;co浓度为16ppa,属于正常等级;光照强度为56lx,光照较弱。客厅监测点温度为20.1摄氏度,舒适等级;湿度为54%,正常等级;co浓度为9ppa,属于正常等级;光照强度为56lx,光照舒适。
  2.5 安卓APP设计
  为了方便用户查询室内的环境状况,在实现web显示的同时可以利用Android系统开发App应用,使用户能够在手机上实时显示参数情况。把控制器作为服务端监听客户端的请求,手机APP应用作为客户端发送请求并接收来至服务端通过蓝牙模块传输过来的数据。
  由于Android系统是基于Linux内核开发的,而Linux内核提供了所需的蓝牙模块驱动,并且提供了相应的蓝牙API接口让用户调用如BluetoothServerSocket类用于蓝牙服务端,而BluetoothSocket类则用于蓝牙客户端。首先将服务端和客户端连接起来,客户端通过startDiscovery()方法搜索周围的蓝牙设备,当搜索到服务端时,调用ListenUsingRfcommWithServiceRecord(String,UUID)方法获取BluetoothSocket,其中UUID是唯一的,如果客户端与服务器端的UUID一致时则两者就可以建立连接。然后,服务端调用accept()方法监听连接请求,而此时客户端调用connect() 方法请求连接,当服务端响应请求后,两者就建立连接了。最后,当两者连接后都会拥有自己的BluetoothSocket类,应用APP通过调用BluetoothSocket类的getInputStream()方法接收蓝牙服务端发送的数据信息。由于accept()和connect()方法都会阻塞线程,所以需要在新线程中实现这两种方法。其客户端核心代码如下:
  //新线程实现数据接收
  Public ConnectThread(BluetoothSocket socket){
  Try{
  Instraem = socket.getInputStream()’; //读取数据输入流,
  }catch(IOException e){ //抛出异常
  }
  }
  //将接收的数据显示
  Public void run(){
  Byte buff[] = new byte[512];
  Int res;
  While(1){
  Try{
  res = Instream.read(buff);
  //将得到的数据送至显示控件显示
  message mes =handler.obtainMessage(BluetoothChat.MESSAGE_READ,res,-1,buff);
  mes.sendToTarget();
  }catch(IOExceptin e)
  {break;}
  }
  }
  在实现APP与主控制器数据通信的功能的同时开发用户交互界面,在APP的界面开发中采用了线性布局和相对布局相结合的方式。为了节省开发周期和成本,采用XML语言对界面进行开发,不仅简单直观,还降低了应用的耦合性,APP的界面程序在文件的/res/layout/activity_main.xml中,最后得到测试结果界面如下图8所示。
  
  图8 安卓手机APP监测结果界面
  最后需要打开系统的蓝牙权限,即在APP应用工程中的AndroidManifest.xml文件中添加以下两句[9]:
  《uses-permissionandroid:nam/》
  《uses-permissionandroid:nam/》
  3 结束语
  本文提出了基于蓝牙和STM32的智能家居监测系统,并设计了监测系统的硬件、通信协议,搭建了WEB服务器,开发出一款对应的手机APP。该智能家居控制系统以蓝牙为通信媒介,通过STM32对其各个功能模块的集成控制,实现了智能家居环境中敏感参数的监测和查询。由于采用蓝牙组建内网,系统拓展性和适应性较强,可以广泛的应用于住房、办公室、蔬菜大棚、仓库等场所。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分