const int buttonPin1 = 18; // button connected to digital pin 18
const int buttonPin2 = 19; // button connected to digital pin 19
const int ledPins[] = {3,4,5,6,7,8,9}; // LEDs connected to digital pins 6 to 12
int pattern = 0; // variable to store LED pattern
int frequency = 100; // variable to store LED blinking frequency (in milliseconds)
int pot;
int num;
long holdingTime;
long previousHoldingTime;
unsigned long firstButtonPressTime;
byte buttonState;
byte previousButtonState = HIGH;
bool AdcFlag = false;
void checkButton1(){
buttonState = digitalRead(buttonPin1);
if (buttonState == LOW && previousButtonState == HIGH)
{
firstButtonPressTime = millis();
}
holdingTime = (millis() - firstButtonPressTime);
if (holdingTime > 50)
{
if (buttonState == HIGH && previousButtonState == LOW)
{
pattern = (pattern + 1) % 5; // change pattern
frequency = 100; //reset frequency on pattern change
}
}
previousButtonState = buttonState;
}
void checkButton2(){
buttonState = digitalRead(buttonPin2);
if (buttonState == LOW && previousButtonState == HIGH && (millis() - firstButtonPressTime) > 200)
{
firstButtonPressTime = millis();
}
holdingTime = (millis() - firstButtonPressTime);
if (holdingTime > 100)
{
if (buttonState == HIGH && previousButtonState == LOW)
{
if (holdingTime <= 1000)
{
Serial.println("short button press");
Serial.println(frequency += 200);
}
if (holdingTime > 1000)
{
if(AdcFlag == true){
Serial.println("long button press");
AdcFlag = false; //long press to get out of ADC mode back to the patterns
}else{
Serial.println("long button press");
AdcFlag = true; //long press makes flag true so that void loop can enter adc isr
}
}
}
}
previousButtonState = buttonState;
previousHoldingTime = holdingTime;
}
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(buttonPin1), checkButton1, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonPin2), checkButton2, FALLING);
}
void loop() {
if (AdcFlag == true){
longPress();
}else if (AdcFlag == false){
switch (pattern) {
case 0: // pattern 1
Serial.println("Patt 1");
for (int i = 0; i < 7; i++) {
digitalWrite(ledPins[i], HIGH);
delay(frequency);
digitalWrite(ledPins[i], LOW);
delay(frequency);
}
break;
case 1: // pattern 2
Serial.println("Patt 2");
for (int i = 6; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(frequency);
digitalWrite(ledPins[i], LOW);
delay(frequency);
}
break;
case 2: // pattern 3
Serial.println("Patt 3");
for (int i = 0; i < 7; i++) {
digitalWrite(ledPins[i], HIGH);
digitalWrite(ledPins[i+1], HIGH);
delay(frequency);
digitalWrite(ledPins[i], LOW);
digitalWrite(ledPins[i+1], LOW);
delay(frequency);
}
break;
case 3: // pattern 4
Serial.println("Patt 4");
for (int i = 6; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
digitalWrite(ledPins[i-2], HIGH);
delay(frequency);
digitalWrite(ledPins[i], LOW);
digitalWrite(ledPins[i-2], LOW);
delay(frequency);
}
break;
case 4: // pattern 5
Serial.println("Patt 5");
pot = analogRead(A0);
num = map(pot, 0, 1023, 0, 255);
for(int i=3; i<10; i++){
analogWrite(i, num);
}
break;
}
}
}
void longPress(){
pot = analogRead(A0);
num = map(pot, 0, 1023, 0, 7);
switch(num){
case 0: //all OFF
for (int i = 0; i < 6; i++) {
digitalWrite(ledPins[i], LOW);
}
break;
case 1: //led 1
digitalWrite(ledPins[0], HIGH);
off();
break;
case 2: //led <2
for (int i = 0; i < 2; i++) {
digitalWrite(ledPins[i], HIGH);
}
off();
break;
case 3: //led <3
for (int i = 0; i < 3; i++) {
digitalWrite(ledPins[i], HIGH);
}
off();
break;
case 4: //led <4
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], HIGH);
}
off();
break;
case 5: //led <5
for (int i = 0; i < 5; i++) {
digitalWrite(ledPins[i], HIGH);
}
off();
break;
case 6: //led <6
for (int i = 0; i < 6; i++) {
digitalWrite(ledPins[i], HIGH);
}
off();
break;
case 7: //all ON
for (int i = 0; i < 7; i++) {
digitalWrite(ledPins[i], HIGH);
}
off();
break;
}
}
void off(){//TURN OFF LEDs BETWEEN CASES
digitalWrite(ledPins[0], LOW);
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
digitalWrite(ledPins[3], LOW);
digitalWrite(ledPins[4], LOW);
digitalWrite(ledPins[5], LOW);
digitalWrite(ledPins[6], LOW);
}