實現基於RS-485通信和Modbus協議的遠程智能消防監測系統


題目要求:

  • 監測端上電后LED1至LED8全部熄滅,LED9每隔2秒閃爍一次(亮0.5秒,滅1.5秒)。
  • 采集端測到火焰時,監測端LED1至LED4出現流水燈效果。
  • 采集端火焰消失后,監測端流水燈效果保持。
  • 按下一次監測端KEY1按鍵,能停止流水燈效果。

使用2塊M3主控模塊、1個火焰傳感器模塊,選取一塊M3主控模塊作為監測端,另一塊M3主控模塊安裝火焰傳感器模塊作為采集端。

 

1、將“485采集端程序.hex”文件下載到采集端,使用“485節點配置工具.exe”配置采集端地址為0x01、傳感器類型為火焰傳感器。將監測端和采集端通過右上方485通信口(J5接口)進行通信連接。

2、使用STM32CubeMX圖形化配置工具為監測端生成KEIL開發工程,將STM32CubeMX自身項目和生成的工程保存到工程目錄中。

使用STM32CubeMX進行以下配置:

  •  (1)LED1-LED9和KEY1所在的GPIO的配置、串口
  • (2)USART2的設置為:波特率115200bps,8位數據位,1位停止位,無校驗位。
  •  (3)PC9引腳控制485通信芯片收發轉換(低電平接收,高電平發送)。
  •  (4)完成時鍾樹配置:主頻72M
  •  (5)配置定時器的工作參數
  •    (6) 配置調試端口

 

 

 

 

 

 

 

 

 

 

 

 

3、監測端通電后,板上LED1至LED8全部熄滅,LED9每隔2秒閃爍一次(亮0.5秒,滅1.5秒)。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_RESET);
      HAL_Delay(500);
      HAL_GPIO_WritePin(LED9_GPIO_Port,LED9_Pin,GPIO_PIN_SET);
      HAL_Delay(1500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

4、監測端每隔2秒向采集端查詢一次火情,當采集端出現火情時,監測端的LED1至LED4按指定流水燈方式顯示。當采集端火情消失后,監測端的LED1至LED4應保持流水燈顯示方式。具體流水燈顯示方式為LED1亮起->LED2亮起->LED3亮起->LED4亮起->LED1至LED4全部熄滅->重復前述效果,各顯示切換間隔為1秒。

監測端每隔2秒向采集端查詢一次火情,

 

 SendCmd()

/* USER CODE BEGIN 0 */
void SendCmd(void)
{
    uint8_t cmd[8] = {0};
    cmd[0] = 0x01;
    cmd[1] = 0x04;
    cmd[2] = 0x00;
    cmd[3] = 0x02;
    cmd[4] = 0x00;
    cmd[5] = 0x01;
    cmd[6] = 0x90;
    cmd[7] = 0x0A;
    HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_SET);
    HAL_UART_Transmit(&huart2,cmd,8,0xffff);
    HAL_GPIO_WritePin(CONPIN_GPIO_Port,CONPIN_Pin,GPIO_PIN_RESET);
    HAL_UART_Receive_IT(&huart2,rxBuf,7);
}

/* USER CODE END 0 */
 /* USER CODE BEGIN 2 */
//定時器6,7使能
  if(HAL_TIM_Base_Start_IT(&htim6) != HAL_OK)
  {
      Error_Handler();
  }
  if(HAL_TIM_Base_Start_IT(&htim7) != HAL_OK)
  {
      Error_Handler();
  }

  /* USER CODE END 2 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM6)
    {
        if(flag_fire == 1)
        {
            ledState = ledState>>1;
            ledState |= 0x0080;
            if(ledState == 0x00f8)
                ledState = 0;
            HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOE,ledState,GPIO_PIN_RESET);
        }
        
    }
    
    if(htim->Instance == TIM7)
    {
        SendCmd();        
    }
}

判斷火情

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART2)
    {
        if((rxBuf[0] == 0x01) && (rxBuf[1] == 0x04))
        {
            uint16_t temp = 0;
            temp = ((uint16_t)rxBuf[3])<<8;
            temp = temp | rxBuf[4];
            if(temp > 100)
            {
                flag_fire = 1;
            }
        }
    }
    
}

按鍵停止流水燈

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin & GPIO_PIN_13)
    {
        if(flag_fire == 1)
        {
            flag_fire = 0;
            ledState = 0;
            HAL_GPIO_WritePin(GPIOE,0xffff,GPIO_PIN_SET);
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM