目錄
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服務器發佈打開異常的主題,路燈的狀態結果將會是:在線-打開異常。如圖標記部分所示爲了模擬路燈打開異常狀態,用紙片遮住光照傳感器。
路燈異常檢測: