|
本帖最后由 zxcvyangliming 于 2020-1-28 11:44 编辑
用库实现用一根线判断电容当开关有点蛋疼,昨天爬墙逛外国论坛,偶然发现一个自定义函数,用来做控制特别实用,贴在这里让大家看一下
主函数是 readCapacitivePin(pin number),这是读一个十进制数,范围在0-16,而这个数的大小和用的线长和有无触控有关,在人触摸线的时候这个数会增大7-10,可以用if来很容易的判断有没有在触摸,或者使用Serial.println(readCapacitivePin(pin number), DEC)加个延迟来进行串口调试,如果你想使用这个函数,那么在程序最后一个}后面加如下代码即可使用readCapacitivePin(pin number)
[mw_shl_code=bash,true]uint8_t readCapacitivePin(int pinToMeasure) {
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
byte bitmask;
port = portOutputRegister(digitalPinToPort(pinToMeasure));
ddr = portModeRegister(digitalPinToPort(pinToMeasure));
bitmask = digitalPinToBitMask(pinToMeasure);
pin = portInputRegister(digitalPinToPort(pinToMeasure));
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
*ddr &= ~(bitmask);
*port |= bitmask;
uint8_t cycles = 17;
if (*pin & bitmask) { cycles = 0;}
else if (*pin & bitmask) { cycles = 1;}
else if (*pin & bitmask) { cycles = 2;}
else if (*pin & bitmask) { cycles = 3;}
else if (*pin & bitmask) { cycles = 4;}
else if (*pin & bitmask) { cycles = 5;}
else if (*pin & bitmask) { cycles = 6;}
else if (*pin & bitmask) { cycles = 7;}
else if (*pin & bitmask) { cycles = 8;}
else if (*pin & bitmask) { cycles = 9;}
else if (*pin & bitmask) { cycles = 10;}
else if (*pin & bitmask) { cycles = 11;}
else if (*pin & bitmask) { cycles = 12;}
else if (*pin & bitmask) { cycles = 13;}
else if (*pin & bitmask) { cycles = 14;}
else if (*pin & bitmask) { cycles = 15;}
else if (*pin & bitmask) { cycles = 16;}
*port &= ~(bitmask);
*ddr |= bitmask;
return cycles;
}[/mw_shl_code]
这是我的试验品,一个摸一下开,再摸一下关闭的LED
程序
[mw_shl_code=bash,true]int ledPin = 4;
int capval;
int x=0;
void setup()
{
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin,LOW);
}
void loop ()
{
capval = readCapacitivePin(2);
if (capval > 3) {
delay(1000);
if(capval>3)
{x=1-x;
digitalWrite(ledPin,x);
}
}
}
uint8_t readCapacitivePin(int pinToMeasure) {
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
byte bitmask;
port = portOutputRegister(digitalPinToPort(pinToMeasure));
ddr = portModeRegister(digitalPinToPort(pinToMeasure));
bitmask = digitalPinToBitMask(pinToMeasure);
pin = portInputRegister(digitalPinToPort(pinToMeasure));
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
*ddr &= ~(bitmask);
*port |= bitmask;
uint8_t cycles = 17;
if (*pin & bitmask) { cycles = 0;}
else if (*pin & bitmask) { cycles = 1;}
else if (*pin & bitmask) { cycles = 2;}
else if (*pin & bitmask) { cycles = 3;}
else if (*pin & bitmask) { cycles = 4;}
else if (*pin & bitmask) { cycles = 5;}
else if (*pin & bitmask) { cycles = 6;}
else if (*pin & bitmask) { cycles = 7;}
else if (*pin & bitmask) { cycles = 8;}
else if (*pin & bitmask) { cycles = 9;}
else if (*pin & bitmask) { cycles = 10;}
else if (*pin & bitmask) { cycles = 11;}
else if (*pin & bitmask) { cycles = 12;}
else if (*pin & bitmask) { cycles = 13;}
else if (*pin & bitmask) { cycles = 14;}
else if (*pin & bitmask) { cycles = 15;}
else if (*pin & bitmask) { cycles = 16;}
*port &= ~(bitmask);
*ddr |= bitmask;
return cycles;
}[/mw_shl_code]
接线图
file:///C:\Users\Administrator\Documents\Tencent Files\1304634942\Image\C2C\MVTK9P2~148Y5O$FB}J554W.png
说一下这个函数的注意事项,
1.readCapacitivePin()的最快刷新速度大概是10ms,在导线被触摸后,20ms数字就会变大并稳定,但手离开后,这个数字需要400ms甚至更长的时间变小直到稳定,在这个过程中数字甚至可能突然变大,因此,如果采用去抖设计,delay的时间不应小于600ms,实测500ms时工作不稳定,判断失常,你可以用串口输出加10ms延迟来看触摸时及触摸后数字随时间的变化
2.对于同一根导线,这个函数在导线工作在UNO的5,6脚时,读到的数字在没有触摸时比其他脚更大,触摸时比其他脚要小,且抖动剧烈,不建议用此函数在UNO5,6脚上玩触控
3.实测发现,3个if,间隔200ms去抖动效果不错,又不会使触控反应太慢。
|
|