STM32实现氧气浓度传感器AO-03氧气浓度实时监测

目录

一、前言


一、前言

学校:合肥工业大学

作者:覃祉禄

MCU:STM32F103C8T6

IDE:Keil u Vision 5

通信模式:ADC模数转换

使用器件:STM32F103C8T6单片机、AO-03 氧气浓度传感器、0.96寸OLED显示屏、电源模块、面包板、杜邦线、跳线等

二、项目简介

        AO-03 氧气浓度传感器是一款应用电化学原理测定氧气浓度的传感器。采用模制主体设计,具有响应速度快、准确可靠等特点。AO-03 氧气浓度传感器体积较小,便于安装在便携式仪表上,且与同类型的传感器相比性价比更高。

三、电路设计

1、设计说明

        本项目使用的氧气浓度传感器AO-03原理非常简单,如上图所示,其本体已经集成为了一个小模块,该模块仅有3个引脚,及正负电源引脚和AO电压输出引脚,也就是说我们仅需通过将单片机的引脚配置为模拟输入模式,检测传感器AO电压输出引脚的电压,然后再根据电压与氧气浓度的关系转换,即可测量出当前的氧气浓度,通过OLED显示屏显示,从而实现氧气浓度的实时监测。其中电源模块为其提供+5V电压和3.3V电压。

2、接线设计

STM32----------AO-03

PA0-----------AO

+5V----------VCC

GND----------GND

STM32----------OLED

PB8----------SCL

PB9----------SDA

VCC----------VCC

GND----------GND

3、接线说明

        STM单片机与AO-03的接线中我们通过配置单片机的PA0为模拟输入模式检测传感器AO端口的氧气浓度。OLED显示屏的接线中用到的是单片机的PA8与PA9,这两个接口使用的是软件读写I2C,可以配置任意引脚,相对比较灵活。我是用的OLED代码是B站up主江协科技STM32教学视频里边OLED模块的代码,大家可以用自己的OLED显示代码或是通过串口的形式在电脑上显示。相应的代码我也会放在我的博客主页中。

4、氧气浓度公式转化

 四、代码设计

        以下为ADC模拟电压输入的代码设计以及主函数代码,OLED代码沉长这里不在显示,相应的源文件代码和工程文件可以到我的主页下载。

 main.c(主函数)
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"

uint16_t ADValue;
float Voltage;
float O2;

int main(void)
{
	OLED_Init();
	AD_Init();
	
	OLED_ShowString(1, 1, "ADValue:");
	OLED_ShowString(2, 1, "Voltage:0.00V");
	OLED_ShowString(3,1,"O2:00.0%"); 
	while (1)
	{
		ADValue = AD_GetValue();
		Voltage = (float)ADValue / 4095 * 5;
		O2 = (float)ADValue * 0.434 - 32; //32是偏差调整
		
		OLED_ShowNum(1, 9, ADValue, 3);
		OLED_ShowNum(2, 9, Voltage, 1);
		OLED_ShowNum(2, 11,(uint16_t)(Voltage * 100) % 100, 2);
		OLED_ShowNum(3, 4, (uint16_t)O2 / 10, 2); 
		OLED_ShowNum(3, 7, (uint16_t)O2 % 10, 1); 
		
		Delay_ms(100);
	}
}
 delay.c(延时函数源文件)
#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 
 delay.h
#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif
  AD.c(模式转换代码)
#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_Cmd(ADC1, ENABLE);
	
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
	return ADC_GetConversionValue(ADC1);
}
 AD.h
#ifndef __AD_H
#define __AD_H

#include "stm32f10x.h"                  // Device header

void AD_Init(void);
uint16_t AD_GetValue(void);

#endif

(以上便是氧气浓度传感器AO-03模块的全部说明,如有不足望指正)

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤凰谪仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值