Go Down

Topic: Led night light with timer and manual override (Read 1 time) previous topic - next topic

I very new to this but I'm wanting to switch an led on with a tilt switch and then have it turn off either by a timer or by switching the tilt switch again. I got the tilt switch working and then tried to hack the blink without delay code into my sketch, but I've had no luck so far.
Here is the sketch
/* Blink without Delay

Turns on and off a light emitting diode(LED) connected to a digital  
pin, without using the delay() function.  This means that other code
can run at the same time without being interrupted by the LED code.

The circuit:
* LED attached from pin 13 to ground.
* Note: on most Arduinos, there is already an LED on the board
that's attached to pin 13, so no hardware is needed for this example.


created 2005
by David A. Mellis
modified 8 Feb 2010
by Paul Stoffregen

This example code is in the public domain.


http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

// constants won't change. Used here to
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 10000;           // interval at which to blink (milliseconds)

int switchPin = 8;
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean ledOn = false;

void setup()
{
 pinMode(switchPin, INPUT);
 pinMode(ledPin, OUTPUT);
}

boolean debounce(boolean last)
{
 boolean current = digitalRead(switchPin);
 if (last != current)
 {
   delay(10);
   current = digitalRead(switchPin);
 }
 return current;
}

void loop()
{
 
 currentButton = debounce(lastButton);
 if (lastButton == HIGH && currentButton == LOW)
 {
   ledOn = !ledOn;
 }
 lastButton = currentButton;
 
 digitalWrite(ledPin, ledOn);


 // here is where you'd put code that needs to be running all the time.

 // check to see if it's time to blink the LED; that is, if the
 // difference between the current time and last time you blinked
 // the LED is bigger than the interval at which you want to
 // blink the LED.
 unsigned long currentMillis = millis();

 if(currentMillis - previousMillis > interval)
 {
   // save the last time you blinked the LED
   previousMillis = currentMillis;  

 
   

   // set the LED with the ledState of the variable:
   digitalWrite(ledPin, ledState);
 }
}

Any help on this matter would be gratefully recieved

Regards Dale

P.S.

long interval set to 10000 for debuging only i'm up this figure when sketch is working

PaulS

I'm not having any luck determining what that code does that you don't want, or doesn't do that you want. The mindreader will be back next Tuesday. Try again then.

Arrch

#2
Nov 17, 2012, 01:21 am Last Edit: Nov 17, 2012, 01:23 am by Arrch Reason: 1
Your explanation needs a little work, but what I can gather is that you want the LED to turn off after 10 second after being turned on, but all your code is doing right now is turning it off in 10 second intervals, regardless of when it was turned on. You need to keep track of when it was turned on, and compare that to the current time.

Also, when you post code, post it using the CODE tags which you should have read when you were reading the Read this before posting a Programming Question thread at the top of this forum.

Hi, Thanks for the replies, sorry for the poor explanation. What I'm trying to do is:

1 switch an led on with tilt switch

2 switch the led off with a timer or the tilt switch which ever comes first.

At the moment I have just the led coming on and off with the tilt switch using this code.

/Code

int switchPin = 8;
int ledPin = d2;
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean ledOn = false;

void setup()
{
 pinMode(switchPin, INPUT);
 pinMode(ledPin, OUTPUT);
}

boolean debounce(boolean last)
{
 boolean current = digitalRead(switchPin);
 if (last != current)
 {
   delay(5);
   current = digitalRead(switchPin);
 }
 return current;
}

void loop()
{
 currentButton = debounce(lastButton);
 if (lastButton == LOW && currentButton == HIGH)
 {
   ledOn = !ledOn;
 }
 lastButton = currentButton;
 
 digitalWrite(ledPin, ledOn);

/Code

I just can't get my head around how to incorporate the Millis() command to act as a timer. I did find the blink without delay program and tried many times to adjust it to my needs into the above program, This is why I have come to the forum asking for help. Any information would be gratefully recieved.

Regards

Dale

P.S. below is blink without delay sketch

/Code
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
 // set the digital pin as output:
 pinMode(ledPin, OUTPUT);      
}

void loop()
{
 // here is where you'd put code that needs to be running all the time.

 // check to see if it's time to blink the LED; that is, if the
 // difference between the current time and last time you blinked
 // the LED is bigger than the interval at which you want to
 // blink the LED.
 unsigned long currentMillis = millis();

 if(currentMillis - previousMillis > interval) {
   // save the last time you blinked the LED
   previousMillis = currentMillis;  

   // if the LED is off turn it on and vice-versa:
   if (ledState == LOW)
     ledState = HIGH;
   else
     ledState = LOW;

   // set the LED with the ledState of the variable:
   digitalWrite(ledPin, ledState);
 }
}
/Code

wildbill

After you flip the state of the led, check to see if the new state is HIGH. If so, record millis in a variable to tell you when the led was turned on. Later in loop, before you actually do the digitalwrite to the led, use the millis/interval if from blink without delay. If it tells you the interval has elapsed, set ledstate low.

Arrch

If you need help on how to post your code with code tags, then just

Code: [Select]
Look at just about any other thread in these forums.

Thanks wild bill for your reply you have been most helpful.

Code: [Select]

Arrch finally got it


Regards

Dale

Go Up