首页 > 其他分享 >记录一下7

记录一下7

时间:2024-08-14 15:24:43浏览次数:13  
标签:记录 一下 RATE WATER WaterFlag 按键 CapRate THD

项目场景:

接上一条,电容式触摸按键实现水位检测(CA51F351S3)


问题描述

一、水位判断

一开始为了图省事只用到了一个标志位来表示水位的状态,但是这种方法存在一定的局限性,就是2的水位却和3息息相关云云,这在逻辑上看起来没有问题,但是实际应用起来很容易出现今天调好了没问题,明天一早起来就不行了这种情况,就是不太稳定。

	if(CapRate_3 < WATER_RATE_THD_3){		   //CapRate是通过实时采集到的按键值计算得到的比例,WATER_RATE_THD是根据经验设定的门限值
	   WaterFlag = 3;
	}
	else if((CapRate_3 > NO_WATER_RATE_THD_3)&&(CapRate_2 < WATER_RATE_THD_2)){
	    WaterFlag = 2;
	}
	else if((CapRate_2 > NO_WATER_RATE_THD_2)&&(CapRate_1 < WATER_RATE_THD_1)){		
	    WaterFlag = 1;
	}    
	else if(CapRate_1 > NO_WATER_RATE_THD_1){
	    WaterFlag = 0;
	} 
	if(buf!=WaterFlag){
        switch(WaterFlag)
        {
            case 1:	TK_Debug_UartPutChar('a');						
                break;
            case 2: TK_Debug_UartPutChar('b');     	
                break;
            case 3: TK_Debug_UartPutChar('c');	
                break;
        }
        buf=WaterFlag;
    }

解决方案:

一、水位判断

在马工的建议下,对每个的标志位进行区分,并把他们存储在数组中,对每个按键的情况分别进行判断,有水为1,无水则为0.这样改正之后确实更加稳定了。

if(!WaterFlag[0])
		{
			if(CapRate_1 < WATER_RATE_THD_1)		
			{
				WaterFlag[0] = 1;
			}
		}
		else
		{
			if(CapRate_1 > NO_WATER_RATE_THD_1)	   
			{
				WaterFlag[0] = 0;
			}
		}    

        if(!WaterFlag[1])
		{
			if(CapRate_2 < WATER_RATE_THD_2)		
			{
				WaterFlag[1] = 1;
			}
		}
		else
		{
			if(CapRate_2 > NO_WATER_RATE_THD_2)	   
			{
				WaterFlag[1] = 0;
			}
		}   
        
        if(!WaterFlag[2])
		{
			if(CapRate_3 < WATER_RATE_THD_3)		
			{
				WaterFlag[2] = 1;
			}
		}
		else
		{
			if(CapRate_3 > NO_WATER_RATE_THD_3)	   
			{
				WaterFlag[2] = 0;
			}
		}   

同时,主函数的串口打印也要做出调整

		if(WaterFlag[0]&&WaterFlag[1]&&WaterFlag[2]){
            if(temp!=d){
              uart_printf("%d\r\n",d);//这样就只有在变化的时候才会串口输出
                temp=d;
            }
        }
        else if(WaterFlag[0]&&WaterFlag[1]){
            if(temp!=c){
                uart_printf("%d\r\n",c);
                temp=c;
            }
        }
        else if(WaterFlag[0]){
            if(temp!=b){
                uart_printf("%d\r\n",b);
                temp=b;
            }
        }
        else{
            if(temp!=a){
                uart_printf("%d\r\n",a);
                temp=a;
            }
        }

二、基准值更新

通常情况下,按键被按下后按键值会变小,通过按键值与基准值的差值与门限值进行比较,来判断按键是否被按下,开启此宏之后,当按键按下一定时间后,会把基准值更新为当前按键值。

	#define FINGER_LONG_TOUCH_TIME_LIMIT			0    	//限制按键输出时间,单位为0.5s,若定义为0,则关闭此功能	

三、板子上的电容

在这里插入图片描述
5号引脚对应通道TK2外接电容作为参考通道,不用接出(一开始理解错误参考通道的含义了,以为要接出来按键才行)。2号引脚对应通道TK_CAP,调整它的大小,可以改变各个按键的灵敏度,容值越大,灵敏度越大,可用范围10nF~47nF.

四、串口打印

要通过串口打印达到c语言中printf的效果,只需要在uart.c中加入以下函数(记得在头文件中进行函数声明)

	void UartPutStr(char *str)
	{
		while(*str)
		{	
	 		Uart0_PutChar(*str++);
		}
	}
	
	void uart_printf(char *fmt,...) 
	{
	    va_list ap;
	    char xdata string[128];
	    va_start(ap,fmt);
	    vsprintf(string,fmt,ap);
	    UartPutStr(string);
	    va_end(ap);
	}

五、调试

