校园智能路灯设计初探_第1页
校园智能路灯设计初探_第2页
校园智能路灯设计初探_第3页
校园智能路灯设计初探_第4页
校园智能路灯设计初探_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

传感器与检测应用

设计汇报

试验名称:基于NRF24L01的校园智能路灯课程设计

一.设计名称

基于NRF24L01的校园智能路灯初步粗略设计方案

二.摘要

kW•h,学校大多用电平局一度电在0.55元左右,因此,每晚一盏路

灯所产生的电费大概在1.2-1.8元左右,大学校园如同一种小都市,

每个学校的I路灯至少上百盏,路灯的数量有日勺会到达上千盏甚至更多。

这给学校每天日勺开销带来了一部分没必要的挥霍。

节省校园照明用电消耗成为响应国家对于节能号召H勺重要措施之一。

一般的校园照明系统只是运用一般的声控及光控传感器构成开环日勺

控制系统,其灵活性差,功耗大,不可人为干预。而市场上闭环控制

的照明系统投入资金大,稳定性差,无法在校园中得到推广。

三.设计目的

1.理解NRF24L01的基本通信原理

2.掌握stm32门03芯片的AD转换原理

3.纯熟掌握光敏电阻的应用

4.将本学年所学知识进行一次综合汇总

四.设计原理

系统日勺设计重要有如下四个模块部分:微控制器STM32,光敏电阻模

块,LED照明电路.无线射频模块。

其中光敏电阻模块与LED照明电路构成检测照明部分,重要负责检测

外界光日勺强度,人流高峰期会默认启动一般照明模式,夜间会默认启

动节能模式。

微控制器STM32负责搜集采集数据,以及AD转换,通过串口向PC机

发送消息。

无线射频模块负责向主机传递信息,当从机照明电路出现错误时会触

发射频模块发射数据,不一样从机对应不一样数据。发送完毕结束传

播。

1.本设计日勺设计规定

(1).综合考虑选择是一主多从还是一从多主。

(2),硬件设计上应当考虑到滤波的重要性,构造尽量简朴实用,易

于实现,使系统电路尽量简朴。

(3),软件设计必须要有完善H勺思绪,要充足考虑到多种传感器和无

线收发器的时序,做到程序简朴,调试以便。

(4).通过软件设计尽量减少无线数据传播的误码率

2.重要硬件简介

(1).NRF24L01无线模块简介

各管脚如下定义:

8.IRQ7.MISO

6.MOSI5.SCK

4.CSN3.CE

2.VCCl.GND

详细阐明:

3.CE芯片W、J模式控制线。在CSN为低H勺状况下,CE协同

