STM32W108无线传感器网络多传感器环境参数监测实例

本实例基于STM32W108的SimpleMac协议栈,利用无线节点完成对温度、湿度、超声波、烟雾、声音、光敏等传感器的控制及数据采集,并实时将数据发送到STM32W108开发板,完成传感器数据的汇集,并通过串口传送给PC机。

13.4传感器数据采集程序设计与实现

下面将根据不同的传感器分别进行传感器数据采集程序的设计说明,最后给出数据包的发送、接收及主函数部分的详细内容。

13.4.1
温度传感器

temperature.h文件内容:


#ifndef  __TEMPERATURE_H__

#define  __TEMPERATURE_H__

#define TEMP_BUS  PORTA_PIN(5) 
//PA5

#define  TEMP_BUS_INPUT_GPIO 
GPIO_PAIN //端口A输入寄存器

#define  TEMP_BUS_OUTPUT_GPIO GPIO_PAOUT //端口A输出寄存器

#define  TEMP_BUS_GPIO_PIN   
PA5_BIT //PA5_BIT的值为4

#define TEMP_BUS_WAKE_SOURCE  0x00000080

#define TEMP_BUS_SET  (GPIO_PASET_ADDR+((GPIO_PBCFGL_ADDR

-GPIO_PACFGL_ADDR)*(TEMP_BUS/8)))

#define TEMP_BUS_CLR  (GPIO_PACLR_ADDR+((GPIO_PBCFGL_ADDR

-GPIO_PACFGL_ADDR)*(TEMP_BUS/8)))

extern u16  Read_Temperature();//
读温度函数

#endif

 

temperature.c文件:


#include  PLATFORM_HEADER

#include  BOARD_HEADER

#include  "temperature.h"

#include  "hal/micro/micro-common.h"

#include  "hal/micro/cortexm3/micro-common.h"

#define  LOW 0//低电平

#define  HIGH 1//高电平

/**************************************************************************

功能描述:设置端口,将端口置高或置低

输入参数:status:电平的参数,高电平或低电平

输出参数:无

*************************************************************************/

static  void SetPort(int8u Statu)

{

halGpioConfig(TEMP_BUS, GPIOCFG_OUT); //设置总线为输出状态

if(TEMP_BUS/8 < 3)

{

if(Statu==HIGH)//高电平

*((volatile int32u *)TEMP_BUS_SET) =  BIT(TEMP_BUS&7); //设置寄存器bit4

else

*((volatile int32u *)TEMP_BUS_CLR) =  BIT(TEMP_BUS&7); //清除寄存器bit4

}

}

/**************************************************************************

功能描述:获取端口状态

输入参数:无

输出参数:u8类型值,1或0,0表示低电平,1表示高电平

*************************************************************************/

u8  GetPort()

{

halGpioConfig(TEMP_BUS, GPIOCFG_IN); //设置总线为输入状态

//bit4为1返回1,为0返回0

return (TEMP_BUS_INPUT_GPIO &  (1<<TEMP_BUS_GPIO_PIN))?1:0;

}

/**************************************************************************

功能描述:实现us级延时

输入参数:int32u类型变量,延迟时间

输出参数:无

*************************************************************************/

void  Delay_1us(int32u x)

{

halCommonDelayMicroseconds(x); //延时x us

}

/**************************************************************************

功能描述:对DS18B20进行复位操作

输入参数:无

输出参数:无

*************************************************************************/

void DS18B20_Reset()

{

SetPort(LOW);  //输出低电平,拉低总线

Delay_1us(500);  //延迟500us

SetPort(HIGH);  //释放总线

Delay_1us(60);  //延迟60us

while(GetPort());  //等待从机DS18B20应答(低电平有效)

while(!GetPort());  //等待从机DS18B20释放总线

}

/**************************************************************************

功能描述:向DS18B20写一个字节

输入参数:u8类型变量,写入DS18B20的数据

输出参数:无

*************************************************************************/

void DS18B20_Write(u8  Data)

