Hello,
I am trying to program a mega arduino to start a light / motor "show" when a hardware debounced button is pressed. If the button is pressed during the show, Id like it to stop the show.
I have been adding to LarryD's 3 things at a time code and I was hoping that a buttonpress would change a local variable to high and enable ticktock(). If it were pressed again, or if the showLength time finished, all would be reset. Unfortunately its not turning out that way after I upload. Can you offer any suggestions? Thanks in advance
// http://forum.arduino.cc/index.php?PHPSESSID=q51bliab35m68fmgp1449i55n5&topic=253320.0
// LarryD 3 things at a time
// currently using RC circuit and Schmitt inverter hardware debounced switch
// http://www.jeremyblum.com/2011/03/07/arduino-tutorial-10-interrupts-and-hardware-debouncing/
const unsigned long TaskAtime = 500UL; //Runs TaskA every .5 second
const unsigned long TaskBtime = 1000UL; //Runs TaskB every 1 seconds
const unsigned long TaskCtime = 2000UL; //Runs TaskC every 2 seconds
const unsigned long TaskDtime = 1*60*1000UL; //Runs TaskD every 1 minutes
const unsigned long showLength = 2*60*1000UL; //time up when 2 min finished
unsigned long TimeA; //Times up, Task A time
unsigned long TimeB; //Times up, Task B time
unsigned long TimeC; //Times up, Task C time
unsigned long TimeD; //Times up, Task D time
unsigned long lastPressTime = 0; // the last time the output pin was toggled
#define buttonPin 2
#define ledPin 13
#define RELAY1 41
#define RELAY2 42
#define RELAY3 43
#define RELAY4 44
// boolean ShowStarted = LOW; error that showStated was not declared in void loop scope
boolean ledState = HIGH; // the current state of the output pin
boolean buttonState; // the current reading from the input pin
boolean lastButtonState = LOW; // the previous reading from the input pin
// etc.
unsigned long microsNow;
//==========================================================
void setup()
{
microsNow = micros(); //Initailize
TimeA = millis(); //Initailize
TimeB = TimeA; //Initialize
TimeC = TimeA; //Initialize
TimeD = TimeA; //Initialize
pinMode(RELAY1, OUTPUT);
digitalWrite(RELAY1,HIGH); // Turns Relay Off
pinMode(RELAY2, OUTPUT);
digitalWrite(RELAY2,HIGH); // Turns Relay Off
pinMode(RELAY3, OUTPUT);
digitalWrite(RELAY3,HIGH); // Turns Relay Off
pinMode(RELAY4, OUTPUT);
digitalWrite(RELAY4,HIGH); // Turns Relay Off
pinMode(buttonPin, INPUT); // Set the button pin as input
pinMode(ledPin, OUTPUT); // Set the status led pin as output
digitalWrite(ledPin,LOW); // would this Turns Status LED Off?
} // >>>>>>>>>>>>>> END OF setup() <<<<<<<<<<<<<<<<<
void loop()
{
//==================
boolean showStarted;
int reading = digitalRead(buttonPin); // load hardware debounced button into local variable
if (reading != lastButtonState) {
lastPressTime = millis(); // update timer with every button press (is release a problem?)
// if show hasnt started and button is pressed start show
if(reading == LOW && showStarted == LOW && (millis() - lastPressTime) > 2000){
showStarted = HIGH;
digitalWrite(ledPin, showStarted); // turn on status LED
}
// if show has started and button is pressed stop show - reset
if(reading == LOW && (millis() - lastPressTime) < showLength){
showStarted = LOW;
digitalWrite(ledPin, showStarted); // Turn off status LED
digitalWrite(RELAY1,HIGH); // Turns Relay Off
digitalWrite(RELAY2,HIGH); // Turns Relay Off
digitalWrite(RELAY3,HIGH); // Turns Relay Off
digitalWrite(RELAY4,HIGH); // Turns Relay Off
}
if((millis() - lastPressTime) > showLength){
showStarted = LOW;
digitalWrite(ledPin, showStarted); // Turn off status LED
digitalWrite(RELAY1,HIGH); // Turns Relay Off
digitalWrite(RELAY2,HIGH); // Turns Relay Off
digitalWrite(RELAY3,HIGH); // Turns Relay Off
digitalWrite(RELAY4,HIGH); // Turns Relay Off
}
lastButtonState = reading;
}
//==================
//Run time sensitive show tasks if showStarted variable is true
//Do this every 1000us (i.e. 1ms)
if (showStarted == LOW && micros() - microsNow >= 1000UL)
{
microsNow = micros(); //Re-initialize for next iteration
TickTock(); //It is time to check
}
//==================
} // >>>>>>>>>>>>>> END OF loop() <<<<<<<<<<<<<<<<<
//==========================================================
// FUNCTIONS
//==========================================================
//Check to see if time sensitve Tasks should run
void TickTock()
{
//1ms has gone by, check if there is a Task to run
unsigned long millisNow = millis();
//==================
if (millisNow - TimeA >= TaskAtime) //Is it time to run Task A?
{
TimeA = millis(); //Re-initialize
TaskA();
}
//==================
if (millisNow - TimeB >= TaskBtime) //Is it time to run Task B?
{
TimeB = millis(); //Re-initialize
TaskB();
}
//==================
if (millisNow - TimeC >= TaskCtime) //Is it time to run Task C?
{
TimeC = millis(); //Re-initialize
TaskC();
}
//==================
if (millisNow - TimeD >= TaskDtime) //Is it time to run Task D?
{
TimeD = millis(); //Re-initialize
TaskD();
}
//Other time task checking goes here as needed
}
//===Every 0.5 sec ===============
void TaskA()
{
digitalWrite(41,!digitalRead(41)); //Toggle pin 41
}
//====Every 1 sec ==============
void TaskB()
{
digitalWrite(42,!digitalRead(42)); //Toggle pin 42
//Other stuff
}
//=====Every 2 sec =============
void TaskC()
{
digitalWrite(43,!digitalRead(43)); //Toggle pin 43
//Other stuff
}
//=====Every 1 min =============
void TaskD()
{
digitalWrite(44,!digitalRead(44)); //Toggle pin 44
//Other stuff
}
//======================================================================
// END OF CODE
//======================================================================