STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据和DS18B20并通过OLED显示
关于MQ135,DS18B20和OLED的使用,在之前的文章中都有写过(传送门):
MQ135、DS18B20、OLED
本次实验是将这几个传感器组在一起做一个场景模拟
一、软件准备
软件准备
二、硬件准备
STM32F407霸天虎
DAP高速下载器
USB转串口线
三、CubeMX配置
STM32F407霸天虎用的是STM32F407ZGT6
选择外部高速时钟
I2C的配置如下:
ADC配置如下:
tim的配置
DS18B20的引脚
时钟树选择168MHz,具体配置方法见上篇的时钟树配置
而后根据自己的喜好编辑工程的名称,存放位置,IDE选择ARM-MDKV5
四、Keil
由于我们的Debug用的是DAP,如图下选择Debug和下载配置
MQ135.c
#include "MQ135.h"
#include "adc.h"
#include "oled.h"
#include <math.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
* @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;
OLED_ShowCHinese(0,2,5); //空
OLED_ShowCHinese(0+16,2,6); //气
OLED_ShowCHinese(0+16+16,2,7); //质
OLED_ShowCHinese(0+16+16+16,2,8); //量
OLED_Showfloat(80,2,vol ,1,3,16);
HAL_Delay(100);
}
MQ135.h
#ifdef __MQ135_H__
#define __MQ135_H__
#include "stm32f4xx_hal.h"
void MQ135_Init(void);
void MQ135_ReadData(void);
#endif
main函数
/* USER CODE BEGIN 2 */
OLED_Init();
OLED_Clear();
MQ135_Init();
uint16_t temp;
int intT;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
OLED_ShowCHinese(0,0,0); //物
OLED_ShowCHinese(16,0,1); //联
OLED_ShowCHinese(32,0,2); //网
OLED_ShowCHinese(48,0,3); //小
OLED_ShowCHinese(64,0,4); //白
temp = DS18B20_Read_Temperature();
intT = temp >> 4 ; /*合成实际温度整数部分*/
OLED_ShowCHinese(0,4,9); //温
OLED_ShowCHinese(48,4,10); //度
OLED_ShowNum(80,4,intT,2,16);
MQ135_ReadData();
HAL_Delay(500);
}
/* USER CODE END 3 */