Hi! i founded and slightly modified code which i founded somewhere on internet. Idea is this: i need one button timer, with 4 modes. Each mode have different time untill sound alarm. Every time i select new mode, counter automatically start to count, unless its interrupted by selecting other mode.
I succeded to write and modify most of the code, problem is, when i select for example mode 3, counter start to count untill 15 seconds, and it not start alarm. When i try to interrupt it, its not interrupting at all. Looping is just alarm function, i need alarm LED to blink.
Delay is timer
Why its behaving weird? What im doing wrong?
/*
Using a single switch to select between 3 modes
*/
// Schematic: http://www.pwillard.com/files/mode4.jpg
//===============================================================
// Global Variables & Constants
//===============================================================
const int led1 = 2; // LED1 ANODE
const int led2 = 3;
const int led3 = 4; // LED2 ANODE
const int led4 = 5; // LED3 ANODE
const int alarm = 6;
const int sw1 = 7; // Active HIGH, held low by 4.7K
int mode = 0; // Selector State (Initial state = ALL OFF)
int val = 0; // Pin 13 HIGH/LOW Status
int butState = 0; // Last Button State
int modeState = 0; // Last Mode State
boolean debug = 1; // 1 = Print Serial Enabled / 0 = disabled
//===============================================================
// SETUP
//===============================================================
void setup () {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(alarm, OUTPUT);
pinMode(sw1, INPUT);
if (debug){
Serial.begin(9600);
Serial.print("Initial Mode: ");
Serial.println(mode);
Serial.print("Setup Complete\n");
}
}
//===============================================================
// Main Loop
//===============================================================
void loop() {
val = digitalRead(sw1);
// If we see a change in button state, increment mode value
if (val != butState && val == HIGH){
mode++;
}
butState = val; // Keep track of most recent button state
// No need to keep setting pins *every* loop
if (modeState != mode){
// If no keys have been pressed yet don't execute
// the switch code below
// if (mode != 0) {
switch ( mode ) {
//case 1 is actually handled below as default
case 2: //second led, it should sound alarm after 10 seconds unless user interrupt
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH); //hold second led high
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
delay (10000); //wait for 10 seconds before sound alarm
loop();
{
digitalWrite(alarm, HIGH);
delay (500);
digitalWrite(alarm, LOW);
delay (500);
}
showState();
break;
case 3:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
delay (15000); //wait for 15 seconds before sound alarm
loop();
{
digitalWrite(alarm, HIGH);
delay (500);
digitalWrite(alarm, LOW);
delay (500);
}
showState();
break;
case 4:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
delay (20000); //wait for 20 seconds before start alarm
loop();
{
digitalWrite(alarm, HIGH);
delay (500);
digitalWrite(alarm, LOW);
delay (500);
}
showState();
break;
default:
mode = 1;
// loop back to 1 by default, seems redundant but
// it also handles the "mode is > 3" problem
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
delay (5000);
loop();
{
digitalWrite(alarm, HIGH);
delay (500);
digitalWrite(alarm, LOW);
delay (500);
}
showState();
break;
} // end switch
// } // end of "if mode = 0" check
} // end of ModeState check
modeState = mode; // Keep track of mode recent mode value
delay(20); // slow the loop just a bit for debounce
}
//===============================================================
// Subroutine
//===============================================================
void showState() {
if (debug){
Serial.print("Mode: ");
Serial.println(mode);
}
}