Arduino触摸传感简化代码:

//引脚触摸传感器 控制LED亮度 2020 dusty electronix
//https://www.bilibili.com/video/BV1of4y127ow
int capval2,capval3;//设定2、3引脚电容值变量
int led9,led11;
void setup()
{
Serial.begin(9600);//与电脑串口通讯
}
void loop ()
{
capval2 = readCapacitivePin(2); //读取2引脚电容数值
capval3 = readCapacitivePin(3); //读取3引脚电容数值
Serial.print("pin2:");
Serial.println(capval2);//显示2引脚电容数值
led9 = map(capval2,2,17,0,255);//转换2引脚电容数值为led9亮度值
analogWrite(9, led9);//写入led9亮度
Serial.print("pin3:");
Serial.println(capval3);//显示3引脚电容数值
led11 = map(capval3,2,17,0,255);//转换3引脚电容数值为led11亮度值
analogWrite(11, led11);//写入led11亮度
delay(100);//悠着点
}
//原始代码
uint8_t readCapacitivePin(int pinToMeasure) {
// Variables used to translate from Arduino to AVR pin naming
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
// Here we translate the input pin number from
// Arduino pin number to the AVR PORT, PIN, DDR,
// and which bit of those registers we care about.
byte bitmask;
port = portOutputRegister(digitalPinToPort(pinToMeasure));
ddr = portModeRegister(digitalPinToPort(pinToMeasure));
bitmask = digitalPinToBitMask(pinToMeasure);
pin = portInputRegister(digitalPinToPort(pinToMeasure));
// Discharge the pin first by setting it low and output
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
// Make the pin an input with the internal pull-up on
*ddr &= ~(bitmask);
*port |= bitmask;
// Now see how long the pin to get pulled up. This manual unrolling of the loop
// decreases the number of hardware cycles between each read of the pin,
// thus increasing sensitivity.
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;
// Discharge the pin again by setting it low and output
// It's important to leave the pins low if you want to
// be able to touch more than 1 sensor at a time - if
// the sensor is left pulled high, when you touch
// two sensors, your body will transfer the charge between
// sensors.
*port &= ~(bitmask);
*ddr |= bitmask;
return cycles;
}
//原始代码完