智能路燈平臺燈具控制系統

目錄

摘要        

研究過程與總體設計:

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

 

路燈異常檢測: 

         

 

                            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章