智能路灯平台灯具控制系统的设计与实现

目录

摘要        

研究过程与总体设计:

关键技术:NB-IOT模块与STM32        MQTT通信协议 

代码实现: 

MQTT服务器的连接:打开 MQTT 客户端网络及连接客户端至 MQTT 服务器。

订阅与发布:订阅激活、开\关路灯相关主题;发布反馈结果及状态信息相关主题。

硬件看门狗:程序出现死循环时,通过及时喂狗让系统进行复位让系统更加可靠稳定。

配置信息存储:FLASH的读写。

STM32通用定时器:定时上发路灯状态

效果展示及系统测试:远程打开/关闭路灯及路灯异常检测 


摘要        

随着科技社会的不断发展,传统路灯已经不能满足绿色、环保、节能生活的需求。越来越多的照明系统开始通过网络控制平台进行在线管理,实现新时代新理念的智能生活。针对目前节能生活的迫切需求,经过此次项目开发,设计并实现了智能灯具控制系统。

经过系统需求获取与分析、设计、实现、测试等环节完成了本设计,构建了用例模型、分析模型,设计了系统体系结构、部署方案、配置信息存储方案。系统以NB-IoT技术、MQTT协议为基础运用Stm32单片机和NB-IoT模块,串口调试工具、Keil等工具进行开发,通过订阅MQTT服务器发布的主题进行通信实现对继电器的实时控制。系统能远程控制多个区域的多个路灯如打开、关闭路灯,路灯异常检测,激活路灯。通过看门狗电路,大大提高了系统可靠性,解决了单片机系统程序运行失控死循环的问题。

系统利用NB-IoT技术覆盖范围广、连接多、成本低、功耗低的优点,解决了传统路灯系统电力浪费过大、维护成本过高的问题,满足了功能性需求及在可靠性方面的非功能性需求,达到了系统设计目标。

                                    

 

研究过程与总体设计:

 

关键技术:NB-IOT模块与STM32        MQTT通信协议 

                   

              

                               

 

代码实现: 

MQTT服务器的连接:打开 MQTT 客户端网络及连接客户端至 MQTT 服务器。

AT+QMTOPEN=<TCP_connectID>,"<host_name>",<port>

AT+QMTCONN=<TCP_connectID>,"<clientID>"[,"<username>"[,"<password>"]]

订阅与发布:订阅激活、开\关路灯相关主题;发布反馈结果及状态信息相关主题。

AT+QMTSUB=<TCP_connectID>,<msgID>,"<topic1>",<qos1>[,"<topic 2>",<qos2>…]
AT+QMTPUB=<TCP_connectID>,<msgID>,<qos>,<retain>,"<topic>","<msg>"

 

硬件看门狗:程序出现死循环时,通过及时喂狗让系统进行复位让系统更加可靠稳定。

硬件看门狗的原理:在外界的干扰下,单片机系统将出现程序运行失控,并导致无限循环。看门狗电路是为了避免这种情况。硬件看门狗实际上就是一个定时器,有一个输入和输出,它的功能是定期检查芯片内部的情况,一旦发生错误就向芯片发出重启信号。外界干扰会影响单片机的正常工作,从而导致单片机控制系统发生不可预料的后果。使用硬件看门狗,可以预防程序发生死循环。应用看门狗电路后单片机可以在无人状态下连续工作。硬件看门口电路,利用一个定时器来监控主程序的运行。

void IWDG_Init(u8 prer,u16 rlr)
{
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作

        IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64

        IWDG_SetReload(rlr);  //设置IWDG重装载值

        IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器

        IWDG_Enable();  //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{
        IWDG_ReloadCounter();//reload
}

配置信息存储:FLASH的读写。

在进行开发时,需要将网络配参数进行保存保存,如IP地址、端口号、ClientID、用户名、密码等信息在单片机FLASH指定地址进行存储,下次连接需要使用这些数据时,直接从FLASH中读取。

//解锁 
				FLASH_Unlock();
//清除标志位
				FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGAERR | FLASH_FLAG_WRPERR);
//清空状态指示标志位 
				FLASHStatus = 1;        	
//擦除预写入页
				FLASHStatus = FLASH_ErasePage(STARTADDR);//擦除整页	
//写入配置信息		
				for(i=0;i<300;i++)
			{
				FLASH_FastProgramWord(STARTADDR, str100[i]);
				STARTADDR =STARTADDR +4;
			}
																									
				FLASH_Lock();
		}

STM32通用定时器:定时上发路灯状态

平台询问路灯状态与路灯主动上发状态的设计,双重保障。让路灯管理更加实时可靠。在收到询问消息前,物联网智能设备处于低功耗模式,更好的减少资源消耗,平台定时询问路灯状态后,智能路灯会上发实时状态,当然它也会定时上发自己的状态。

路灯状态获取:采用光照传感器检测路灯故障,当路灯出现故障,打开路灯时光照传感器采集到的adc值低于额定值,打开路灯就被定义为打开异常,此时硬件设备发布打开异常的消息,MQTT服务器接收到后将异常显示在前端页面,提醒巡检员进行维修。

//光照传感器ADC数据的采集
          adc1=(float)((float)ADC_ConvertedValue*VREF)/MAX_CONVERTD; //PC0
          printf("adc1=%f \r\n",adc1);
          val = (int )adc1 ;
          printf("val=%d \r\n",val);
/*******************************************************************************
定时器设置
*******************************************************************************/
#include "timer.h"
#include "usart.h"
#include <stm32l1xx.h>
unsigned char Timeout;
unsigned char uart1_getok;

volatile u32  sec=1;

void TIM3_Int_Init(u16 arr,u16 psc)
{   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
    
    //定时器TIM3初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值    
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


    TIM_Cmd(TIM3, ENABLE);  //使能TIMx                     
}

//定时器3中断服务程序
void TIM3_IRQHandler()   //TIM3中断
{   
 
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
        {
         TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
         //LED1=!LED1; 
      }
        sec++;  
}
/*******************************************************************************
设置主动上发状态的时间
*******************************************************************************/

	 if(sec%20 == 0)
	    {  
		 printf("\r\n主动定时报告\r\n主动定时报告\r\n主动定时报告\r\n主动报告\r\n主动定时报告\r\n");
		 fa();
        }

效果展示及系统测试:远程打开/关闭路灯及路灯异常检测 

打开路灯:

 

 

关闭路灯:

                      

 

路灯异常测试:

在打开路灯前用不透明纸片遮挡光照传感器,模拟路灯打开异常状态,即打开路灯时灯泡不亮的状态。打开路灯时光照传感器采集到的adc值不在额定范围内,打开路灯就被定义为打开异常,此时硬件设备会向MQTT服务器发布打开异常的主题,路灯的状态结果将会是:在线-打开异常。如图标记部分所示为了模拟路灯打开异常状态,用纸片遮住光照传感器。

 

路灯异常检测: 

         

 

                            

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值