0

嗨,我找到了使用石墨和纸的触摸界面的 Arduino 代码,但此代码在 Spark Core 中不起作用,Arduino 代码如下

// Pin for the LED
int LEDPin = 7;
// Pin to connect to your drawing
int capSensePin = 0;
// This is how high the sensor needs to read in order
//  to trigger a touch.  You'll find this number
//  by trial and error, or you could take readings at 
//  the start of the program to dynamically calculate this.
int touchedCutoff = 60;

void setup(){
  Serial.begin(9600);
  // Set up the LED
  pinMode(LEDPin, OUTPUT);
  digitalWrite(LEDPin, LOW);
}

void loop(){
  // If the capacitive sensor reads above a certain threshold,
  //  turn on the LED
  if (readCapacitivePin(capSensePin) > touchedCutoff) {
    digitalWrite(LEDPin, HIGH);
  }
  else {
    digitalWrite(LEDPin, LOW);
  }

  // Every 500 ms, print the value of the capacitive sensor
  if ( (millis() % 500) == 0){
    Serial.print("Capacitive Sensor on Pin 2 reads: ");
    Serial.println(readCapacitivePin(capSensePin));
  }
}

// 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
//  In order for this to work now,
// The pin should have a 1+Megaohm resistor pulling
//  it up to +5v.
uint8_t readCapacitivePin(int pinToMeasure){
  // This is how you declare a variable which
  //  will hold the PORT, PIN, and DDR registers
  //  on an AVR
  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;
  if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){
    port = &PORTD;
    ddr = &DDRD;
    bitmask = 1 << pinToMeasure;
    pin = &PIND;
  }
  if ((pinToMeasure > 7) && (pinToMeasure <= 13)){
    port = &PORTB;
    ddr = &DDRB;
    bitmask = 1 << (pinToMeasure - 8);
    pin = &PINB;
  }
  if ((pinToMeasure > 13) && (pinToMeasure <= 19)){
    port = &PORTC;
    ddr = &DDRC;
    bitmask = 1 << (pinToMeasure - 13);
    pin = &PINC;
  }
  // Discharge the pin first by setting it low and output
  *port &= ~(bitmask);
  *ddr  |= bitmask;
  delay(1);
  // Make the pin an input WITHOUT the internal pull-up on
  *ddr &= ~(bitmask);
  // Now see how long the pin to get pulled up
  int cycles = 16000;
  for(int i = 0; i < cycles; i++){
    if (*pin & bitmask){
      cycles = i;
      break;
    }
  }
  // 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;
}

Spark核心抛出以下错误

在 ../inc/spark_wiring.h:29:0 包含的文件中,

from ../inc/application.h:29,
from new_lwed.cpp:3:
../../core-common-lib/SPARK_Firmware_Driver/inc/config.h:12:2: warning: #warning "Defaulting to Release Build" [-Wcpp]
#warning "Defaulting to Release Build"
^
new_lwed.cpp: In function 'uint8_t readCapacitivePin(int)':
new_lwed.cpp:57:13: error: 'PORTD' was not declared in this scope
volatile uint8_t* pin; 
^
new_lwed.cpp:58:12: error: 'DDRD' was not declared in this scope
// Here we translate the input pin number from 
^
new_lwed.cpp:60:12: error: 'PIND' was not declared in this scope
// and which bit of those registers we care about. 
^
new_lwed.cpp:63:13: error: 'PORTB' was not declared in this scope
port = &PORTD; 
^
new_lwed.cpp:64:12: error: 'DDRB' was not declared in this scope
ddr = &DDRD; 
^
new_lwed.cpp:66:12: error: 'PINB' was not declared in this scope
pin = &PIND; 
^
new_lwed.cpp:69:13: error: 'PORTC' was not declared in this scope
port = &PORTB; 
^
new_lwed.cpp:70:12: error: 'DDRC' was not declared in this scope
ddr = &DDRB; 
^
new_lwed.cpp:72:12: error: 'PINC' was not declared in this scope
pin = &PINB; 
^
make: *** [new_lwed.o] Error 1
4

1 回答 1

1

Spark Core 使用与 Arduino 不同的 CPU,因此类似PORTCDDRC不可用的常量。电容库已移植:https ://community.spark.io/t/include-capacitivesensor-library/2965/30 ,因此您可以包含CapTouch库并使用示例。

于 2015-03-31T12:56:13.873 回答