mirror of
https://github.com/thearn/Python-Arduino-Command-API.git
synced 2026-04-24 03:00:20 -04:00
added capacitivePin-feature
This commit is contained in:
@@ -28,6 +28,71 @@ void Version(){
|
||||
Serial.println("version");
|
||||
}
|
||||
|
||||
uint8_t readCapacitivePin(String data) {
|
||||
int pinToMeasure = Str2int(data);
|
||||
// readCapacitivePin
|
||||
// Input: Arduino pin number
|
||||
// Output: A number, from 0 to 17 expressing
|
||||
// how much capacitance is on the pin
|
||||
// When you touch the pin, or whatever you have
|
||||
// attached to it, the number will get higher
|
||||
// http://playground.arduino.cc/Code/CapacitiveSensor
|
||||
//
|
||||
// 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;
|
||||
Serial.println(cycles);
|
||||
}
|
||||
|
||||
void Tone(String data){
|
||||
int idx = data.indexOf('%');
|
||||
int len = Str2int(data.substring(0,idx));
|
||||
@@ -274,9 +339,11 @@ void SerialParser(void) {
|
||||
else if (cmd == "nto") {
|
||||
ToneNo(data);
|
||||
}
|
||||
else if (cmd == "cap") {
|
||||
readCapacitivePin(data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
while (!Serial) {
|
||||
|
||||
Reference in New Issue
Block a user