zoukankan      html  css  js  c++  java
  • 实现基于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);
            }
        }
    }
  • 相关阅读:
    Maximum Depth of Binary Tree
    Single Number
    Merge Two Sorted Lists
    Remove Nth Node From End of List
    Remove Element
    Remove Duplicates from Sorted List
    Add Two Numbers
    编译视频直播点播平台EasyDSS数据排序使用Go 语言 slice 类型排序的实现介绍
    RTMP协议视频直播点播平台EasyDSS在Linux系统中以服务启动报错can’t evaluate field RootPath in type*struct排查
    【解决方案】5G时代RTMP推流服务器/互联网直播点播平台EasyDSS实现360°全景摄像机VR直播
  • 原文地址:https://www.cnblogs.com/jsit-dj-it/p/12112922.html
Copyright © 2011-2022 走看看