Created
March 10, 2013 23:44
-
-
Save hilukasz/5131038 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #define KNOCK_BANG 1 | |
| #include <TinyDebugKnockBang.h> | |
| #ifdef KNOCK_BANG | |
| #define Serial Debug | |
| #endif | |
| #include <CapacitiveSensor.h> | |
| // do a fade up every "x" amount of LED cycles... | |
| // make sure it's not multiple of 3 else it will be same LED everytime | |
| const byte fadeUpEvery = 2, | |
| fadeInSpeed = 5, | |
| sampleAmount = 5, | |
| capacitiveSensorOutput = 2, | |
| capacitiveSensorInput = 3; | |
| CapacitiveSensor cs_2_3 = CapacitiveSensor(capacitiveSensorOutput,capacitiveSensorInput); // pins 2 & 3, pin 2 is sensor pin | |
| long runningAverage[sampleAmount]; | |
| boolean toggleLED, | |
| isOn; | |
| int highLow, | |
| delayTime, | |
| numberTimes, | |
| counter, | |
| ledNumCount; | |
| unsigned long makeLightningTimer; | |
| // LEDs on pins: 0, 1, 4 | |
| int led[] = { 0, 1, 4 }; | |
| //int led[] = { 2, 3, 4 }; | |
| const int delayMin = 4000, | |
| delayMax = 9000; | |
| void setup(){ | |
| Serial.begin(9600); | |
| //cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example | |
| pinMode(capacitiveSensorOutput, OUTPUT); | |
| digitalWrite(capacitiveSensorOutput, HIGH); | |
| pinMode(capacitiveSensorInput, INPUT); | |
| digitalWrite(led[0], LOW); | |
| digitalWrite(led[1], LOW); | |
| digitalWrite(led[2], LOW); | |
| isOn = false; | |
| toggleLED = false; | |
| highLow = LOW; | |
| counter = 0; | |
| makeLightningTimer = millis(); | |
| ledNumCount = 0; | |
| for(int i = 0; i < 3; i++){ | |
| pinMode(led[i],OUTPUT); | |
| } | |
| } | |
| void loop(){ | |
| if(isOn == true){ | |
| Serial.println("is on passed"); | |
| flicker(led[ledNumCount], 2, 700); | |
| makeLightning(); | |
| } | |
| checkIfisOn(); | |
| } | |
| //////////////// | |
| // Check if hand is present | |
| //-------------- | |
| int lastReading; | |
| void checkIfisOn(){ | |
| const int threshold = 18; | |
| int currentReading = getAverage(); | |
| if((currentReading-lastReading) > threshold){ | |
| isOn = !isOn; | |
| AllLEDsOnOff(1); | |
| if(isOn == true){ | |
| fadeAllLedsIn(); | |
| cycleLEDs(5); | |
| AllLEDsOnOff(2); | |
| } else { AllLEDsOnOff(3); fadeAllLedsOut(); } | |
| } | |
| lastReading = currentReading; | |
| } | |
| //////////////// | |
| // get average reading out of X samples | |
| //-------------- | |
| int getAverage() { | |
| int tempAverage = 0; | |
| int capacitiveAverage = 0; | |
| for(int i = 0; i < sampleAmount; i++){ | |
| runningAverage[i] = cs_2_3.capacitiveSensor(10); | |
| } | |
| // add all the samples up | |
| for(int i = 0; i < sampleAmount; i++){ | |
| tempAverage = runningAverage[i] + tempAverage; | |
| } | |
| // divide by number of samples to get average | |
| capacitiveAverage = tempAverage/sampleAmount; | |
| return capacitiveAverage; | |
| } | |
| //////////////// | |
| // LED functions | |
| //-------------- | |
| void fadeAllLedsIn() { | |
| for(int i = 0; i < 3; i++){ | |
| for(int j = 0; j < 255; j++){ | |
| analogWrite(led[i],j); | |
| delay(fadeInSpeed); | |
| } | |
| } | |
| } | |
| void fadeAllLedsOut() { | |
| for(int j = 255; j > 0; j--){ | |
| for(int i = 0; i < 3; i++){ | |
| analogWrite(led[i],j); | |
| delay(fadeInSpeed); | |
| } | |
| } | |
| digitalWrite(led[0], LOW); digitalWrite(led[1], LOW); digitalWrite(led[2], LOW); | |
| } | |
| void AllLEDsOnOff(int numTimes) { | |
| int isHighLow = HIGH; | |
| numTimes = (numTimes)*2; | |
| for(int i = 0; i < numTimes; i++){ | |
| for(int j = 0; j < 3; j++){ | |
| digitalWrite(led[j], isHighLow); | |
| } | |
| delay(600); | |
| isHighLow = (isHighLow == LOW)? HIGH : LOW; | |
| } | |
| } | |
| void cycleLEDs(int numTimesToCycle){ | |
| const int setupLedSpeed = 80; | |
| int isHighLow = LOW; | |
| for(int i = 0; i < numTimesToCycle*2; i++){ | |
| for(int j = 0; j < 3; j++){ | |
| digitalWrite(led[j], isHighLow); | |
| delay(setupLedSpeed); | |
| isHighLow = (isHighLow == HIGH)? LOW : HIGH; | |
| } | |
| } | |
| } | |
| void fade(int pinNumber){ | |
| //fade in | |
| for(int j = 0; j < 255; j++){ | |
| analogWrite(pinNumber,j); | |
| delay(fadeInSpeed); | |
| } | |
| flicker(pinNumber, 3, 50); | |
| //fade out | |
| for(int j = 255; j > 0; j--){ | |
| analogWrite(pinNumber,j); | |
| delay((fadeInSpeed/4)); | |
| } | |
| digitalWrite(pinNumber, LOW); // just in case pin doesn't go all the way low | |
| } | |
| int delayInterval; | |
| int timeDiff; | |
| void makeLightning(){ | |
| delayInterval = random(delayMin,delayMax); | |
| timeDiff = millis() - makeLightningTimer; | |
| if( timeDiff >= delayInterval){ | |
| int numberTimes = random(1, 4); | |
| int delayTime = random(30, 100); | |
| // normal flicker | |
| if(counter != fadeUpEvery){ | |
| flicker(led[ledNumCount], numberTimes, delayTime); | |
| } | |
| // every "x" do a fade in flicker | |
| if(counter == fadeUpEvery){ | |
| counter = 0; | |
| fade(led[ledNumCount]); | |
| } | |
| if(ledNumCount >= 3) { | |
| ledNumCount = 0; | |
| } | |
| ledNumCount++; | |
| makeLightningTimer = 0; | |
| } | |
| makeLightningTimer = millis(); | |
| counter++; | |
| } | |
| void flicker(int ledPin, int numberOfFlickers, int betweenDelayTime){ | |
| for(int i = 0; i < numberOfFlickers; i++){ | |
| digitalWrite(ledPin, LOW); | |
| delay(betweenDelayTime); | |
| digitalWrite(ledPin,HIGH); | |
| delay(betweenDelayTime); | |
| digitalWrite(ledPin, LOW); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment