1、无线传感网络(WSN)无线传感网络关键词英文:Wireless Sensors Networking传感无线网络概念无线传感器网络是一种分布式传感网络,它的末梢是可以感知和检查外部世无线传感器网络是一种分布式传感网络,它的末梢是可以感知和检查外部世界的传感器。界的传感器。WSN中的传感器通过无线方式通信,因此网络设置灵活,设备中的传感器通过无线方式通信,因此网络设置灵活,设备位置可以随时更改,还可以跟互联网进行有线或无线方式的连接。通过无线位置可以随时更改,还可以跟互联网进行有线或无线方式的连接。通过无线通信方式形成的一个多跳自组织网络。通信方式形成的一个多跳自组织网络。课程内容 传感技术应用
2、 无线传感网络通信基础 无线传感网络应用考核办法 平时成绩:20% 期末大作业:80%Zigduino开发平台 Arduino体系 优点:易上手,可实现快速应用 单片机开发实质:配置寄存器硬件平台软件平台 Eclipse,相比Arduino IDE、KEIL、IAR Arduino程序特点Arduino核心库函数和系统库函数 void setup()/初始化配置函数,在初始化配置函数,在main函数中首先函数中首先被执行,只执行一次被执行,只执行一次 void loop()/无限循环函数无限循环函数 delay()/延迟函数延迟函数 Zigduino基础实验 通用数字IO口点亮LED 串口的使
3、用 ADC口光敏传感器控制 外部中断点亮LED 定时器的使用 1602型LCD的应用备料 led 电阻若干:150Ohm、10KOhm、2KOhm 光敏电阻 面包线 按键开关常用传感器驱动开发和应用 DHT11:温湿度传感器 ADXL345:三轴加速度传感器 BH1750FVI :光照传感器 DS18B20:温度传感器单片机IO接口 I/O口是输入/输出的简写,I/O口分数字I/O口和外设I/O口两种。 外设I/O口有ADC接口,TIMER接口(时钟),中断接口,I2C接口,串口等等。 一个芯片的I/O口引脚是用于数字I/O口还是外设I/O口,可以通过寄存器配置进行选择。 IO口实验一 第一步
4、: 连接电路 数字IO口实验一IO口实验一 第二步:写程序,新建名字叫IO1的工程项目; 在setup()函数里面写入: 在loop()函数里面写入:pinMode(3,OUTPUT);digitalWrite(3,HIGH);delay(1000);/延时1000msdigitalWrite(3,LOW);delay(1000);怎么理解delay( )函数?就好像一个要走路的人在原地踏步!MCU一旦上电,根本停不下来Arduino包含的以下数字IO口库函数void pinMode(uint8_t pin, uint8_t mode):设置管脚的方向,:设置管脚的方向,pin表示管脚的序号表
5、示管脚的序号,mode表示方向,只能取表示方向,只能取INPUT,OUTPUT两个值两个值,如下面的代码把管脚如下面的代码把管脚10设成输入:设成输入: pinMode(10,INPUT); void digitalWrite(uint8_t pin, uint8_t val):设置管脚的数字电:设置管脚的数字电平平, pin表示管脚的序号表示管脚的序号,value表示电平,只能取表示电平,只能取HIGH,LOW两两个值,如下面的代码把管脚个值,如下面的代码把管脚5设成高电平:设成高电平: digitalWrite(5,HIGH); int digitalRead(uint8_t pin):返
6、回管脚的数字电平:返回管脚的数字电平, pin表示管表示管脚的序号脚的序号,返回值只能是返回值只能是HIGH或或LOW,如下面的代码将返回管脚,如下面的代码将返回管脚7的数字电平:的数字电平: val = digitalRead(7); IO口实验二 电路连接新建IO2工程项目下载程序后,LED红灯亮了。然后你用黑色导线的另外一端插入到GND即地,此时就可以发现灯灭了,因为3号引脚读取的电平是低电平。(默认情况下管脚输入的读取值是高电平)#include io2.hvoid setup() pinMode(3,OUTPUT); /配置3号数字引脚为输出模式pinMode(1,INPUT); /
7、配置1号数字引脚为输入模式 void loop() if (digitalRead(1) /读取1号引脚的电平判断是否为高电平digitalWrite(3,HIGH); /将3号引脚的电平设置为高电平else /否则digitalWrite(3,LOW); /将3号引脚的电平设置为低电平 总结 数字IO口既可以是输入,也可以是输出。但是无论是输入还是输出,它是都是数字型的,要么是0(零电压LOW),要么是1(电源电压HIGH)。 当它为高电平即电源电压,它相当于电源正极,但是它的输出电流受限于单片机IO口。为低电平时,相当于GND即地。(UART)串口:串行通信接口Zigduino里面串口串口
8、的英文单词用Serial 串口通信有两个方向:发送和接收 串口有一个参数:波特率,(单位是bps)即数据通信的传输速率。常用波特率数值有( 300、600、1200、2400、4800、9600、19200、38400、43000、56000、57600、115200bps)。通信的接收方需要设置与发送方一致的波特率才可以正确接收到数据。 假定我们自己是单片机,单片机读,是输入;写则是输出。串口库函数void begin(unsigned long baud):串口使能,并工作在数值为串口使能,并工作在数值为baud的波特率下,如下面的代码启动了的波特率下,如下面的代码启动了UART,并工作在
9、,并工作在57600的波特率下:的波特率下: Serial.begin(57600); int available(void):返回串口缓冲区中有多少字节没有读取的数据;返回串口缓冲区中有多少字节没有读取的数据; int read(void): 返回串口读取到的当前数据,同时从缓冲区中删除此数据;返回串口读取到的当前数据,同时从缓冲区中删除此数据; size_t write(uint8_t):往串口写入一个字节;:往串口写入一个字节; size_t write(const char *str):往串口写入一个字符串;:往串口写入一个字符串; size_t write(const uint8_t
10、 *buffer, size_t size):往串口写入一个字节数组的前面的大小为:往串口写入一个字节数组的前面的大小为size的部分;的部分; print(data):往串口写入数据,可以是数字型的也可以是字符串;:往串口写入数据,可以是数字型的也可以是字符串; print(data, encoding):往串口写入格式化数值数据,往串口写入格式化数值数据,encoding 可以是十进制可以是十进制(DEC),十六进制(,十六进制(HEX),),八进制(八进制(OCT),二进制(),二进制(BIN),字符(),字符(BYTE),如下面的输出;),如下面的输出; Serial.print(75
11、); / 输出输出75 Serial.print(75, DEC); / 输出输出75 Serial.print(75, HEX); /输出输出4B Serial.print(75, OCT); /输出输出113 Serial.print(75, BIN); /输出输出1001011 Serial.print(75, BYTE); / 输出输出K,75代表的字符代表的字符println(data):和和print(data)基本相同,不过在最后加上了回车换行。基本相同,不过在最后加上了回车换行。串口实验一:Serial.print和Serial.write的区别int i=52;void se
12、tup() Serial.begin(57600);void loop() Serial.print(i); Serial.println();Serial.write(i);Serial.println();delay(1000);Serial.print( )打印的是原来的内容;而Serial.write( )打印出来的是ASCII码值串口实验二:实现单片机与计算机之间的串口通信 台式机也有串口,所以可以与单片机通信 只需要usb线连接台式机和单片机开发板就可以了 用到AcessPort串口软件 这里程序的功能是将计算机发给单片机的数据发回给计算机思考:为什么这里Serial.write没
13、有打印出ASCII码值? void setup() Serial.begin(57600); void loop() while (Serial.available() Serial.write(Serial.read(); delay(1000); ADC ADC,英文解释为Analog-Digit Convert(模拟数字转换),简单意思是单片机可以读取外部的模拟电压值转化成数字值。Zigduino一共有6个AD管脚即模拟输入管脚为了实现Zigduino管脚的模拟输入,我们需要了解最基本的AD采样。所谓AD采样就是把模拟信号转换成数字信号,在转化的过程中需要关注采样精度、采样频率和采样范围
14、,对于Zigduino使用的Atmega128RFA1来说,它内置的是10位的AD采样精度,即采集出来的数值范围是0-1023,采样频率则和应用程序相关,但最快不能超过MCU的限制,采样范围表示的是允许的模拟信号的幅度。对于Atmega128RFA1来说,用户可以选择1.5V,1.6V,1.8V或任意外部输入的在0-1.8V之间的电压作为参考电压,也是采样的最高电压,iDuino默认的采样范围是0-1.8V,用户可以通过下面的函数来改变参考电压: void analogReference(uint8_t mode) 其中mode可选列表如下: INTERNAL1V5:1.5V内部参考电压; I
15、NTERNAL1V6:1.6V内部参考电压; DEFAULT:默认内部1.8V参考电压; EXTERNAL:通过AREF管脚输入的外部参考电压。 int analogRead(uint8_t pin):返回管脚的模拟电平:返回管脚的模拟电平,即即AD采样的结果,只能用采样的结果,只能用在模拟管脚上,在模拟管脚上, pin表示管脚的序号表示管脚的序号,返回值的范围是返回值的范围是0-1023,如下面的代码将,如下面的代码将返回管脚返回管脚A0的采样结果:的采样结果: val = analogRead(A0); 在实际应用中,对于某些温敏、光敏、压敏、热敏传感器来说,为了测出它们的电阻变化,必要的
16、分压电路也是必须的,下面是一个简单的光敏测量电路:IO口D1拉高,相当于电源。为了使信号的输入符合Zigduino的电压采样范围,对信号进行必要的分压是必须的。ADC实验一:自动光感led灯用到的元器件:电阻470欧姆一个,(左)用于限流。电阻2K欧姆一个,(右)用于分压。10k光敏电阻一个Led一个导线5根程序int sensevalue=0;void setup() pinMode(0,OUTPUT);pinMode(1,OUTPUT);Serial.begin(38400);void loop() digitalWrite(0,HIGH); /供电sensevalue=analogRea
17、d(A1); /读取ADC0口模拟值if (sensevalue500)digitalWrite(1,HIGH); /当光线暗时,点亮led灯elsedigitalWrite(1,LOW);Serial.print(sensevalue);delay(1000);串口可以调试你的程序,很方便中断Interrupt(INT)什么是中断中断的类型中断三要素中断作用什么是中断 单片机暂停正在运行的程序,保存现场,自动转去执行相应的程序,执行完以后再返回断点继续执行被打断的程序。这个过程就叫中断。中断的类型 可分为:内部中断和外部中断 内部中断有:内部定时器中断、串口中断、AD中断、SPI中断等。这些
18、设备或者接口都集成在单片机内部。 外部中断有:外部信号引起的中断中断三要素1. 中断源:中断产生的来源。2. 中断方式(外部中断):高电平、低电平、上升沿、下降沿等。3. 中断服务程序:中断产生以后,单片机去执行的程序。中断如何使用 三个步骤: 1. 设置需要开启的中断源。 2. 设置中断方式。 3. 编写中断服务程序。中断的作用 中断使得单片机实现系统调度,实时响应。 使用中断,可以实现定时报警、外部中断报警等功能。中断库函数void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) 其中的第一个参
19、数表示Arduino中的中断号,第二个参数是中断处理函数名称(需要用户定义),第三个参数是中断模式,就是什么情况下触发中断,一共有四种模式:LOW表示低电平触发,表示低电平触发,CHANGE表示电平改变时触发,表示电平改变时触发,RISING表示电平由低变高时触发,表示电平由低变高时触发,FALLING表表示电平由高变低时触发。示电平由高变低时触发。void detachInterrupt(uint8_t interruptNum) 有些中断是会持续产生的,如低电平产生的中断,此时如果不加以控制,系统会陷入持续的中断处理中,为此在处理中断函数时首先需要把中断禁止掉,detachInterrup
20、t就是用于完成此目标,后面的唯一参数就是中断号。外部中断的中断号与管脚号对照表中断号中断号INT0INT1INT2INT3INT4INT5INT6管脚号632122012中断实验用一个按键开关连接到一个外部中断口,当中断触发时就改变一次led灯的状态代码void myhanlder() /中断服务程序 detachInterrupt(1); /关中断digitalWrite(0,!digitalRead(0); /将led灯的状态改变一次 void setup() pinMode(0,OUTPUT); pinMode(3,INPUT_PULLUP); /将中断口上拉 void loop() a
21、ttachInterrupt(1, myhanlder, FALLING); /开中断,设置中断触发方式为下降沿方式delay(1000); attachInterrupt(1, myhanlder, FALLING)表表示的是当由下降沿触发的示的是当由下降沿触发的中断中断1产生时系统会自动产生时系统会自动去执行去执行myhanlder函数,函数,从而让绿灯的状态发生变从而让绿灯的状态发生变化。化。扩展实验 将INT1的中断触发方式设置成低电平触发,并实现当触发中断时打印出“interrupt triggered!”总计 外部中断总共有8个,它们可以组合起来使用。定时/计数器 定时器/计数器(
22、Timer/Counter,TC)是一种计数装置,若计数内部的时钟脉冲,可视为定时器;若计数外部的脉冲,可视为计数器。实质都是计数。定时器(Timer) 定时功能也是通过计数器的计数来实现的。不过此时的计数脉冲来自单片机的内部。每个机器周期产生一个计数脉冲,也就是每个机器周期计数器加1。定时器中断 定时器的应用之一:设置内部定时器中断 原理:专门有一个寄存器(8位或12位或16位)存放计数,每个机器周期计数器加1,加满就产生计数溢出中断。 设置一个一秒一次的定时器中断,改变一次led的状态。定时器中断TimerOne实例#include TimerOne.hvoid callback() di
23、gitalWrite(3, !digitalRead(3) );void setup() pinMode(3, OUTPUT); Timer1.initialize(500000); / 初始化定时器1,设置中断周期为半秒 Timer1.attachInterrupt(callback); / 设置一个定时器溢出中断服务程序void loop() / your program here.对比用delay()LCD1602工业字符型液晶,能够同时显示16x02即32个字符。(16列2行)1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或
24、者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。 引脚1602采用标准的16脚接口,其中:第1脚:GND为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调
25、整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。字符集1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B
26、(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。写0 x38设置为8-bit接口.写0 x06输入方式设定写0 x0E开启显示屏写0 x01屏幕清空写0 x80设置显示位置写0 x01屏幕清空写0 x8x或0 xCx写数据写0 x01或0 x02屏幕清空,光标位置归零或者新文字替换老文字写数据ZIGBEE无线通信原理 短距离、低功耗、低速率的无线组网通信技术 可使用2.42.485G之间的16个频段通信zigbeewifi频段2.4G、900M等2.4G、5G等距离(最远) 300m20m数据通信速率 250k10M/100M无线通信数据包格式包头包类型目的
27、地址源地址有效数据包结束1字节1字节4字节4字节1-116字节1字节l只有在同一频段的无线节点之间才能进行数据收发。ZigduinoRadio库使用说明 1. 初始化ZigduinoRadio库 void begin(int chan); 以上函数必须在使用ZigduinoRadio之前调用。chan表示通讯频段,取值范围是11-26ZigduinoRadio库使用说明2. 发送数据包 发送数据有一般模式和精简模式两种,不管在何种模式下,都是以数据包为最小传输单位。在复杂模式下,发送数据需要三步: 开始发送 void beginTransmission(); void beginTransmi
28、ssion(uint16_t destaddress); 写入数据前,用户必须调用beginTransmission方法,传入参数表示目标地址,如果没有参数,则表示发送广播数据。 写入要发送的数据 void write(uint8_t c); void write(char* str); void write(uint8_t* arr, uint8_t len); 在一个数据包内,用户可以写入多种数据,但802.15.4/c标准规定一个数据包的最大长度为128,再加上包头9个字节和包尾2个字节的数据,实际的有效数据最大为128-9-2=116。 结束发送 void endTransmissio
29、n(); void cancelTransmission(); 用户可以调用endTransmission真正发送数据,也可以通过cancelTransmission取消数据发送。 在精简模式下,用户只需调用以下方法即可: Void sendFrame(uint16_t destaddress,bool needack,uint8_t* frm, uint8_t len); 其参数含义为目标地址,是否要求ack,数据内容和数据长度。3. 接收数据包 ZigduinoRadio自带的接收处理方式和串口是一样的,用缓冲区先把数据保存下来,等待用户处理,此时,用户可以使用的函数如下: int8_t
30、available();返回缓冲区中有多少有效数据,不包括包头包尾。 int16_t read();读取当前数据,并从缓冲区中删除此数据,同样,它实际的数据类型是uint8_t,如果返回值是-1则表示缓冲区中已经没有数据。 广播 发送方发出的数据包,目的地址为0 xFFFF。 接收方只要接收到广播数据包,都将收下来。点对点收发实验一 一方发送:每秒发送一次字符a一次 一方接收:接收发送过来的a,并通过串口打印出来。广播收发实验二 一方发送,发送的内容是串口收到的数据 一方接收,将发送的数据通过串口打印出来广播收发实验三 一方发送DHT11采集到的温湿度数据,5秒一次。 一方接收,并通过串口打印出来,并在LCD1602或者四位数码管上显示。广播收发实验四 一方采集模拟光敏电阻,当光线暗时将无线发命令给另一方使其亮灯。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。