要使用触摸开发调试,只需要在程序中打开Debug的宏定义,并关掉程序中其他地方的串口,因为要用到串口。

	#define DEBUG 									1	

同理,要使用keil自带的调试,也需要关掉串口。

	#define UART0_EN			//如果使用UART0,打开此宏定义	

应该意识到,以后的代码中要更加熟练宏的运用,来使调试和集成多功能更加方便。

希望这个Demo可以尽快结束,我快受不了啦……

标签:记录,一下,RATE,WATER,WaterFlag,按键,CapRate,THD
From: https://blog.csdn.net/qq_56353083/article/details/141180888

相关文章

  • 【开端】如何高效记录并整理编程学习笔记
    如何高效记录并整理编程学习笔记?在编程学习的海洋中,高效的笔记记录和整理方法就像一张珍贵的航海图,能够帮助我们在浩瀚的知识中找到方向。如何建立一个既能快速记录又易于回顾的笔记系统?如何在繁忙的学习中保持笔记的条理性?让我们一起探讨如何打造属于自己的编程学习“知识宝......
  • 关于c++ 匿名函数的 记录
    后续补充与测试在C++中,匿名函数(lambda表达式)要使用同作用域下的一个临时变量,可以通过捕获列表和参数列表的不同组合来实现。以下是几种常见的组合:1.按值捕获([=]):inttemp=10;autolambda=[=](){returntemp;};1.按引用捕获([&]):inttemp=10;autolambda=[&](){r......
  • MX Weekly 赛时/VP 记录
    感觉题目质量比较高,所以挖了个坑((。X2前三题简单不写洛谷-P10855傻逼赛时想出两种正确思路都他妈的没仔细想,真糖丸了不妨将题目中要求的式子化简。\[\begin{equation}\begin{split}\sum\limits_{i=1}^n\sum\limits_{j=1}^i\gcd(j,i\oplusj)^k&=\sum\limits_{j=1}^n\su......
  • centos7 安装docker 并运行es、rabbitmq 服务 记录
    部署docker当执行 yuminstall-ydocker-cedocker-ce-clicontainerd.iodocker-buildx-plugindocker-compose-plugin出现  “[Errno14]curl#7-“Failedtoconnectto2a03:2880:f10e:83:face:b00c:0:25de:网络不可达”修改其下载源:yum-config-manager--add-repo......
  • 打靶记录9——Vikings
    靶机下载地址:https://www.vulnhub.com/entry/vikings-1,741/难度:低(中),CTF风格的靶机目标:取得root权限+2个flag涉及的攻击方法:主机发现端口扫描Web信息收集编码转换/文件还原离线密码破解隐写术二进制文件提取素数查找/科拉茨猜想RPC漏洞提权主机发现:sudoarp-sc......
  • 打靶记录9——Vikings
    靶机下载地址:https://www.vulnhub.com/entry/vikings-1,741/难度:低(中),CTF风格的靶机目标:取得root权限+2个flag涉及的攻击方法:主机发现端口扫描Web信息收集编码转换/文件还原离线密码破解隐写术二进制文件提取素数查找/科拉茨猜想RPC漏洞提权主机发现:sud......
  • 如何高效记录并整理编程学习笔记?
    如何高效记录并整理编程学习笔记?在编程学习的海洋中,高效的笔记记录和整理方法就像一张珍贵的航海图,能够帮助我们在浩瀚的知识中找到方向。如何建立一个既能快速记录又易于回顾的笔记系统?如何在繁忙的学习中保持笔记的条理性?让我们一起探讨如何打造属于自己的编程学习“知识宝......
  • [CS61A] 学习记录六 Lab2 题解思路分享
    前言观前提示,笔者写的代码答案放在GitHub仓库中,此处仅记录过程与心得。此外,请最好在尝试独立完成该任务后再看本文,否则就很可能失去了体验本项目精华的机会正文Q1:WWPD:LambdatheFree有两个问题有点意思。lambda与参数>>>b=lambdax:lambda:x#Lambdascanr......
  • TIOBE 8月编程排行榜出炉!Python 正在追赶 Java 的 TIOBE 指数记录
    2024年8月的TIOBE编程语言排行榜出炉了!对于开发者而言,这份排行榜不仅仅是编程语言的简单排序,更是行业趋势的风向标。而今年,Python的表现格外引人注目,它正在一步步逼近Java的TIOBE指数记录。让我们一起看看这两大编程巨头在本月的激烈角逐吧。为什么Python在这几年的排行榜中节节......
  • 8.13 模拟赛 T3 记录
    题源发现\(v\)范围很小,有一个基于\(v\)的策略就是从\(1\)开始往上能合并就合并,这样一定不劣。于是考虑将序列划分为若干个值相等的段,形如\((num_{x},x)\),对于一个区间的段,如果有一段比两边相邻的段的数都要小,此时这个段的长度显然不会增加,所以可以直接合并,推平成两边小的......