STM32F103RC 2路ADC 采集显示,水位传感器、MQ2


  自己做小项目的时候需要测量水位和MQ2空气质量,使用的是DMA配合ADC进行采集,虽然我只是2路采集,但是可以在这个基础之上进行修改进行多路采集,水位传感器和MQ2其本质还是ADC模数转换,最后附上我自己的工程文件,有需要自己下载。

1、水位传感器和MQ2简介

1.1、水位传感器:

在这里插入图片描述
  Water Sensor水位传感器是一款简单易用、性价比较高的水位/水滴识别检测传感器,其是通过具有一系列的暴露的平行导线线迹测量其水滴/水量大小从而判断水位。轻松完成水量到模拟信号的转换,,达到水位报警的功效。

工作电压:DC3-5V
工作电流:小于20mA
传感器类型:模拟
检测面积:40mm x 16mm
制作工艺:FR4双面喷锡
工作温度:10-30℃
工作湿度:10%-90%无凝结
产品重量:3.5g
产品尺寸:62mm x 20mm x 8mm

1.2、MQ2

在这里插入图片描述

MQ2在网上的介绍还是比较多的,我就不再多说了,附上一个链接有需要的自己去看看https://blog.csdn.net/qq_41422043/article/details/89138213
关于MQ2的电压转换请看:https://blog.csdn.net/qq_43313535/article/details/106389539

2、使用代码

初始化MDA,代码里面有详细的注释,
在这里插入图片描述
初始化PA0、PA1为模拟输入引脚,
在这里插入图片描述
主函数:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include "mq2.h"

//ADC实现ADC1通道0-1
extern __IO uint16_t  ADC_ConvertedValue[2];
   	
 int main(void)
 {
    
     
	u8 i;
	float temp1,temp2;	 
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	LCD_Init();			 	
 	Adc_Init();		  		//ADC初始化
	 
	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(44,50,200,16,16,"Mini STM32");	
	LCD_ShowString(44,70,200,16,16,"ADC TEST");	
	LCD_ShowString(44,90,200,16,16,"QingYeMuRong");
	LCD_ShowString(44,110,200,16,16,"2020/7/19");	
	//显示提示信息
	POINT_COLOR=BLUE;//设置字体为蓝色
	LCD_ShowString(44,130,200,16,16,"ADC_CH0_VAL:");	      
	LCD_ShowString(44,150,200,16,16,"ADC_CH0_VOL:");	//先在固定位置显示小数点   
	
	
	LCD_ShowString(44,170,200,16,16,"ADC_CH1_VAL:");	      
	LCD_ShowString(44,190,200,16,16,"ADC_CH1_VOL:");	//先在固定位置显示小数点   

	while(1)
	{
    
    
		temp1 = Get_ADCValue_Water(); //水位获取
		temp1 = temp1 *40/4096;
		temp2 = MQ2_GetPPM(); //气体
		
		printf("水位:%f mm , 气体:%f ppm\r\n",temp1,temp2);
		
		LCD_ShowxNum(140,130,ADC_ConvertedValue[0],4,16,0);//显示ADCC采样后的原始值		
		i=temp1; 
		LCD_ShowxNum(140,150,i,2,16,0);//显示电压值  
		temp1-=i;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
		temp1*=1000;                           //小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。
		LCD_ShowString(156,150,200,16,16,".");
		LCD_ShowxNum(164,150,temp1,3,16,0X80);//
		LCD_ShowString(180,150,200,16,16," mm");
		
		
		
		LCD_ShowxNum(140,170,ADC_ConvertedValue[1],4,16,0);//显示ADCC采样后的原始值		
		i=temp2; 
		LCD_ShowxNum(140,190,i,4,16,0);//显示ppm
		temp2-=i;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
		temp2*=1000;  
    //LCD_ShowString(156,190,200,16,16,".");		//小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。
		//LCD_ShowxNum(172,190,temp2,3,16,0X80);//
		LCD_ShowString(180,190,200,16,16," ppm");
		LED0=!LED0;
		delay_ms(1000);	
	}											    
}	

效果图:
在这里插入图片描述
使用的是正点原子的MINI板,但是并不影响代码的移植。
工程文件下载https://download.csdn.net/download/weixin_45488643/12640623

猜你喜欢

转载自blog.csdn.net/weixin_45488643/article/details/107454664