智能路灯平台灯具控制系统的设计与实现
目錄
摘要? ? ? ??
研究過程與總體設計:
關鍵技術: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預分頻值為64IWDG_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; //PC0printf("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_timTIM_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服務器發布打開異常的主題,路燈的狀態結果將會是:在線-打開異常。如圖標記部分所示為了模擬路燈打開異常狀態,用紙片遮住光照傳感器。
?
路燈異常檢測:?
? ? ? ? ?
?
? ? ? ? ? ? ? ? ?? ? ? ? ? ?
總結
以上是生活随笔為你收集整理的智能路灯平台灯具控制系统的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 达梦数据库DCA培训心得
- 下一篇: 达梦数据库培训学习学习心得