{

u8 i;

for(i=0;i<8;i++)

{

SetPort(LOW);  //拉低总线

Delay_1us(10);  //延迟10us(最大15us)

SetPort(Data&0x01); //将数据的最低位写出

Delay_1us(40);  //延迟40us(最大45us)

SetPort(HIGH);  //释放总线

Delay_1us(1);  //稍微延迟

Data>>=1;

}

}

/**************************************************************************

功能描述:从DS18B20读一个字节

输入参数:无

输出参数:u8类型变量,从DS18B20读取的一个字节数据

*************************************************************************/

u8 DS18B20_Read()

{

u8 i,dat;

for(i=0;i<8;i++)

{

SetPort(LOW); //
拉低总线,启动输入

Delay_1us(1); //
延迟1us

SetPort(HIGH); //
释放总线

dat = (GetPort() << 7) | (dat  >> 1);//最先读出的是最低位数据

Delay_1us(45); //
延迟 45us(最大45us)

}

return dat;

}

/**************************************************************************

功能描述:读取当前温度,利用DS18B20进行温度的采集

输入参数:无

输出参数:u16类型变量,读取的温度值,当前温度值=返回值/100

*************************************************************************/

u16  Read_Temperature()

{

u8 Temp1,Temp2;

//DS18B20 开始转换:

DS18B20_Reset(); //DS18B20
复位

DS18B20_Write(0xCC); //
跳过 ROM

DS18B20_Write(0x44); //
温度转换

Delay_1us(800);  // 
延迟 750~900us

//DS18B20 读暂存数据:

DS18B20_Reset(); //DS18B20
复位

DS18B20_Write(0xCC); //
跳过 ROM

DS18B20_Write(0xbe); //
读取 RAM

Temp1=DS18B20_Read(); //
读低八位, LS Byte, RAM0

Temp2=DS18B20_Read(); //
读高八位, MS Byte, RAM1

DS18B20_Reset(); //DS18B20
复位,表示读取结束

//对于负数,转换成整数之后进行单位转换,然后再重新转换回负数补码形式

if(Temp2&0xFC)

return  (u16)((~((u16)(((~((Temp2<<8)|Temp1))+1)*6.25)))+1); //
高八位第八位进行整

else

return  (u16)(((Temp2<<8)|Temp1)*6.25); //0.0625=xx, 0.625=xx.x, 6.25=xx.xx

}

13.4.2 温湿度传感器

DH11.h文件:


#ifndef  __DH11_H__

#define  __DH11_H__

#define  DBUS PORTC_PIN(6)  //PC6引脚

#define  DBUS_INPUT_GPIO  GPIO_PAIN //输入引脚

#define  DBUS_OUTPUT_GPIO GPIO_PAOUT //输出引脚

#define  DBUS_GPIO_PIN    PC6_BIT

#define  DBUS_WAKE_SOURCE 0x00000080

#define  DBUS_SET (GPIO_PCSET_ADDR)

#define  DBUS_CLR (GPIO_PCCLR_ADDR)

extern  void SetDH11Status(int32u status); //设置相应端口为高电平或低电平

extern  u8 GetDH11Status(); //获取传感器状态

extern  void DH11Start(); //启动DH11传感器,触发一次信号采集;

extern  u8 GetDH11BD(); //按字节读取采集的数据

extern  void GetDH11Data(); //获取采集的数据

#endif

 

DHT11.c文件:


#include  PLATFORM_HEADER

#include BOARD_HEADER

#include  "DH11.h"

#include  "hal/micro/micro-common.h"

#include  "hal/micro/cortexm3/micro-common.h"

#include  "stdio.h"

#define LOW 0//低电平

#define HIGH 1//高电平

/**************************************************************************

功能描述:完成对相应端口设置给定的电平

输入参数:status:电平的参数,高电平或低电平

输出参数:无

*************************************************************************/

void  SetDH11Status(int32u status)

