// original code 4-16-2010 revised for Arduino IDE 2-23-2012 // tested on Atmega 168,328, 8MHz internal RC clock // // Wire Digital Pin 2 (IC pin 4) through 10K resistor to one leg of 1 Meg pot // (10K protects against shorts). Wire wiper of pot to Digital Pin 4 (IC pin 6) // and to 6" x 6" sensor plate made of copper or aluminum foil - pie tin works great. // // Note: we are making an RC timer with the metal plate (sensor) as one plate of a capacitor // which is charged through the combined resistance of 10K + 1 Meg pot. // We simply time how long it takes to charge the plate to 5V. This will vary depending // on whether a person is touching it. A person is roughly a 100pF capacitor. Since touching // the plate adds capcitance, it will take longer to charge than if no one is touching it. // // Wire LED through 330 ohm series resistor to Digital Pin 7 (IC pin 13). // #include <ms_arduino.h> // points to software libraries to use #include "lcd.h" // variables for pins int capchargePin = 2; int capreadPin = 4; int ledPin = 7; int sampleValue; // variable to count a few samples int i; // index for counter void setup() { pinMode(capchargePin, OUTPUT); // initialize pin for charge signal out pinMode(capreadPin, INPUT); // initialize pin for reading charge on plate digitalWrite(capreadPin, LOW); // turn off pull-up resistor, we want it to float) pinMode(ledPin, OUTPUT); // initialize pin as an output (for LED) Serial.begin(9600); // initialize serial port at 9600 bps: lcd_init(); // initialize LCD screen } void loop() { lcd_clear(); sampleValue = 0; // zero data for(i=0; i<8; i++) { // take eight samples digitalWrite(capchargePin, LOW); // start LOW delay(1); // let it settle digitalWrite(capchargePin, HIGH); // now make it go HIGH delayMicroseconds(5); // 5 us delay - test for capacitance of subject if( digitalRead(capreadPin) ) { // if pin is high, it means no one is touching } else { // someone is touching - takes too long to charge plate sampleValue++; } } if (sampleValue >= 4) { // more than 4 of the 8 samples took too long lcd_instruction(GOTO_LINE1); lcd_text("someone"); // put text on the LCD screen digitalWrite(ledPin, HIGH); // light LED Serial.write(1); // send the number '1' out serial port } else { lcd_instruction(GOTO_LINE1); lcd_text("no one"); // put text on the LCD screen digitalWrite(ledPin, LOW); // LED off Serial.write(2); // send the number '2' out serial port } delay(10); } // end MAIN |