MQ135空气质量传感器
B站博主这个是STM32F103C8T6的标准库的代码,资料在大二寒假学习资料里面CSDN的参考资料这个博主是直接用的ADC然后在主函数里面编写的程序,没有把MQ135封装起来。MQ135使用的规则就是开一个ADC,然后ADC采集,公式转换成电压量 ,没有底层驱动文件。这个博主用到是STM32F103RBT6的板子这个博主把使用ADC采集的MQ135封装成了一个函数,但要注意的是他使用的是F4的板
一、参考资料
B站博主
这个是STM32F103C8T6的标准库的代码,资料在大二寒假学习资料里面
CSDN的参考资料
这个博主是直接用的ADC然后在主函数里面编写的程序,没有把MQ135封装起来。MQ135使用的规则就是开一个ADC,然后ADC采集,公式转换成电压量 ,没有底层驱动文件。这个博主用到是STM32F103RBT6的板子
这个博主把使用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循环里面,不然就只读取一次
六、效果展示
更多推荐
所有评论(0)