Pages: [1]   Go Down
Author Topic: Led night light with timer and manual override  (Read 565 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* blink_without_delay_with_switch3.ino (2.2 KB - downloaded 3 times.)
* blink_without_delay_with_switch3.ino (2.2 KB - downloaded 2 times.)
Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 547
Posts: 45978
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

California
Offline Offline
Faraday Member
**
Karma: 82
Posts: 3123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: November 16, 2012, 07:23:03 pm by Arrch » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

New Jersey
Offline Offline
Faraday Member
**
Karma: 48
Posts: 3392
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

California
Offline Offline
Faraday Member
**
Karma: 82
Posts: 3123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
Look at just about any other thread in these forums.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
Arrch finally got it

Regards

Dale
Logged

Pages: [1]   Go Up
Jump to: