Skip to content

Instantly share code, notes, and snippets.

@hilukasz
Created March 10, 2013 23:44
Show Gist options
  • Select an option

  • Save hilukasz/5131038 to your computer and use it in GitHub Desktop.

Select an option

Save hilukasz/5131038 to your computer and use it in GitHub Desktop.
#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