一、参考资料

B站博主 

http://【MQ-135空气质量传感器(STM32)】https://www.bilibili.com/video/BV1mjWXeLEeL?vd_source=70e3aaa6cbfe13f5858272f48dacf336

 这个是STM32F103C8T6的标准库的代码,资料在大二寒假学习资料里面

CSDN的参考资料

https://blog.csdn.net/WandZ123/article/details/124476424?fromshare=blogdetail&sharetype=blogdetail&sharerId=124476424&sharerefer=PC&sharesource=2301_81764359&sharefrom=from_link

        这个博主是直接用的ADC然后在主函数里面编写的程序,没有把MQ135封装起来。MQ135使用的规则就是开一个ADC,然后ADC采集,公式转换成电压量 ,没有底层驱动文件。这个博主用到是STM32F103RBT6的板子

https://blog.csdn.net/weixin_43329283/article/details/126865110?fromshare=blogdetail&sharetype=blogdetail&sharerId=126865110&sharerefer=PC&sharesource=2301_81764359&sharefrom=from_link

        这个博主把使用ADC采集的MQ135封装成了一个函数,但要注意的是他使用的是F4的板子,所以驱动文件需要稍微改一下。

二、基础知识 

        这个我们给电压是要给5V电压的,不然就空气质量显示的数据是0或1。我们只需要接AO口,而且这个口是CubeMx里面开的一个ADC的通道

三、CubeMx及Keil的配置 

 

 四、串口函数的修改

         这个随便放在哪里都可以,只要在printf的程序文件里面有写头文件就行

#include "stdio.h"
int fputc(int ch,FILE *f)
{   HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    return ch;
}

五、Kile5的代码

(1)封装函数的代码

main.c函数里面
#include "mq135.h"
MQ135_Init();
MQ135_ReadData();

 

 

注意:

        这个MQ135_Init();一定要放在while循环里面,不然就只读取刚上电的那个空气质量的值

mq135.c函数
#include "MQ135.h"

#include "stdio.h"
  

/**
  * @brief    MQ135的初始化,启动ADC1
  * @param    none
  * @retval   none
*/
void MQ135_Init(void)
{
	HAL_ADC_Start(&hadc1);
  
  HAL_ADC_PollForConversion(&hadc1, 50);
	
}




/**
  * @brief    读取MQ135的ADc值
  * @param    none 
  * @retval   none
*/


void MQ135_ReadData(void)
{
	float vol;				//实际所得的电压值
	int val;					//输入转换的数字量
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
        {
            val = HAL_ADC_GetValue(&hadc1);
        }
				vol = (float)val*3.3 / 4096;

		//串口打印
		printf("\n\r ADC:%02d\n\r",val);
  
		printf("\n\r VOL:%02f\n\r",vol);
        HAL_Delay(500);
} 
 注意:

        printf后面要写延时函数,不然串口就打印不出来

mq135.h函数
#ifndef __MQ135_H
#define __MQ135_H
#include "usart.h"
#include "main.h"
#include "adc.h"


void MQ135_Init(void);
void MQ135_ReadData(void);


#endif

(2)未封装函数代码

main.c函数
 /* USER CODE BEGIN 1 */
   #include "stdio.h"
  
    float temp;
    int Val;
  /* USER CODE END 1 */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
    return ch;
}
/* USER CODE END PTD */
while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

        HAL_ADC_Start(&hadc1);
  
      HAL_ADC_PollForConversion(&hadc1, 50);   
	  
        if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
        {
            Val = HAL_ADC_GetValue(&hadc1);
        }
        temp = (float)Val*3.3 / 4096;
        
		
		//串口打印
		printf("\n\r ADC:%02d\n\r",Val);
        HAL_Delay(500);
		printf("\n\r VOL:%02f\n\r",temp);
        HAL_Delay(500);

  }
 注意:

      HAL_ADC_Start(&hadc1);
      HAL_ADC_PollForConversion(&hadc1, 50);这两行代码要放在while循环里面,不然就只读取一次   

六、效果展示

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