NRF24L01W、JCONFIG寄存器共同决定NRF24L01H勺状态(参照

STM32

微控制器

V__________J

NRF24L01通道

五.设计原理

NRF24L01工作原理

发射数据时,首先将nRF24L01配置为发射模式:接着把接受

节点地址TX.ADDR和有效数据TX_PLD按照时序由SPI口写入nRF

24L01缓存区,TX_PLD必须在CSN为低时持续写入,而TX_ADDR

在发射时写入一次即可,然后CE置为高电平并保持至少lOus,

延迟130Hs后发射数据;若自动应答启动,那么nRF24L01在发射

数据后立即进入接受模式,接受应答信号(自动应答接受地址应

当与接受节点地址TX_ADDR一致)。假如收到应答,则认为本次

通信成功,TX_DS置高,同步TXPLD从TXFIFO中清除;若未收

到应答,则自动重新发射该数据(自动重发已启动),若重发次数(A

RC)到达上限,MAX_RT置高,TXFIFO中数据保留以便在次重发;

MAX_RT或TX_DS置高时,使IRQ变低,产生中断,告知MCU。最

终发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆

栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据

且CE为高,则进入空闲模式2。

接受数据时,首先将DRF24L01配置为接受模式,接着延迟13

0Ps进入接受状态等待数据口勺到来。当接受方检测到有效口勺地址

和CRC时,就将数据包存储在RXFIFO中,同步中断标志位RX_

DR置高,IRQ变低,产生中断,告知MCU去取数据。若此时自动

应答启动,接受方则同步进入发射状态回传应答信号。最终接受

成功时,若CE变低,则nRF24L01进入空闲模式1。

在写寄存器之前一定要进入待机模式或掉电模式.如下图,

给出SPI操作及时序图:

CSN「1______________________________」

泯」WU皿MUUUUUU卿UUUL

MOSlI啊啊和

MISO阡

图2.4SPI读操作

CSN1厂

湫」uiwuuuuuuwuuuuumnjuuL

M$0—EEE呵阡啊:

SPI口为同步串行通信接口,最大传播速率为10Mb/s,传播时

先传送低位字节,再传送高位字节。但针对单个字节而言,要先

送高位再送低位。与SPI有关的指令共有8个,使用时这些控制

指令由nRF24L01的MOSI输入。对应口勺状态和数据信息是从MISO

输出给MCU。

nRF24L01所有的配置字都由配置寄存器定义,这些配置寄存器

可通过SPI口访问。nRF24L01%I配置寄存器共有25个,常用时

配置寄存器如表2所示。

表2:常用配置寄存器

地址寄存器名称功能

(H)

00CONFIG设置24L01工作模式

01EN_AA设置接受通道及自动应答

02EN_RXADDR使能接受通道地址

03SETUP/\W设置地址宽度

04SETUPRETR设置自动重发数据时间和次

07STATUS状态寄存器,用来鉴定工作

状态

0A飞RX_ADDR_P0"P5设置接受通道地址

F

10TXADDR设置接受接点地址

1T1RX_PW_P0>5设置接受通道的有效数据宽

6度

六.硬件电路图

(1).NRF24L01原理图

GND

三U23V3

2T

NRF_CEPG6PG7NRF_CS

34

SPI2SCK-PBBPBl5SPI2二MOSI

SPI2-MISOPB1456

7SPG8NRFJRQ

NRF2401

NRF2401无线模块接口

1GND

2uCC

3cE

4cS

-sN

5nCK

6MOS

7MI

8IRSQO

(2).光敏电阻模块原理图

vcc

电源指示、乙、、乙2开关指示

1K

<10

<70

VCC

GND

DO

AO

(3).硬件电路连接图

七.程序源码及分析

(1).主机程序

主机程序重要实现

当三个从机中在时间触发的状况下进行AD采集带电压并且返回给主

机,主机进行错误判断

一号路灯出现问题时候,主机会通过串口向PC段发送数据,主机端

监视助手会进行判断,对应的对应的灯会出现亮灭以及闪烁状态。以

到达提醒维修人员及时检查维修路灯。

程序部分如下所示

〃错误检测

NRFRXModeO;

printf(''Receivemode\r\n,");

if(NRF_Rx_Dat(rxbuf)=RX_DR)

9

else

(

printf(〃接受失败\r\n〃);

)

〃第一种路灯出现问题

if(rxbuf[0]==JCl[0]&&rxbuf[l]==JCl[l]&&rxbuf[2]==JCl[2])

(

bzl=l;

USART_SendData(USARTl,0x01);

while(USART_GetFlagStatus(USARTl,USART_FLAG_TXE)二二RESET);

delayms(10);

printf(〃出错请检查路灯\r\n〃);

memcpy(rxbuf,z//,,12);

printf(,,%d\r\n,/,rxbuf[0]);

printf(,,%d\r\n/,,rxbuf[1]);

printfC%d\r\n,z,rxbuf[2]);

〃第二个路灯出现问题

else

if(rxbuf[0]==JC2[0]&&rxbuf[1]==JC2[l]&&rxbuf[2]==JC2[2])

(

bz2=l;

USART_SendData(USARTl,0x02);

while(USART_GetFlagStatus(USARTl,USART_FLAG_TXE)二二RESET);

delay_ms(10);

printf(〃出错请检查路灯\r\n〃);

memcpy(rxbuf,〃〃,12);

printf(,,%d\r\n/,,rxhuf[0]);

printf(,,%d\r\n,z,rxbuf[1]);

printf(,z%d\r\nzz,rxbuf[2]);

)

〃第三个路灯出现问题

else

if(rxbuf[0]==JC3[0]&&rxbuf[1]==JC3[1]&&rxbuf[2]==JC3[2])

bz3=l;

USARTSendData(USARTl,0x03);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)PRESET);

delay_ms(10);

printf(〃出错请检查路灯\r\n〃);

memcpy(rxbuf,〃〃,12);

printf(,,%d\r\n,/,rxbuf[0]);

printf(,,%d\r\n,/,rxbuf[1]);

printfr%d\r\nz,,rxbuf[2]);

)

〃路灯一和路灯二出现问题

elseif(bzl&&bz2==l)

(

IJSART_SendData(USARTl,0x04);

while(USART_GetFlagStatus(USARTl,USART_FLAG_TXE)==RESET);

delay_ms(10);

bzl=0;

bz2=0;

)

〃路灯二和路灯三出现问题

elseif(bz2&&bz3==l)

USARTSendData(USARTl,0x05);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)PRESET);

delay_ms(10);

bz2=0;

bz3=0;

)