{

halGpioConfig(DBUS,GPIOCFG_OUT); //将DBUS端口设置为输出模式

if(DBUS/8 < 3)

{

if(status==HIGH) //高电平

*((volatile int32u *)DBUS_SET) =  BIT(DBUS&7);

else //低电平

*((volatile int32u *)DBUS_CLR) =  BIT(DBUS&7);

}

}

/**************************************************************************

功能描述:获取端口DBUS_INPUT_GPIO的电平状态

输入参数:无

输出参数:u8类型变量,返回1表示高电平,返回0表示低电平

*************************************************************************/

u8 GetDH11Status()

{

return (DBUS_INPUT_GPIO &  (1<<DBUS_GPIO_PIN)) ? 1 : 0;

}

/**************************************************************************

功能描述:完成对DHT11传感器的初始化,触发一次数据采集

输入参数:无

输出参数:无

*************************************************************************/

void DH11Start()

{

SetDH11Status(LOW); //把总线拉低至少18ms等待DHT11响应

halCommonDelayMicroseconds(18000);

SetDH11Status(HIGH); //释放总线,输出高电平

halCommonDelayMicroseconds(20); //延时等待20-40us

halGpioConfig(DBUS,GPIOCFG_IN);

}

/**************************************************************************

功能描述:完成对给采集到的数据的按字节读取

输入参数:无

输出参数:无

*************************************************************************/

u8 GetDH11BD()

{

u8 i,tmp; //i为循环变量,tmp为标志位,为1表示读出的是1,为0表示读出的是0

u8 temp=0; //存放最终读到的数据

halCommonDelayMicroseconds(30); //延时30us

for(i=0;i<8;i++) //循环得到8位的最终数据

{

temp=temp<<1;

//每个位传输都以50us的低电平时隙开始,所以在此等待低电平结束

while(!GetDH11Status());

if(GetDH11Status())  //如果输出为0,则高电平持续时间为26us-28us

{

halCommonDelayMicroseconds(28);

}

/*如果读到的数据为1,则高电平持续时间为70us,那么28us后仍为高电平,则

表明读取的数据为1,设置标志位*/

if(GetDH11Status())

{

tmp=1;

halCommonDelayMicroseconds(40);

}

else

tmp=0;

temp|=tmp;

}

return temp;

}

时间: 2024-10-12 16:10:44

STM32W108无线传感器网络多传感器环境参数监测实例的相关文章

STM32W108无线传感器网络节点自组织与移动智能体导航技术

使用STM32W108无线开发板及节点完成大规模网络的自组建,网络模型选择树型,网络组建完成之后,使用基于接收信号强度指示RSSI(ReceivedSignal Strength Indication)的N次三边质心加权定位法进行节点定位及智能车导航. 节点自组织及移动智能体导航实际场景 程序设计与实现 基于SimpleMac协议栈sample实例及第15章给出的N次三边质心加权定位算法程序,进行本章程序的设计,对于本章使用的N次三边质心加权定位算法及三边质心定位算法的实现在此就不再说明,主要给

STM32W108无线传感器网络嵌入式uCOS-II的移植及实时环境监測

基于STM32W108无线开发板,将ucos-ii v2.86内核移植到其上,并加入用户任务.实现对温湿度.超声波.声音.光敏等传感器的控制及实时数据採集. 14.1开发环境说明 硬件:STM32W108无线开发板,JLink烧写器.PC机.温湿度传感器.声音传感器.光敏传感器.超声波传感器等. 软件:IAR Embedded Workbench开发软件,SimpleMac Zigbee协议栈,ucos-ii的内核源代码. 实验硬件电路传感器接口与第13章中使用的传感器接口同样,具体信息參考13

STM32W108无线传感器网络节点定位技术

使用STM32W108无线节点完成基于接收信号强度指示(RSSI:Received SignalStrength Indication)的N次三边质心加权定位,对移动中的节点实时进行定位,并将定位结果发送到汇集中心.图15.1为定位实验的实际场景,所有实验在室内完成,共使用9个节点,1个移动节点,8个信标节点. 图15.1. 定位实际场景 基于第10章介绍的SimpleMac协议栈,对程序进行删减更改,下面给出更改部分代码: 文件solar-system.c相关内容: 函数processRxPa

