Hello,
I have just bought the arduino uno starter kit and, to be honest, I was hoping to be further along than this before resorting to the forums. However I have spent all afternoon searching this forum and racking my brains and so I think I need some guidance. Below is the original sketch for Tutorial 8 the Digital Hourglass which is a set of 6 LEDs set to light up sequentially until the switch state is changed and they are reset.
// named constant for the switch pin
const int switchPin = 8;
unsigned long previousTime = 0; // store the last time an LED was updated
int switchState = 0; // the current switch state
int prevSwitchState = 0; // the previous switch state
int led = 2; // a variable to refer to the LEDs
// 600000 = 10 minutes in milliseconds
long interval = 600000; // interval at which to light the next LED
void setup() {
// set the LED pins as outputs
for (int x = 2; x < 8; x++) {
pinMode(x, OUTPUT);
}
// set the tilt switch pin as input
pinMode(switchPin, INPUT);
}
void loop() {
// store the time since the Arduino started running in a variable
unsigned long currentTime = millis();
// compare the current time to the previous time an LED turned on
// if it is greater than your interval, run the if statement
if (currentTime - previousTime > interval) {
// save the current time as the last time you changed an LED
previousTime = currentTime;
// Turn the LED on
digitalWrite(led, HIGH);
// increment the led variable
// in 10 minutes the next LED will light up
led++;
if (led == 7) {
// the hour is up
}
}
// read the switch value
switchState = digitalRead(switchPin);
// if the switch has changed
if (switchState != prevSwitchState) {
// turn all the LEDs low
for (int x = 2; x < 8; x++) {
digitalWrite(x, LOW);
}
// reset the LED variable to the first one
led = 2;
//reset the timer
previousTime = currentTime;
}
// set the previous switch state to the current state
prevSwitchState = switchState;
}
The sketch works fine (more or less - it seems to freeze if I make the interval small and leave it alone for a while, but I need to understand the logic before I start de-bugging!). There are a few things that, for some reason, I cannot get my head around:
A) Interval variable - we set this as a long integer variable at the beginning. Later we tell the LEDs to light up and stay on sequentially using:
digitalWrite(led, HIGH);
led++
But how is it reading the interval variable? We could change the name and location of this variable yet it still knows that this is the time period between leds lighting up - how?
C) Current time = Previous time
When running the serial monitor Previous Time is always equal to Current Time regardless of any switch change or time passed. In the comments it says "save the current time as the last time you changed an LED" - but this isn't the case. Furthermore we initially set the Previous Time as 0 so if we want to overwrite the Current Time with Previous Time how is it measuring the time between LED changes?
When you have statement like "xTime = yTime" is it important for the syntax to be the correct order? ie for xTime to overwrite yTime and vice versa.
I really don't understand what's at play here and I know it's fairly elementary so sorry if I am being thick! It would be so helpful if someone could explain it simply.
Many thanks