〃路灯一和路灯三出现问题

elseif(bzl&&bz3=l)

(

USART_SendData(USARTl,0x06);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

delay_ms(10);

hzl=0;

bz3=0;

)

〃路灯一.路灯二.路灯三出现问题

elseif(bzl&&bz2&&bz3==l)

USART_SendData(USARTl,0x07);

while(USART_GetFlagStatus(USARTl,USART_FLAG_TXE)==RESET);

delay_ms(10);

bzl=O;

bz2=0;

bz3=0;

)

else

*9

if(rxbuf[0]==JN1[0]&&rxbuf[1]==JN1[1]&&rxbuf[2]==JN1[2])

(

keyl=l;

)

if(rxbuf[0]==JN2[0]&&rxbuf[1]==JN2[1]&&rxbuf[2]==JN2[2])

(

kpy2=l;

)

if(rxbuf[0]==JN3[0]&&rxbuf[1]==JN3[1]&&rxbuf[2]==JN3[2])

(

key3=l;

)

if(keyl&&key2&&key3==1)

USART_SendData(USART1,0x08);

while(USARTGetFlagStatus(USART1,USARTFLAGTXE);RESET);

delay_ms(10);

keyl=0;

key2=0;

key3=0;

)

GPIO_SetBits(GPI0B,GPIO_Pin_5);

delay_ms(1000);

/*

*函数名:SPI_NRF_Init

*描述:SPI的I/O配置

*输入:无

*输出:无

*调用:外部调用

*/

voidSPI_NRF_Init(void)

(

SPT_InitTypeDefSPI_InitStructure:

GPIO_InitTypeDefGPTO_TnitStructure;

RCCAPB2PeriphClockCmd(RCCAPB2PeriphGPIOG,ENABLE);

〃使能PB,G端口时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPI0B,

ENABLE);〃PORTB时钟使能

RCCAPBlPeriphClockCmd(RCCAPBIPeriphSPI2,

ENABLE);//SPI2时钟使能

/*配置SPI_NRF_SPISCK,MISO,MOSI弓|脚*/

GPIO_InitStructure.GPIOPin=

GPIO_Pin_13|GPI0_Pin_14|GPIO_Pin_15;

GPI0_InitStructure.GPIO_Speed=GPI0_Speed_50MHz;

GPI0_InitStructure.GPIOJfode=GPIO_Mode_AF_PP;//复用功能

GPIO_Init(GPIOB,&GPI0_InitStructure);

/*配置SPT_NRF_SPI的CE弓|脚和SPI_NRF_SPI出JCSN引脚:NSS

*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPI0_Pin_6;

GPTOInitStructure.GPIOSpeed=GPT0_Speed_50MHz;

GPTOInitStructure.GPIOMode=GPIO_Mode_Out_PP;

GPTOInit(GPTOG,&GPTO_InitStructure);

/*配置SPI_NRF_SPIIRQ引脚*/

GPTOInitStructure.GPIOPin=GPT0_Pin_8;

GPIOInitStructure.GPIOSpeed=GPIOSpeed50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;〃上拉输入

GPIO_Init(GPIOG,&GPIOInitStructure);

/*这是自定义的宏,用于拉高csn引脚,NRF进入空闲状态*/

NRFCSNHIGHO;

SPI_InitStructure.SPI_Direction=

SPI_Direction_2Lines_FullDuplex;〃双线全双工

SPI_InitStructure.SPI_Mode二SPI_Mode_Master;

〃主模式

SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;

〃数据大小8位

SPT_TnitStructurp.SPT_CPOL=SPT_CPOL_Low;

〃时钟极性,空闲时为低

SPI_InitStructure.SPI_CPHA=SPI_CPHA_lEdge;

〃第1个边缘有效,上升沿为采样时刻

SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;

〃NSS信号由软件产生

SPT_InitStructure.SPT_BaudRatePrescaler=

SPT_BaudRatePrescaler_8;//8分频,9MHz

SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;

〃高位在前

SPI_InitStruetore.SPI_CRCPolynomial=7;

SPI_Init(SPI2,&SPI_InitStructure):

/*EnableSPI1*/

SPI_Cmd(SPI2,ENABLE);

)

/*

*函数名:NRF_RX_Mode

木描述:配置并进入接受模式

*输入:无

*输出:无

*调用:外部调用

*/

voidNRF_RX_Mode(void)

(

NRF_CE_LOW();

SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_PO,RX_ADDRESS,RX_ADR

WIDTH);〃写RX节点地址

SPI_NRF_WriteReg(NRFWRITEREG+EN_AA,0x01);〃使能通

道0的自动应答

SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);〃使能通

