个人技术分享

系统功能:

此设计采用STM32单片机将采集到的环境环境温湿度,光照强度,火焰传感器状态,烟雾值,空气质量值等数据显示在OLED上,并将这些信息通过上报至手机APP。系统可通过手机蓝牙APP修改各传感器阈值.

蓝牙连接后,如果系统处于自动状态则每隔5秒钟上报一次系统状态。

如果系统处于手动状态下则可通过蓝牙下发控制命令,

发送字符A增加光照设定阈值,

发送字符B减小光照设定阈值,

发送字符C增加MQ2设定阈值,

发送字符D减小MQ2设定阈值,

发送字符E增加MQ135设定阈值,

发送字符F减小MQ135设定阈值。

主要功能模块原理图:

电源时钟烧录接口:

单片机和按键输入电路:

传感器采集电路:

资料获取地址

系统主要功能模块代码

初始化代码: 

 /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */

    InitVar();

  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  MX_ADC1_Init();

  /* USER CODE BEGIN 2 */

//在HAL库初始化串口1后调用

    HAL_Delay(100);

    SetUart1RxToInput();

    HAL_Delay(50);

//uart1打开接收中断

    HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart1RecBuff, 1);

    InitOled();

    InitOledDisp();

ResetDHT11();

系统控制代码:

//系统信息更新

void SystemControl(void)

{

    static uint8_t updateCnt = 0;

   

    updateCnt++;   

    if(updateCnt>=SYSTEM_UPDATE_INTER)

    {

        updateCnt = 0;

        if(DHT11ReadData()==0)  //DHT11温湿度读取OK

        {

            ;

        }

        if(bleCtrl==false)

        {

            UpdateBleData();

        }

    }

    ReadSensorVal();

//显示不同页面

    if(dispPageIndex==DISP_PAGE_1)

    {

        OledDispPage1();

    }

    else if(dispPageIndex==DISP_PAGE_2)

    {

        OledDispPage2();

    }

    else if(dispPageIndex==DISP_PAGE_3)

    {

        OledDispPage3();

    }

    else if(dispPageIndex==DISP_PAGE_4)

    {

        OledDispPage4();

    }

}

串口处理蓝牙控制命令代码:

/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    if(USART1== huart->Instance)

    {

//系统在手动模式下才可以远程操作   

        if(bleCtrl==true)

        {

            if(uart1RecBuff=='A')   //增加阈值-page2 

            {

                dispPageIndex = DISP_PAGE_2;

                if(setLightVal>=SET_LIGHT_MAX)

                {

                    setLightVal = SET_LIGHT_MAX;

                }

                else

                {

                    setLightVal += 200;

                }

                printf("setLight:%d\r\n", setLightVal);   

            }

            else if(uart1RecBuff=='B')  //减少阈值-page2 

            {

                dispPageIndex = DISP_PAGE_2; 

                if(setLightVal<=SET_LIGHT_MIN)

                {

                    setLightVal = SET_LIGHT_MIN;

                }

                else

                {

                    setLightVal -= 200;

                }

                printf("setLight:%d\r\n", setLightVal);         

            }

            else if(uart1RecBuff=='C')  //增加阈值-page3

            {

                dispPageIndex = DISP_PAGE_3;

                if(setMQ2Val>=SET_MQ2_MAX)

                {

                    setMQ2Val = SET_MQ2_MAX;

                }

                else

                {

                    setMQ2Val += 100;

                }               

                printf("setMQ2:%d\r\n", setMQ2Val);   

            }

            else if(uart1RecBuff=='D')  //减少阈值-page3

            {

                dispPageIndex = DISP_PAGE_3;

                if(setMQ2Val<=SET_MQ2_MIN)

                {

                    setMQ2Val = SET_MQ2_MIN;

                }

                else

                {

                    setMQ2Val -= 100;

                }               

                printf("setMQ2:%d\r\n", setMQ2Val);   

            }  

            else if(uart1RecBuff=='E')  //增加阈值-page4

            {

                dispPageIndex = DISP_PAGE_4;

                if(setMQ135Val>=SET_MQ135_MAX)

                {

                    setMQ135Val = SET_MQ135_MAX;

                }

                else

                {

                    setMQ135Val += 100;

                }                

                printf("setMQ135:%d\r\n", setMQ135Val);            

            }

            else if(uart1RecBuff=='F')  //减少阈值-page4

            {

                dispPageIndex = DISP_PAGE_4;

                if(setMQ135Val<=SET_MQ135_MIN)

                {

                    setMQ135Val = SET_MQ135_MIN;

                }

                else

                {

                    setMQ135Val -= 100;

                }                

                printf("setMQ135:%d\r\n", setMQ135Val);                        

            }            

        }

// Wait completly receive 1 byte data, and put data in rDataBuffer

        while(HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart1RecBuff, 1) != HAL_OK);

    }

}


/* USER CODE END 4 */

此设计提供的资料包含原理图PCB(包含PDF,AD,立创EDA三个版本),源代码,系统框图,主程序流程图,物料清单(包含使用到的器件手册),功能操作说明等。