Go Down

Topic: need help with AttachInterrupt and EEPROM (Read 1 time) previous topic - next topic

nyg78

Aug 11, 2011, 02:02 am Last Edit: Aug 12, 2011, 04:09 am by nyg78 Reason: 1
I need help with AttachInterrupt.  I read this http://arduino.cc/en/Reference/AttachInterrupt but I am lost.   Here's my code:

Code: [Select]

/*
*  bike light with pattern reverse button & pot
*/

int potPin = 0;                 // input pin for the pot
int timer = 50;      // you can adjust the numbers below to set the max and min for the speed adjustment
int x = 10;        // sets the max speed (0 = fast) the lower the number the faster it can go
int y = 300;      // sets the min speed (100 = slow) the higher the number the slower it can go

int switchPin = 2;              // switch is connected to pin 2
volatile int state = CHANGE;
int switchPin2 = 3;             // switch to reverse pattern is connected to pin 13
int led1Pin = 11;
int led2Pin = 10;
int led3Pin = 9;
int led4Pin = 8;
int led5Pin = 7;
int led6Pin = 6;
int led7Pin = 5;
int led8Pin = 4;

int val;                        // variable for reading the pin status
int val2;                       // variable for reading the delayed status
int buttonState;                // variable to hold the button state
int val_rev;                        // variable for reading the pin status
int val2_rev;                       // variable for reading the delayed status
int buttonState_rev;

int lightMode = 0;              // What mode is the light in?

void setup() {
 pinMode(switchPin, INPUT);    // Set the switch pin as input

 pinMode(led1Pin, OUTPUT);
 pinMode(led2Pin, OUTPUT);
 pinMode(led3Pin, OUTPUT);
 pinMode(led4Pin, OUTPUT);
pinMode(led5Pin, OUTPUT);
 pinMode(led6Pin, OUTPUT);
 pinMode(led7Pin, OUTPUT);
 pinMode(led8Pin, OUTPUT);
 
 Serial.begin(9600);           // Set up serial communication at 9600bps
 buttonState = digitalRead(switchPin);   // read the initial state
}

void loop(){
 digitalWrite(switchPin, state);
 val = digitalRead(switchPin);      // read input value and store it in val
 delay(10);                         // 10 milliseconds is a good amount of time
     timer = 0;
for ( int i = 0; i < 10; i++ ) {
   timer += analogRead(0);               // reads the pot and sets the timer to the value
}
   timer = timer / 10;
   timer = map(timer, 0, 1023, x, y);   // maps the timer value to the max and min vaues set above with x and y  

 val2 = digitalRead(switchPin);     // read the input again to check for bounces
 val_rev = digitalRead(switchPin2);      //REVERSE read input value and store it in val
 delay(10);                         // 10 milliseconds is a good amount of time
 val2_rev = digitalRead(switchPin2);     // read the input again to check for bounces
 val_rev = digitalRead(switchPin2);
 if (!val_rev) {                 // make sure we got 2 consistant readings!
buttonState_rev = !buttonState_rev ;                 // save the new state in our variable
 }
 if (val == val2) {                 // make sure we got 2 consistant readings!
   if (val != buttonState) {          // the button state has changed!
     if (val == LOW) {                // check if the button is pressed
       if (lightMode == 0) {          // if its left to right
         lightMode = 1;               // chase left to right then back!
       } else {
         if (lightMode == 1) {        // if its left to right then back
             lightMode = 2;           // all off
           } else {
             if (lightMode == 2) {    // if its all off
               lightMode = 0;
             }
   }
       }
     }
   buttonState = val;                 // save the new state in our variable
 }
 // Now do whatever the lightMode indicates
 if (lightMode == 0)  { // single left to right
   if ( buttonState_rev == LOW ) {
   digitalWrite(led1Pin, HIGH);
   delay(timer);
   digitalWrite(led1Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led8Pin, HIGH);
   delay(timer);
   digitalWrite(led8Pin, LOW);
 }
 else  { //single right to left
   digitalWrite(led8Pin, HIGH);
   delay(timer);
   digitalWrite(led8Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led1Pin, HIGH);
   delay(timer);
   digitalWrite(led1Pin, LOW);
 }
}
if (lightMode == 1)  { // single light left to right then back
   digitalWrite(led1Pin, HIGH);
   delay(timer);
   digitalWrite(led1Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led8Pin, HIGH);
   delay(timer);
   digitalWrite(led8Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led1Pin, HIGH);
 }
 else  {  // reverse
   digitalWrite(led8Pin, HIGH);
   delay(timer);
   digitalWrite(led8Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);  
   digitalWrite(led4Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led1Pin, HIGH);
   delay(timer);
   digitalWrite(led1Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led8Pin, HIGH);
 }
}
if (lightMode == 2) { // all off
   digitalWrite(led1Pin, LOW);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led8Pin, LOW);
 }
}

The problem is, when I push the button to change the pattern (SwitchPin 2), sometimes it won't change unless I turn the pot first.  Please help.  Thank you.

kerthyn

You could use interrupts, but you don't need to. The problem is that when you're doing this:
Code: [Select]

    digitalWrite(led1Pin, HIGH);
    delay(timer);                              // do nothing for (e.g. 0.3 seconds)
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, HIGH);
    delay(timer);                              // do nothing for (e.g.) 0.3 seconds
    digitalWrite(led2Pin, LOW);
    digitalWrite(led3Pin, HIGH);
    delay(timer);                              // do nothing for (e.g.) 0.3 seconds
    digitalWrite(led3Pin, LOW);
    digitalWrite(led4Pin, HIGH);
    delay(timer);                              // do nothing for (e.g.) 0.3 seconds
    // etc.


you're not doing this
Code: [Select]
val_rev = digitalRead(switchPin2)

so you'll miss any button presses that begin and end during that time. Take a look at the example BlinkWithoutDelay.

A couple of other points:

the debounce logic looks funky (I haven't followed it through in detail, but it  seems to be missing actual use of the values gotten from some of the reads;

this
Code: [Select]
        if (lightMode == 0) {          // if its left to right
          lightMode = 1;               // chase left to right then back!
        } else {
          if (lightMode == 1) {        // if its left to right then back
              lightMode = 2;           // all off
            } else {
              if (lightMode == 2) {    // if its all off
                lightMode = 0;
              }
    }
can be replaced by this
Code: [Select]
lightMode = lightMode++ % 3   // 0 = L->R, 1 = L->R->L..., 2 = all off

Nick Gammon


I need help with AttachInterrupt. ...


I don't see AttachInterrupt in your code. Anyway, as kerthyn says, you can probably solve all your problems by removing the delays and just having some sort of state machine that changes state after a certain amount of time elapses. It could also check for button presses.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

Graynomad

#3
Aug 11, 2011, 05:14 am Last Edit: Aug 11, 2011, 05:21 am by Graynomad Reason: 1
Code: [Select]
 digitalWrite(switchPin, state);
 val = digitalRead(switchPin);


You can't do both without swapping the pinMode.

This

Code: [Select]
 val2 = digitalRead(switchPin);     // read the input again to check for bounces
 val_rev = digitalRead(switchPin2);      //REVERSE read input value and store it in val
 delay(10);                         // 10 milliseconds is a good amount of time
 val2_rev = digitalRead(switchPin2);     // read the input again to check for bounces
 val_rev = digitalRead(switchPin2);
 if (!val_rev) {                 // make sure we got 2 consistant readings!
buttonState_rev = !buttonState_rev ;                 // save the new state in our variable
 } if (val == val2) {                 // make sure we got 2 consistant readings!
   if (val != buttonState) {          // the button state has changed!
     if (val == LOW) {                // check if the button is pressed
       if (lightMode == 0) {          // if its left to right
         lightMode = 1;               // chase left to right then back!
       } else {
         if (lightMode == 1) {        // if its left to right then back
             lightMode = 2;           // all off
           } else {
             if (lightMode == 2) {    // if its all off
               lightMode = 0;
             }
   }
       }
     }
   buttonState = val;                 // save the new state in our variable
 }


is so obfuscated it makes my brain hurt.

This

Code: [Select]
if (lightMode == 0)  { // single left to right
   if ( buttonState_rev == LOW ) {
   digitalWrite(led1Pin, HIGH);
   delay(timer);
   digitalWrite(led1Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led8Pin, HIGH);
   delay(timer);
   digitalWrite(led8Pin, LOW);
 }
 else  { //single right to left
   digitalWrite(led8Pin, HIGH);
   delay(timer);
   digitalWrite(led8Pin, LOW);
   digitalWrite(led7Pin, HIGH);
   delay(timer);
   digitalWrite(led7Pin, LOW);
   digitalWrite(led6Pin, HIGH);
   delay(timer);
   digitalWrite(led6Pin, LOW);
   digitalWrite(led5Pin, HIGH);
   delay(timer);
   digitalWrite(led5Pin, LOW);
   digitalWrite(led4Pin, HIGH);
   delay(timer);
   digitalWrite(led4Pin, LOW);
   digitalWrite(led3Pin, HIGH);
   delay(timer);
   digitalWrite(led3Pin, LOW);
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
   digitalWrite(led1Pin, HIGH);
   delay(timer);
   digitalWrite(led1Pin, LOW);
 }
}


can be reduced to about 10 lines of code, something like

Code: [Select]
byte l2r_pins [] = {4,5,6,7,8,9,10,11};
byte r2l_pins [] = {11,10,9,8,7,6,5,4};


byte *ptr;

if (lightmode == l2r) {
  ptr = l2r_pins;
else
  ptr = r2l_pins;

for (int i = 0; i < N_LEDS; i++) {
    digitalWrite (*ptr++, HIGH);
    if (i > 0) digitalWrite (i-1, LOW);
    if (i < N_PINS -1) digitalWrite (i+1, LOW);
    delay (timer);
}


Code: [Select]
10 milliseconds is a good amount of time
For what? Useless comment, remove or explain.

Code: [Select]
int x = 10;        // sets the max speed (0 = fast) the lower the number the faster it can go
int y = 300;      // sets the min speed (100 = slow) the higher the number the slower it can go


These are only used once and are not variable, use "const" or "#define" with meaningful names, eg
Code: [Select]
#define MAX_SPEED 10
#define MIN_SPEED 300



______
Rob
Rob Gray aka the GRAYnomad www.robgray.com

nyg78

Thanks all for your help.  I seemed to have fixed it.  Now, I need help with one other thing.  I want this to remember which pattern was displayed after it is turned off then back on.  Right now, when I start it, it always starts at 0.  If I have it in pattern 1 for example, I want to be able to turn it off then when I turn it back on, have it start at pattern 1.  I know it has something to do with EEPROM.  I read the examples but can't figure out how to add it to my code and get it to actually work.  Please help.  Thank you!

Nick Gammon

Well what have you tried so far? The examples for EEPROM that come with the IDE are pretty simple.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

nyg78

#6
Aug 12, 2011, 03:49 am Last Edit: Aug 12, 2011, 04:10 am by nyg78 Reason: 1
Do I need EEPROM clear, read, or write?  Do I need all of them?  Also in the write example, it uses Analog Input 0 which I already have a pot attached to.  What do I do with this?  I want to store what pattern was last used when the board was turned off then back on again.

Nick Gammon

Did you look at the examples? If so, what do you think you will need?

Look, don't over-complicate it. If they change patterns, save it to (say) address 0 in the EEPROM, like this:

Code: [Select]
EEPROM.write(0, pattern);

Then in setup, next time it boots, you can get the old pattern back:

Code: [Select]
pattern = EEPROM.read(0);

That's it! Try and see.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

nyg78

Thanks Nick, but it still doesn't work.  I must be missing something.  Here's what I did.

I added this at the beginning:

Code: [Select]

#include <EEPROM.h>
int addr = 0;
byte pattern;


In void setup I added this
Code: [Select]

pattern = EEPROM.read(0);


In void loop I added this:

Code: [Select]

EEPROM.write(0, pattern);


It still starts at the beginning like before.  What am I missing?

Nick Gammon

Can I see the whole code? Maybe you do this?

Code: [Select]
pattern = EEPROM.read(0);
pattern = 0;


Who knows without seeing more?
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

nyg78

I reverted back to the code in my first post because I still need to fix it.  Here's what I have right now.  Everything works but the EEPROM.

Code: [Select]


/*
*  bike light with pattern reverse button and pot
*/

#include <EEPROM.h>
int addr = 0;
byte pattern;

int potPin = 0;                 // input pin for the pot
int timer = 50;                 // you can adjust the numbers below to set the max and min for the speed adjustment
int x = 10;                    // sets the max speed (0 = fast) the lower the number the faster it can go
int y = 300;                   // sets the min speed (100 = slow) the higher the number the slower it can go

int switchPin = 2;              // switch is connected to pin 2
int switchPin2 = 3;             // switch to reverse pattern is connected to pin 3
int led1Pin = 11;
int led2Pin = 10;
int led3Pin = 9;
int led4Pin = 8;
int led5Pin = 7;
int led6Pin = 6;
int led7Pin = 5;
int led8Pin = 4;

int val;                        // variable for reading the pin status
int val2;                       // variable for reading the delayed status
int buttonState;                // variable to hold the button state
int val_rev;                        // variable for reading the pin status
int val2_rev;                       // variable for reading the delayed status
int buttonState_rev;


int lightMode = 0;              // What mode is the light in?

void setup() {
  pinMode(switchPin, INPUT);    // Set the switch pin as input

  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  pinMode(led3Pin, OUTPUT);
  pinMode(led4Pin, OUTPUT);
  pinMode(led5Pin, OUTPUT);
  pinMode(led6Pin, OUTPUT);
  pinMode(led7Pin, OUTPUT);
  pinMode(led8Pin, OUTPUT);
 
  pattern = EEPROM.read(0);
  pattern = 0;

 
  Serial.begin(9600);           // Set up serial communication at 9600bps
  buttonState = digitalRead(switchPin);   // read the initial state
}

void loop(){
  EEPROM.write(0, pattern);
 
  val = digitalRead(switchPin);      // read input value and store it in val
  delay(10);                         
    timer = 0;
for ( int i = 0; i < 10; i++ ) {
    timer += analogRead(0);               // reads the pot and sets the timer to the value
}
    timer = timer / 10;
    timer = map(timer, 0, 1023, x, y);   // maps the timer value to the max and min values set above with x and y 

  val2 = digitalRead(switchPin);     // read the input again to check for bounces
  val_rev = digitalRead(switchPin2);      //REVERSE read input value and store it in val
  delay(10);                         
  val2_rev = digitalRead(switchPin2);     // read the input again to check for bounces
   val_rev = digitalRead(switchPin2);
if (!val_rev) {                 // make sure we got 2 consistant readings!
    buttonState_rev = !buttonState_rev ;  // save the new state in our variable
  }
  if (val == val2) {                 // make sure we got 2 consistant readings!
    if (val != buttonState) {          // the button state has changed!
      if (val == LOW) {                // check if the button is pressed
        if (lightMode == 0) {          // if its single chase
          lightMode = 1;               // single chase then back
        } else {
          if (lightMode == 1) {        // if its single chase then back
            lightMode = 2;             // off
          } else {
            if (lightMode == 2) {      // off
                  lightMode = 0;
              }
    }
          }
        }
    buttonState = val;                 // save the new state in our variable
  }

  // Now do whatever the lightMode indicates
  if (lightMode == 0)  { // single chase
    if ( buttonState_rev == LOW ) {
    digitalWrite(led1Pin, HIGH);
    delay(timer);
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, HIGH);
    delay(timer);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led3Pin, HIGH);
    delay(timer);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led4Pin, HIGH);
    delay(timer);
    digitalWrite(led4Pin, LOW);
    digitalWrite(led5Pin, HIGH);
    delay(timer);
    digitalWrite(led5Pin, LOW);
    digitalWrite(led6Pin, HIGH);
    delay(timer);
    digitalWrite(led6Pin, LOW);
    digitalWrite(led7Pin, HIGH);
    delay(timer);
    digitalWrite(led7Pin, LOW);
    digitalWrite(led8Pin, HIGH);
    delay(timer);
    digitalWrite(led8Pin, LOW);
    val_rev = digitalRead(switchPin2);
  }
  else  { // reverse chase
    digitalWrite(led8Pin, HIGH);
    delay(timer);
    digitalWrite(led8Pin, LOW);
    digitalWrite(led7Pin, HIGH);
    delay(timer);
    digitalWrite(led7Pin, LOW);
    digitalWrite(led6Pin, HIGH);
    delay(timer);
    digitalWrite(led6Pin, LOW);
    digitalWrite(led5Pin, HIGH);
    delay(timer);
    digitalWrite(led5Pin, LOW);
    digitalWrite(led4Pin, HIGH);
    delay(timer);
    digitalWrite(led4Pin, LOW);
    digitalWrite(led3Pin, HIGH);
    delay(timer);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led2Pin, HIGH);
    delay(timer);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led1Pin, HIGH);
    delay(timer);
    digitalWrite(led1Pin, LOW);
    val_rev = digitalRead(switchPin2);
  }
}
if (lightMode == 1)  { // single chase then back
    if ( buttonState_rev == LOW ) {
    digitalWrite(led1Pin, HIGH);
    delay(timer);
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, HIGH);
    delay(timer);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led3Pin, HIGH);
    delay(timer);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led4Pin, HIGH);
    delay(timer);
    digitalWrite(led4Pin, LOW);
    digitalWrite(led5Pin, HIGH);
    delay(timer); 
    digitalWrite(led5Pin, LOW);
    digitalWrite(led6Pin, HIGH);
    delay(timer);
    digitalWrite(led6Pin, LOW);
    digitalWrite(led7Pin, HIGH);
    delay(timer);
    digitalWrite(led7Pin, LOW);
    digitalWrite(led8Pin, HIGH);
    delay(timer);
    digitalWrite(led8Pin, LOW);
    digitalWrite(led7Pin, HIGH);
    delay(timer);
    digitalWrite(led7Pin, LOW);
    digitalWrite(led6Pin, HIGH);
    delay(timer);
    digitalWrite(led6Pin, LOW);
    digitalWrite(led5Pin, HIGH);
    delay(timer);
    digitalWrite(led5Pin, LOW);
    digitalWrite(led4Pin, HIGH);
    delay(timer);
    digitalWrite(led4Pin, LOW);
    digitalWrite(led3Pin, HIGH);
    delay(timer);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led2Pin, HIGH);
    delay(timer);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led1Pin, HIGH);
    val_rev = digitalRead(switchPin2);
  }
  else  {  // reverse single chase then back
    digitalWrite(led8Pin, HIGH);
    delay(timer);
    digitalWrite(led8Pin, LOW);
    digitalWrite(led7Pin, HIGH);
    delay(timer);
    digitalWrite(led7Pin, LOW);
    digitalWrite(led6Pin, HIGH);
    delay(timer);
    digitalWrite(led6Pin, LOW);
    digitalWrite(led5Pin, HIGH);
    delay(timer);
    digitalWrite(led5Pin, LOW);
    digitalWrite(led4Pin, HIGH);
    delay(timer); 
    digitalWrite(led4Pin, LOW);
    digitalWrite(led3Pin, HIGH);
    delay(timer);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led2Pin, HIGH);
    delay(timer);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led1Pin, HIGH);
    delay(timer);
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, HIGH);
    delay(timer);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led3Pin, HIGH);
    delay(timer);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led4Pin, HIGH);
    delay(timer);
    digitalWrite(led4Pin, LOW);
    digitalWrite(led5Pin, HIGH);
    delay(timer);
    digitalWrite(led5Pin, LOW);
    digitalWrite(led6Pin, HIGH);
    delay(timer);
    digitalWrite(led6Pin, LOW);
    digitalWrite(led7Pin, HIGH);
    delay(timer);
    digitalWrite(led7Pin, LOW);
    digitalWrite(led8Pin, HIGH);
    val_rev = digitalRead(switchPin2);
  }
}
  if (lightMode == 2) { // all off
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led4Pin, LOW);
    digitalWrite(led5Pin, LOW);
    digitalWrite(led6Pin, LOW);
    digitalWrite(led7Pin, LOW);
    digitalWrite(led8Pin, LOW);
    val_rev = digitalRead(switchPin2);
  }
}
}