无线传感器网络(WSN)在各个领域的应用分析

科技发展的脚步越来越快,人类已经置身于信息时代.而作为信息获取最重要和最基本的技术--传感器技术,也得到了极大的发展.传感器信息获取技术已 经从过去的单一化渐渐向集成化.微型化和网络化方向发展,并将会带来一场信息革命. 传感器节点可以连续不断地进行数据采集.事件检测.事件标识.位置监测和节点控制,传感器节点的这些特性和无线连接方式使得无线传感器网络的应用前景非常广阔,几乎涉及到社会经济活动中的各个领域. (1)军事领域的应用 在军事领域,由于WSN具有密集型.随机分布的特点,使其非常适合应用于恶

无线传感器网络

Technorati Tags: ZigBee技术 无线传感器网络        时代进步,技术推陈出新,而作为信息获取最重要和最基本的技术-传感器技术,也得到了极大的发展.传感器信息获取技术已经从过去的单一化渐渐向集成化.微型化和网络化方向发展,将会带来一场信息革命. 具有感知能力.计算能力和通信能力的无线传感器网络WSN,综合了传感器技术.嵌人式计算技术.分布式信息处理技术和通信技术,能够协作地实时监测.感知和采集网络分布区域内的各种环境或监测对象的信息,并对这些信息进行处理,获得详尽而准确

无线传感器网络数据融合技术

http://www.dzsc.com/data/html/2008-11-28/73975.html 由于大多数无线传感器网络应用都是由大量传感器节点构成的,共同完成信息收集.目标监视和感知环境的任务.因此,在信息采集的过程中,采用各个节点单独传输数据到汇聚节点的方法显然是不合适的.因为网络存在大量冗余信息,这样会浪费大量的通信带宽和宝贵的能量资源.此外,还会降低信息的收集效率,影响信息采集的及时性. 为避免上述问题,人们采用了一种称为数据融合(或称为数据汇聚)的技术.所谓数据融合是指将多份数

无线传感器网络数据融合概述

http://blog.sina.com.cn/s/blog_6b218a3b0100mdye.html 一. 数据融合.所谓数据融合,就是将多份数据或信息进行处理,组合出更有效.更符合用户需求的结果的过程.在无线传感器网络的研究中,数据融合起着十分重要的作用,主要表现在以下三个方面: 1.节省能量        在部署无线传感器网络时,需要使传感器节点达到一定的密度以增强整个网络的鲁棒性和监测信息的准确性,有时甚至需要使多个节点的监测范围互相交叠.这种监测区域的相互重叠导致了邻近节点报告的信息

浅入无线传感器网络

1.初识传感器网络 无线网络可分为两种.一种是有基础设施的网络,需要固定基站,比如手机通信这种无线蜂窝网就需要高大的天线和大功率基站来支持:一种是无基础设施网包括移动Ad Hoc网络和无线传感器网络(WSN),这种网络节点是分布式的没有固定基站,注意它仍然是有基站的只是没有专门的固定基站.Ad Hoc网络指的是无线自组织网络,移动Ad Hoc网络的终端是快速移动的.而无线传感器网络的节点是静止的或者移动很慢.无线传感器网络的官方定义是WSN是由大量的静止或移动的传感器以自组织和多跳的方式构成的无

无线传感器网络中的节点定位技术

原文:http://www.cnblogs.com/dolphin0520/archive/2013/05/03/3056789.html 无线传感器网络的许多应用要求节点知道自身的位置信息,才能向用户提供有用的检测服务.没有节点位置信息的监测数据在很多场合下是没有意义的.比如,对于森林火灾检测.天然气管道监测等应用,当有事件发生时,人们关心的一个首要问题就是事件发生在哪里,此时如果只知道发生了火灾却不知道火灾具体的发生地点,这种监测没有任何实质的意义,因此节点的位置信息对于很多场合是至关重要的