道0的接受地址

SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);〃设

置RF通信频率

SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PL0AD_WIDTH);//

选择通道0的有效数据宽度

SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,OxOf);〃设置TX

发射参数,Odb增益,2Mbps,低噪声增益启动

SPI_NRF_WriteP.eg(NRF_WRITE_REG+CONFIG,OxOf);〃配置基

本工作模式的参数;PWR_UP,EN_CRC,16BTT_CRC,接受模式

/*CE拉高,进入接受模式*/

NRF_CE_HIGH();

)

/*

*函数名:NRF_TX_Mode

*描述:配置发送模式

*输入:无

*输出:无

*调用:外部调用

*/

voidNRF_TX_Mode(void)

(

NRF_CELOW();

SPINRFWriteBuf(NRFWRITEREG+TXADDR,TXADDRESS,TXADRWI

DTH);〃写TX节点地址

SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_PO,RX_ADDRESS,RX_ADR

JVIDTH);〃设置TX节点地址,重要为了使能ACK

SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);〃使能通

道0的自动应答

SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);〃使能通

道0口勺接受地址

SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);〃设置自

动重发间隔时间:500us+86us;最大自动重发次数:10次

SPI_NRF_WriteP.eg(NRF_WRITE_REG+RF_CH,CHANAL);〃设

置RF通道为CHANAL

SPI_NRF_WriteF,eg(NRF_WRTTE_REG+RF_SETUP,OxOf);〃设置TX

发射参数,Odb增益,2Mbps,低噪声增益启动

SPT_NRF_WriteReg(NRF_WRTTE_REG+CONFTG,OxOe);//配置基

本工作模式的参数;PWR_UP,EN_CRC,16BTT_CRC,发射模式,启动所有

中断

/*CE拉高,进入发送模式*/

NRF_CE_HIGH();

delay_ms(20);//CE要拉高一段时间才进入发送模式

)

此处重要设置ADC的初始化,负责电压采集初始

voidADCConfiguration(void)

(

ADC_InitTypeDefADC_InitStructure:

ADC_InitStruetore.ADC_Mode=ADC_Mode_Independent;

ADC_InitStructure.ADC_ScanConvMode=DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;

ADC_TnitStructurp.ADC_ExtArnalTrigConv=ADC_ExtArnalTrigC

onvNone;

ADC_InitStructure.ADC_DataA1ign=ADC_DataA1ign_Right;

ADC_InitStructure.ADC_NbrOfChanne1=1;

ADC_Init(ADC1,&ADC_InitStructure):

ADCRegu1arChanne]Config(ADC1,ADC_Channel_10,1,ADCSampl

eTime_239Cycles5);

ADC_Cmd(ADC1,ENABLE);

ADCResetCalibration(ADC1);

while(ADCGetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1));

ADC_SoftwareStartConvCmd(ADC1,ENABLE);

)

(2).从机一程序源码

从机一程序即为路灯一控制程序

重要实现功能是:通过RTC时钟的触发和光敏电阻模块同步触发来触

发不一样步间区I路灯的工作状态。当通过AD电压检测,检测到路灯

处在断路状态时,会触发射频模块向主机发送错误报警数据,及时在

主机PC端显示'

程序如下所示

adcx=Lsens_Get_Val();

printf(z,%d\r\nz,,adcx);

〃持续轮询自动检测控制通过光敏电阻

〃高峰期启动一般模式

〃并且向主机返回数据4,5,6

if(adcx<56&&calendar.hour==18&&calendar.min==O&&calendar.se

c==0)

〃一般模式

GPIO_ResetBits(GPIOF,GPIO_Pin_ll);

GPIO_ResetBits(GPIOF,GPI0_Pin_12);

GPIOResetBits(GPIOF,GPI0_Pin_13);

ad=JCllGet_Val();

adl2=JC12Get_Val();

adl3=JC13_Get_Val();

mixll=3.3/4095*ad;

mixl2=3.3/4095*adl2;

mixl3=3.3/4095*adl3;

delay_ms(600);

printf(,zad=%f\r\n,z,3.3/4095*ad);〃实际电压值

printf(z,ad=%f\r\n/z,3.3/4095*adl2);//实际电压值

printf(,zad=%f\r\nz,,3.3/4095*adl3);〃实际电压值

〃电压做比较电压为0.3如下证明灯断路1,1,1

//AD电压采集比较

if(mixll<jz|mixl2<jz|mixl3<jz)〃有一种灯出错则

需进行检查

(

printf(〃路灯一出错\r\n〃);

NRF_TX_Mode();

if(NRFTxDat(txbufll)=TXDS)

for

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论