目录
MQTT服务器的连接:打开 MQTT 客户端网络及连接客户端至 MQTT 服务器。
订阅与发布:订阅激活、开\关路灯相关主题;发布反馈结果及状态信息相关主题。
硬件看门狗:程序出现死循环时,通过及时喂狗让系统进行复位让系统更加可靠稳定。
摘要
随着科技社会的不断发展,传统路灯已经不能满足绿色、环保、节能生活的需求。越来越多的照明系统开始通过网络控制平台进行在线管理,实现新时代新理念的智能生活。针对目前节能生活的迫切需求,经过此次项目开发,设计并实现了智能灯具控制系统。
经过系统需求获取与分析、设计、实现、测试等环节完成了本设计,构建了用例模型、分析模型,设计了系统体系结构、部署方案、配置信息存储方案。系统以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服务器发布打开异常的主题,路灯的状态结果将会是:在线-打开异常。如图标记部分所示为了模拟路灯打开异常状态,用纸片遮住光照传感器。
路灯异常检测: