help

can someone help me ?
i am trying to get a sign to flash numbers when you press a button but i am running into a problem. when i set digitalWrite(ledPin1, LOW); the light turns on and when i set digitalWrite(ledPin1, HIGH); the light wont turn on . ? does anybody know why this is happening i checked the wires and there is nothing wrong i think there is something wrong with my programing . right now this is what is programed

int ledPin1 = 1;
int ledPin2 = 2;
int ledPin3 = 3;
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin7, OUTPUT);
pinMode(ledPin6, OUTPUT);
}
void loop (){

digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
}
and with this code the lights tun on

Are the LEDS wired from the pin to ground? Or is the LED wired from the pin to 5 volts?

Wire the LONG LEG of the LED which is POSITIVE to the output pin. Connect the ground to the SHORT NEGATIVE lead.

You might have wired them incorrectly.

pin 1 is used by the Serial port, try it starting from pin 2

It looks like you are working with a 7 segment display right ?

If that is true you have to figure out if it is a common annode or a common cathode display you have. I think that's what Mark trys to say as well :slight_smile:

yea its not separate leds it is one display thing like you have in the old digital alarm clock
i have a picture of it if i knew how to post it??
yea but it is wired to the 5v pin and the rest go to the digital pins.

when i set digitalWrite(ledPin1, LOW); the light turns on and when i set digitalWrite(ledPin1, HIGH); the light wont turn on .

Is that a mistake in your original question?

Taken as face value (that there is no mistake) then yes that is the way it is supposed to work as HIGH puts the cathode of the LED at the same voltage as the anode and so no current flows and the LED is not on. This is known as the current sinking method of driving an LED.

ok i got it working and i got the code working properly to cycle through 0 to 9 but now i want to add a button to pause the cycle and keep the number it stopped at . heir is the code i came up with just to cycle through the numbers without stopping

int ledPin1 = 1;
int ledPin2 = 2;
int ledPin3 = 3;
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
int inputPin = 8;
int val = 0;
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin7, OUTPUT);
pinMode(ledPin6, OUTPUT);

}

void loop () {

digitalWrite(ledPin1, HIGH); // number 1
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, HIGH);
delay(500);
digitalWrite(ledPin1, LOW); // number 2
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, HIGH);
digitalWrite(ledPin7, LOW);
delay(500);
digitalWrite(ledPin1, LOW); // number 3
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(500);
digitalWrite(ledPin1, HIGH); // number 4
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, HIGH);
delay(500);
digitalWrite(ledPin1, LOW); // number 5
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(500);
digitalWrite(ledPin1, HIGH); // number 6
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(500);
digitalWrite(ledPin1, LOW); // number 7
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, HIGH);
delay(500);
digitalWrite(ledPin1, LOW); // number 8
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(500);
digitalWrite(ledPin1, LOW); // number 9
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, HIGH);
delay(500);
digitalWrite(ledPin1, LOW); // number 0
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(500);
}

Do you want it to stop and then resume your delay or hold and then continue with your delay when you release.
Either way you have to replace every instance of delay(500) with some code. Now is a good time to learn about functions.

OK so now you have code like a long string of sausages. Now for your next level of learning. Remember this mantra:-
When you find your self writing code that keeps repeating the same or very similar lines, there is a better way of doing it.

Look at holding the data for the on and off states in an array, look at functions and look at the millis() function to replace your delay() calls. That last one will enable you to do things during a delay.

i wanted to make it stop the first time i pushed the button and start back where it left off after i pressed the button again
but yea i will look at the millis() function

make it stop the first time i pushed the button and start back where it left off after i pressed the button again

OK you need a loop that holds when it sees a button press OR when millis() is 500 (or what ever delay value you want) greater than when you started.
so you replace the delay with:-
long endTime; // put this at the start of your sketch

endTime = millis() + 500;
while(endTime>millis()) {
// now look at your button and do your stuff
}

wait i dont get it isnt millis() function just to keep track of time since the program started? so how is it suppose to make the loop hold

i was just looking through the reference for the arduino and found the switch case function i think this will work for what i need ?. i am going to try to program this into my code now and see if it works

