校园智能路灯设计初探.docx
传感器与检测应用设计汇报试验名称:基于NRF24L01改)校园智能路灯课程设计一.设计名称基于NRF24L(H的校园智能路灯初步粗略设计方案二.摘要kWh,学校大多用电平局一度电在0.55元左右,因此,每晚一盏路灯所产生日勺电费大概在1.2-1.8元左右,大学校园如同一种小都市,每个学校日勺路灯至少上百盏,路灯的数量有时会到达上千盏甚至更多。这给学校每天的开销带来了一部分没必要时挥霍。节省校园照明用电消耗成为响应国家对于节能号召的重要措施之一。一般的校园照明系统只是运用一般的声控及光控传感器构成开环日勺控制系统,其灵活性差,功耗大,不可人为干预。而市场上闭环控制的照明系统投入资金大,稳定性差,无法在校园中得到推广。三.设计目的1 .理解NRF24L01的基本通信原理2 .掌握StnI32f103芯片0¾AD转换原理3 .纯熟掌握光敏电阻的应用4 .将本学年所学知识进行一次综合汇总四.设计原理系统的设计重要有如下四个模块部分:微控制器STM32,光敏电阻模块,LED照明电路.无线射频模块。其中光敏电阻模块与LED照明电路构成检测照明部分,重要负责检测外界光的强度,人流高峰期会默认启动一般照明模式,夜间会默认启动节能模式。微控制器STM32负责搜集采集数据,以及AD转换,通过串口向PC机发送消息。无线射频模块负责向主机传递信息,当从机照明电路出现错误时会触发射频模块发射数据,不一样从机对应不一样数据。发送完毕结束传播。1 .本设计的设计规定(1) .综合考虑选择是一主多从还是一从多主。(2) .硬件设计上应当考虑到滤波的重要性,构造尽量简朴实用,易于实现,使系统电路尽量简朴。(3) .软件设计必须要有完善日勺思绪,要充足考虑到多种传感器和无线收发器日勺时序,做到程序简朴,调试以便。(4) .通过软件设计尽量减少无线数据传播的误码率2 .重要硬件简介(1) .NRF24L01无线模块简介各管脚如下定义:8.IRQ7.MISO6.MOSI5.SCK4.CSN3.CE2. VCC1.GND详细阐明:3. CE芯片的模式控制线。在CSN为低的状况下,CE协同NRF24L01日勺CONFIG寄存器共同决定NRF24L01日勺状态(参照NRF24L01的状态机)。4. CSN为芯片日勺片选线CSN为低电平芯片工作5. SCK为芯片控制的时钟线(SPI时钟)6. MOSI为芯片控制数据线(Masteroutputslaveinput)主输出从输入7. MISO芯片控制数据线(Masterinputslaveoutput)主输入从输出8. IRQ中断信号引脚。中断时变为低电平,即NRF24L01内部发生中断时IRQ引脚从高电平变为低电平。引脚会在如下三种状况变低:TxFIFO发完并且收到ACK(使能ACK状况下)、RxFIFO收到数据、到达最大重发次数。中断:nRF24L01日勺中断引脚(IRQ)为低电平触发,当状态寄存器中TX_DS(数据发送完毕中断位)、RX-DR(接受数据中断位)或MAX_RT(到达最多次重发中断位)为高时触发中断。当MCU给中断源写'1'时,中断引脚被严禁。可屏蔽中断可以被IRQ中断屏蔽。通过设置可屏蔽中断位为高,则中断响应被严禁。默认状态下所有的中断源是被严禁叽系统构造框图如下所示STM32微控制器L)1STM32 微控制器 )NRF24L01通道五.设计原理NRF24L01工作原理发射数据时,首先将nRF24L01配置为发射模式:接着把接受节点地址TX_ADDR和有效数据TX_PLD按照时序由SPl口写入nRF24L01缓存区,TX_PLD必须在CSN为低时持续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少IOus,延迟130US后发射数据;若自动应答启动,那么nRF24L01在发射数据后立即进入接受模式,接受应答信号(自动应答接受地址应当与接受节点地址TX_ADDR一致)。假如收到应答,则认为本次通信成功,TXDS置高,同步TXPLD从TXFIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已启动),若重发次数(ARC)到达上限,MAX_RT置高,TXFIFO中数据保留以便在次重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,告知MCU。最终发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。接受数据时,首先将nRF24L01配置为接受模式,接着延迟130s进入接受状态等待数据时到来。当接受方检测到有效的地址和CRC时,就将数据包存储在RXFlFO中,同步中断标志位RX_DR置高,IRQ变低,产生中断,告知MCU去取数据。若此时自动应答启动,接受方则同步进入发射状态回传应答信号。最终接受成功时,若CE变低,则nRF24L01进入空闲模式1。在写寄存器之前一定要进入待机模式或掉电模式。如下图,给出SPI操作及时序图:CSN一泯三三O三三O三三LMoSl亚MlSoB00EH迎0500000回旺面上图2.4SPI读操作CSN1sex-m三三m三三三u三三三LSPI口为同步串行通信接口,最大传播速率为10Mb/s,传播时先传送低位字节,再传送高位字节。但针对单个字节而言,要先送高位再送低位。与SPl有关的指令共有8个,使用时这些控制指令由nRF24L01MOSI输入。对应的状态和数据信息是从MISO输出给MCU。11RF24L01所有的配置字都由配置寄存器定义,这些配置寄存器可通过SPl口访问。nRF24L01的配置寄存器共有25个,常用时配置寄存器如表2所示。表2:常用配置寄存器地址(三)寄存器名称功能00CONFIG设置24L01工作模式01EN_AA设置接受通道及自动应答02ENRXADDR使能接受通道地址03SETUP_AW设置地址宽度04SETUP_RETR设置自动重发数据时间和次数07STATUS状态寄存器,用来鉴定工作状态0A0FRX_ADDR_P0P5设置接受通道地址10TX_ADDR设置接受接点地址116RX_PW_P0P5设置接受通道的有效数据宽度六.硬件电路图(1).NRF24L01原理图GND三U23V3I_NRFCEPG67538642TPG7NRFCSSPI2SCKPB13PB15SPI2MOSISPI2MISOPB14PG8NRFJRQNRF2401NRF2401无线模块接口DC NKSSOQNcescoirG Uccsmmni1234-5678工 ID一 T.光敏电阻模块原理图IOK:104光敏电阻(3).硬件电路连接图七.程序源码及分析(1),主机程序主机程序重要实现当三个从机中在时间触发的状况下进行AD采集带电压并且返回给主机,主机进行错误判断一号路灯出现问题时候,主机会通过串口向PC段发送数据,主机端监视助手会进行判断,对应的对应时灯会出现亮灭以及闪烁状态。以到达提醒维修人员及时检查维修路灯。程序部分如下所示/错误检测NRFRXModeO;printf(,Receivemodern,z);if(NRF_Rx_Dat(rxbuf)=RX_DR),else(Printf(接受失败rn);)第一种路灯出现问题if(rxbufO=JCl0&&rxbuf1=JC11&&rxbuf2=JCl)(bzl=l;USART_SendData(USARTl,0x01);whiIe(USART-GetFlagStatus(USRT1,USART_FLAGJrXE)=RESET);delayms(10);Printf(出错请检查路灯rn);memcpy(rxbuf,,12);printf(/%drnz,rxbuf0);printf(/%drn,jrxbufl);printf(,z%drnzz,rxbuf2);)第二个路灯出现问题elseif(rxbuf0=JC20&&rxbuf1=JC21&&rxbuf2=JC22)(bz2=l;USART_SendData(USART1,0x02);whiIe(USART-GetFlagStatus(USARTl,USART_FLAG_TXE)=RESET);delay_ms(10);Printf(出错请检查路灯rr);InenICPy(rxbuf,,12);printf(,,%drn,/,rxbuf0);printfCz%dr11,z,rxbuf1);printf(z,%dr11z,rxbuf2);)第三个路灯出现问题elseif(rxbuf0=JC30&&rxbuf1=JC31&&rxbuf2=JC3)bz3=l;USART_SendData(USART1,0x03);whiIe(USART-GetFlagStatus(USRT1,USART_FLAGJrXE)=RESET);delay_ms(10);Printf(出错请检查路灯rn);memcpy(rxbuf,,z,,12);Printf(drn,rxbuf0);printf(zz%dr11z,rxbuf1);printf(zz%drnz,rxbuf2);)路灯一和路灯二出现问题elseif(bzlfe½bz2-1)(USRT-SendData(USART1,0x04);whiIe(USART-GetFlagStatus(USRT1,USART_FLAGJrXE)=RESET);delay_ms(10);bzl=O;bz2=0;)路灯二和路灯三出现问题elseif(bz2&&bz3=l)USART_SendData(USART1,0x05);whiIe(USART-GetFlagStatus(USRT1,USART_FLAGJrXE)=RESET);delay_ms(10);bz2=0;bz3=0;)路灯一和路灯三出现问题elseif(bzl&&bz3=l)(USART_SendData(USART1,0x06);while(USART-GetFlagStatus(USART1,USART_FLAGJrXE)=RESET);delay_ms(10);bzl=O;bz3=0;)路灯一.路灯二.路灯三出现问题elseif(bzl&&bz2&&bz3=l)USART_SendData(USARTl,0x07);whiIe(USART-GetFlagStatus(USRT1,USART_FLAGJrXE)=RESET);delay_ms(10);bzl=O;bz2=0;bz3=0;)elseVif(rxbuf0=JN10&&rxbuf1=JN11&&rxbuf2=JN12)(keyl=l;)if(rxbuf0=JN20Urxbuf1=JN21&&rxbuf=JN22)(key2=l;)if(rxbuf0=JN30&&rxbuf1=JN31&&rxbuf2=JN32)(key3=l;)if(key1&&key2&&key3=1)USART_SendData(USART1,0x08);while(USART-GetFlagStatus(USRT1,USART_FLAG_TXE)=RESET);delayms(10);keyl=0;key2=0;key3=0;)GPIO_SetBits(GPIOB,GPI0_Pin_5);delay_ms(100O);* 函数名:SPI_NRF_Init* 描述:SPI的I/O配置* 输入:无* 输出:无* 调用:外部调用* /voidSPI_NRF_Init(void)(SPI_InitTypeDefSPI_InitStructure;GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPI0G,ENABLE);使能PB,G端口时钟RCC_APB2PeriphC1ockCmd(RCC_APB2Periph_GPIOB,ENABLE);/PORTB时钟使能RCC_APBlPeriphClockCmd(RCC_APBlPeriph_SPI2,ENABLE)SPI2时钟使能*配置SPI_NRF_SPI日勺SCK,MISO,MOSI引脚*/GPIO_InitStructure.GPI0_Pin=GPI0_Pin_13GPI0_Pin_14!GPI0_Pin_15;GPIO_InitStructure.GPIO_Speed=GPI0_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;复用功能GPIOInit(GPIOB,&GPIO_InitStructure);*配置SPI_NRF_SPI日勺CE引脚和SPI_NRF_SPI的CSN引脚:NSS*/GPIO_InitStructure.GPIO_Pin=GPI0_Pin_7|GPI0_Pin_6;GPIO_InitStructure.GPIO_Speed=GPI0_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIOInit(GPIOG,&GPIO_InitStructure);*配置SPI_NRF_SPI日勺IRQ引脚*/GPIO_InitStructure.GPIO_Pin=GPI0_Pin_8;GPIO_InitStructure.GPIO_Speed=GPI0_Speed_50MHz;GPIO_InitStructure.GPIOJlode=GPIO_Mode_IPU;上拉输入GPIOJnit(GPI0G,&GPIO_InitStructure);*这是自定义的!宏,用于拉高CSn引脚,NRF进入空闲状态*/NRF_CSN_HIGH();SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FulIDuplex;双线全双工SPI_InitStructure.SPI-Mod=SPI_Mode_Master;主模式SPI_InitStructure.SPIDataSize=SPIDataSize_8b;数据大小8位SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;时钟极性,空闲时为低SPI-InitStructure.SPI_CPHA=SPI_CPHA_lEdge;第1个边缘有效,上升沿为采样时刻SPI-InitStructure.SPI_NSS=SPI_NSS_Soft;NSS信号由软件产生SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;/8分频,9MHzSPI-InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;高位在前SPI_InitStructure.SPI_CRCPolynomial=7;SPIJnit(SPI2,&SPI_InitStructure);*EnableSPIl*/SPI_Cmd(SPI2,ENABLE);)* 函数名:NRF_RX_Mode* 描述:配置并进入接受模式* 输入:无* 输出:无* 调用:外部调用* /voidNRF_RX_Mode(void)(NRF_CE_L0W();SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_PO,RX_ADDRESS,RX_ADRWlDTH);写RX节点地址SPI_NRF_WriteRe晨NRFJVRITE_REG+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_PO,RX_PL0AD_WIDTH);/选择通道0的有效数据宽度SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,OxOf);设置TX发射参数,Odb增益,2Mbps,低噪声增益启动SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,OxOf);/酉己置基本工作模式的1参数;PWR_UP,EN_CRC,16BIT_CRC,接受模式*CE拉高,进入接受模式*/NRF_CE_HIGH();)/* 函数名:NRF_TX_Mode* 描述:配置发送模式* 输入:无* 调用:外部调用* /voidNRF_TX_Mode(void)(NRF_CE_LOW();SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);写TX节点地址SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_PO,RX_ADDRESS,RX_ADR.WIDTH);设置TX节点地址,重要为了使能ACKSPI_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,Oxla);设置自动重发间隔时间:50OUS+86us;最大自动重发次数:10次SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);设置RF通道为CHANALSPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,OxOf);设置TX发射参数,Odb增益,2Mbps,低噪声增益启动SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,OxOe);配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,启动所有中断*CE拉高,进入发送模式*/NRF_CE_HIGH();delay_ms(20);/CE要拉高一段时间才进入发送模式)此处重要设置ADC的初始化,负责电压采集初始voidADC_Configuration(void)(ADC_InitTypeDefADC_InitStructure;ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode=DISABLE;ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataA1ign=ADC_DataA1ign_Right;ADC_InitStructure.ADC_NbrOfChanne1=1;ADC_Init(ADC1,&ADC_InitStructure);ADC_Regu1arChanne1Config(ADC1,ADCChanne110,1,ADC_SampleTime_239Cyc1es5);DC-Cmd(ADC1,ENABLE);ADC_ResetCalibration(ADCl);while(ADC_GetResetCalibrationStatus(ADCl);ADC_StartCalibration(ADCl);whiIe(ADC_GetCalIbrationStatus(ADCl);ADC_SoftwareStartConvCmd(ADC1,ENABLE);)(2).从机一程序源码从机一程序即为路灯一控制程序重要实现功能是:通过RTC时钟的触发和光敏电阻模块同步触发来触发不一样步间的路灯的工作状态。当通过AD电压检测,检测到路灯处在断路状态时,会触发射频模块向主机发送错误报警数据,及时在主机PC端显示'程序如下所示adcx=Lsens_Get_Val();printfC'%drnz,adcx);持续轮询自动检测控制通过光敏电阻高峰期启动一般模式并且向主机返回数据4,5,6if(adcx<56fefecalendar.hour=18fefecalendar.min-Ofe&calendar.sec=0)一般模式GPIO-ResetBits(GPI0F,GPI0_Pin_ll);GPIO-ResetBits(GPI0F,GPI0_Pin_12);GPIO_ResetBits(GPIOF,GPI0_Pin_13);ad=JCll_Get_Val();adl2=JC12_Get_Val();adl3-JC13_Get_Val();mixll=3.34095*ad;mixl2=3.34095*adl2;mixl3=3.34095*adl3;delay_ms(600);printfad=%frn,z,3.34095*ad);实际电压值printf(,zad=%frn”,3.34095*adl2);实际电压值printf(,zad=%frn”,3.34095*adl3);实际电压值电压做比较电压为0.3如下证明灯断路1,1,1/AD电压采集比较if(mixll<jzmixl2<jzmixl3<jz)有一种灯出错则需进行检查Printf(路灯一出错rn);NRF_TX_Mode();if(NRF_Tx_Dat(txbuf11)=TX_DS)(for(i=0;i<3;i+)(printf(,zSendData%drnz,txbuflli);)printf(,zSendSuccess!rn,/);GPIO-ResetBits(GPIOB,GPI0_Pin_5);)else(printf(,SendFailed!rnz,);GPIO_SetBits(GPIOB,GPI0_Pin_5);)else(printf(,0Krnz,);)else/GPIO-SetBits(GPIOF,GPIO_Pin_ll);/GPIO_SetBits(GPIOF,GPI0_Pin_12);/GPIO_SetBits(GPIOF,GPI0_Pin_13);)节能模式20:0021:40if(calendar.hour=20&&calendar.min=0&&ca1endar.sec=0)(GPIO_ResetBits(GPIOF,GPIO_Pin_ll);GPIO_SetBits(GPIOF,GPIO_Pin_12);GPIO-SetBits(GPIOF,GPIO_Pin_13);)再次启动一般模式21:4022:30if(calendar,hour-2Ifefecalendar.min=40fe½calendar.SeC=O)(GPIO_ResetBits(GPIOF,GPIO_Pin_ll);GPIO-ResetBits(GPIOF,GPI0_Pin_12);GPIO_ResetBits(GPIOF,GPI0_Pin_13);)再次启动节能模式22:30-5:00if(calendar.hour=22&&calendar.min=30&&calendar.sec=0)(GPIO_ResetBits(GPIOF,GPIO_Pin_ll);GPIO_SetBits(GPIOF,GPI0_Pin_12);GPIO_SetBits(GPIOF,GPI0_Pin_13);)关闭路灯if(calendar.hour=7&&calendar.min=0&&calendar.SeC=O)(GPIO_SetBits(GPIOF,GPIO_Pin_ll);GPIO_SetBits(GPIOF,GPIO_Pin_12);GPIO_SetBits(GPIOF,GPIO_Pin_13);)从机二程序源码从机二与从机一不一样之处在于控制PC端第二排路灯,初始化代码相似从机三与前两个从机不一样在于控制PC端第三排路灯,初始化代码相似课程设计效果截图.设计心得体会通过这次设计让我们对NRF24L01射频模块有了更深层次的理解,纯熟掌握了stm32的多路AD采集措施,充足展示了两人的合作能力,共同设计硬件电路使得我们的电路干扰减少。本次设计更体现出了老师平时的悉心指导起到的作用。九.参照文献Stm32fl0x固件库参照手册,开源电子网帖子及视频,NRF24L01开发十.技术手册STM32F103开发手册十一.指导教师赵利民老师,感谢赵老师为我们提供的宝贵意见感谢各位学长为本设计提供的宝贵设计措施,及硬件搭建措施。