The original project this is based on is here: http://www.ladyada.net/learn/arduino/lesson5.html

Graynomad

#11
Aug 13, 2011, 01:53 am Last Edit: Aug 13, 2011, 01:55 am by Graynomad Reason: 1
You should not have this executing in every loop.

Code: [Select]
void loop(){
  EEPROM.write(0, pattern);


because you will wear out location 0 in the EEPROM before too long.

Quote
Everything works but the EEPROM.


I don't understand what doesn't work, as far as I can see "pattern" is never used, so a) how do you know the EEPROM write isn't working, and b) why do it anyway?

Then you have

Code: [Select]
pattern = EEPROM.read(0);
  pattern = 0;


What is this meant to do?
______
Rob
Rob Gray aka the GRAYnomad www.robgray.com

Nick Gammon

A quick test shows that the main loop could do 100,000 iterations in about 1/5 of a second.

Since the EEPROM can only handle 100,000 writes, I would guess you have worn it out in 0.2 seconds.

My original suggestion was:

Quote
If they change patterns, save it to (say) address 0 in the EEPROM ...


Emphasis added this time around. If you read up on the EEPROM library there is a clear warning on the write function that you can only do approximately 100,000 writes.

This is why I said "if they change patterns". I was hoping that patterns wouldn't change more than perhaps a few hundred or even a few thousand times.

And why do you do this:

Code: [Select]
pattern = EEPROM.read(0);
  pattern = 0;


Surely it's obvious that pattern will always be zero and thus it will always start back at the start?
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

nyg78


And why do you do this:

Code: [Select]
pattern = EEPROM.read(0);
  pattern = 0;


Surely it's obvious that pattern will always be zero and thus it will always start back at the start?


Nick, I was doing what you suggested in Reply #9.  Patterns shouldn't change that much, I just want it to remember which one was last used when turned back on.


Nick Gammon

Maybe I wasn't clear. That was an example of why it would not work. That was why I wanted to see more of your code. Clearly if you read pattern, and then change it later, you may as well not have bothered reading it.

If you post snippets of code, and say the whole thing doesn't work, then we have to guess what else there is that might cause it not to work. That two lines of code was such a guess. Unfortunately you copied my "bad example" into your code.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

Go Up