ok i got the code done but instead of a button i used the switch case function with a potentiometer (which i don't have right now) but i have one of this
http://www.kpsec.freeuk.com/photos/rapid/preset3.jpg
how do i set this up to work like a potentiometer the three pins got me a little mixed up and i don't know what to do.

Well, if you Google the part number you should find a datasheet but it looks like a multi turn pot. two of the leads are the ends of the resistor and the third is the wiper. When you turn the screw the value of two pins will not change and the third will go up or down in value from either one of the others.

i dont get it isnt millis() function just to keep track of time since the program started

I know you have looked at an alternate solution but:-

If you know how long the Arduino has been running (and you don't actually want to know that directly). Then that time plus 500 will be how long the Arduino has been running when you want to end your delay.

In this way you can do the equivalent to delay(500) but still able to do stuff during it. :slight_smile:

A potentiometer with three wires. Outside to +5v, other side to ground centre to analogue in. It doesn't matter which side is +5v

ok i decided to go with what you said mike and this is what i have done

int ledPin1 = 1;                  
int ledPin2 = 2;                
int ledPin3 = 3;
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
int inputPin = 10;
int val = 0;
void setup()  {                  




  pinMode(ledPin1, OUTPUT);        
  pinMode(ledPin2, OUTPUT);      
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(inputPin, INPUT);

  }

 void loop  () {
  long endTime; 
endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
   
  digitalWrite(ledPin1, HIGH);    // number 1
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);

}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  digitalWrite(ledPin1, LOW);    // number 2
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, HIGH);
  digitalWrite(ledPin7, LOW);
}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  digitalWrite(ledPin1, LOW);    // number 3
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
}
  endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  

  digitalWrite(ledPin1, HIGH);    // number 4
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);
}
endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  digitalWrite(ledPin1, LOW);    // number 5
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, HIGH);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  digitalWrite(ledPin1, HIGH);    // number  6
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, HIGH);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  digitalWrite(ledPin1, LOW);    // number 7
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);
}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  digitalWrite(ledPin1, LOW);    // number 8
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  digitalWrite(ledPin1, LOW);    // number 9
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);
}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  

  digitalWrite(ledPin1, LOW);    // number 0
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
}
  
 }

i dont know if this is right i havent actually tried out yet i think i have to increase this by 500 ever number
endTime = millis() + 500;
while(endTime>millis()) {
val = digitalRead(inputPin);
if (val == HIGH)

ok i just tried it out and the button wont do anything it just keeps cycling through the numbers

Your "if" statements are not doing what you think they're doing.

It appears that you expect the highlighted statements to be done only if the input is high:

while(endTime>millis()) {
val = digitalRead(inputPin);
if (val == HIGH)

digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, HIGH);
digitalWrite(ledPin7, LOW);
}

This is not the case. An IF statement only controls ONE statement, not everything that follows it. This is what is happening.

while(endTime>millis()) {
val = digitalRead(inputPin);
if (val == HIGH)
digitalWrite(ledPin1, LOW);

// the rest of these are being done regardless of the input
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, HIGH);
digitalWrite(ledPin7, LOW);
}

If you want to control more statements than just the single statement after the IF condition, you need to use { } curly braces.

while(endTime>millis()) {
val = digitalRead(inputPin);
if (val == HIGH)
{
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, HIGH);
digitalWrite(ledPin7, LOW);
}
}

Grkays, There are two things you are doing wrong. First you haven't finished the routine of what to do when the button is pressed. You should then loop until it is unpressed. Second you should define it as a function and call it every time you normally call delay(500).

Put this at the end of your sketch after the loop() function:-

void delayHold(int del){
 endTime = millis() + del;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH) {
// hold until val == LOW
  while(val == LOW){
  val = digitalRead(inputPin);
  }
}
}
}

Now each time you originally had delay(500); replace it with delayHold(500);

int ledPin1 = 1;                  
int ledPin2 = 2;                
int ledPin3 = 3;
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
int inputPin = 10;
int val = 0;
void setup()  {                  




  pinMode(ledPin1, OUTPUT);        
  pinMode(ledPin2, OUTPUT);      
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(inputPin, INPUT);

  }

 void loop  () {
  long endTime;
endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  
  
  digitalWrite(ledPin1, HIGH);    // number 1
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);

[glow]}
  endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  [/glow]
  digitalWrite(ledPin1, LOW);    // number 2
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, HIGH);
  digitalWrite(ledPin7, LOW);
[glow]}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  [/glow]
  digitalWrite(ledPin1, LOW);    // number 3
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
[glow]}
  endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  [/glow]

  digitalWrite(ledPin1, HIGH);    // number 4
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);
[glow]}
endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  [/glow]
  digitalWrite(ledPin1, LOW);    // number 5
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, HIGH);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
[glow]}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)[/glow]
  
  digitalWrite(ledPin1, HIGH);    // number  6
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, HIGH);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
[glow]}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)[/glow]
  
  digitalWrite(ledPin1, LOW);    // number 7
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);
[glow]}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)[/glow]
  
  digitalWrite(ledPin1, LOW);    // number 8
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
[glow]}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  [/glow]
  digitalWrite(ledPin1, LOW);    // number 9
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);
[glow]}
 endTime = millis() + 500;
while(endTime>millis()) {
  val = digitalRead(inputPin);
  if (val == HIGH)
  [/glow]

  digitalWrite(ledPin1, LOW);    // number 0
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, LOW);
}
  
 }

do you want me to leave the first one at the top of the loop replace this or just add a delayHold (500) to it and put the code you gave me at the end of the loop.