I want to use an array to control output values. What can I do?

Good day!
So, I have this Arduino Mega 2560, and I want to control the PWM of digital pins 2-13 using sequences of data in an array. The outputs are controlling the “brightness” of LEDs - so far I have had success controlling brightness scanning through an array pin to pin, but ideally I would like each output to sequence through an array, and from different starting points.

Here is what I have got, and it does not work.

int potPin = 0;
int timer = analogRead(potPin);
const int transistorPin2 = 2;
const int transistorPin3 = 3;
const int transistorPin4 = 4;
const int transistorPin5 = 5;
const int transistorPin6 = 6;
const int transistorPin7 = 7;
const int transistorPin8 = 8;
const int transistorPin9 = 9;
const int transistorPin10 = 10;
const int transistorPin11 = 11;
const int transistorPin12 = 12;
const int transistorPin13 = 13;

int pwmVals[] = {0,7,15,31,63,127,255,127,63,31,15,0,7,15,31,63,127,255,127,63,31,15,7};
int valCount = 11;

int i;
int brightness = pwmVals[i];

void setup() {
   for (int i = 0; i < valCount; i++);
   
Serial.begin(9600);
   pinMode(transistorPin2, OUTPUT);
   pinMode(transistorPin3, OUTPUT);
   pinMode(transistorPin4, OUTPUT);
   pinMode(transistorPin5, OUTPUT); 
   pinMode(transistorPin6, OUTPUT); 
   pinMode(transistorPin7, OUTPUT); 
   pinMode(transistorPin8, OUTPUT); 
   pinMode(transistorPin9, OUTPUT); 
   pinMode(transistorPin10, OUTPUT); 
   pinMode(transistorPin11, OUTPUT); 
   pinMode(transistorPin12, OUTPUT);
   pinMode(transistorPin13, OUTPUT);  



}
void loop() {

int sensorValue = analogRead(potPin);
  Serial.println(sensorValue);          
  delay(1);                             

int timer = map ( analogRead(potPin), 0,1023, 2000,400 );


   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin2, brightness);
      delayMicroseconds(timer);
  }
    
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin3, brightness);
      delayMicroseconds(timer);
  }
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin4, brightness);
      delayMicroseconds(timer);
  }
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin5, brightness);
      delayMicroseconds(timer);
  }
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin6, brightness);
      delayMicroseconds(timer);
  }
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin7, brightness);
      delayMicroseconds(timer);
  }
    
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin8, brightness);
      delayMicroseconds(timer);
  }
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin9, brightness);
      delayMicroseconds(timer);
  }
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin10, brightness);
      delayMicroseconds(timer);
  }

  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin11, brightness);
      delayMicroseconds(timer);
  }

   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin12, brightness);
      delayMicroseconds(timer);
  }

   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin13, brightness);
      delayMicroseconds(timer);
  }

}

Much appreciated,
J

int brightness = pwmVals[i];

This has to be somewhere in loop() if you want it to ever change.

You're copying the same value eleven times each for loop, to the same pin.
Why?
The pin isn't going to forget.

Here is what I have so far,
now the array pwmVals represents an 8 bit sine wave
which sets the valCount to 256

Each ‘for loop’ is designated to a different pin, to run through the values of ‘i,’ so that the array pwmVals will sequence through each pin - so I have declared “int brightness = pwmVals[‘i’]”

example:

   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin2, brightness);
      delayMicroseconds(timer);}

Are there any inherent problems with that, or something else in my implementation?

int potPin = 0;
int timer = analogRead(potPin);
const int transistorPin2 = 2;
const int transistorPin3 = 3;
const int transistorPin4 = 4;
const int transistorPin5 = 5;
const int transistorPin6 = 6;
const int transistorPin7 = 7;
const int transistorPin8 = 8;
const int transistorPin9 = 9;
const int transistorPin10 = 10;
const int transistorPin11 = 11;
const int transistorPin12 = 12;
const int transistorPin13 = 13;

int pwmVals[] = {
  127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
  242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
  221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
  76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
  33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124
};

int valCount = 256;

int i;

void setup() {
   for (int i = 0; i < valCount; i++);
   
Serial.begin(9600);
   pinMode(transistorPin2, OUTPUT);
   pinMode(transistorPin3, OUTPUT);
   pinMode(transistorPin4, OUTPUT);
   pinMode(transistorPin5, OUTPUT); 
   pinMode(transistorPin6, OUTPUT); 
   pinMode(transistorPin7, OUTPUT); 
   pinMode(transistorPin8, OUTPUT); 
   pinMode(transistorPin9, OUTPUT); 
   pinMode(transistorPin10, OUTPUT); 
   pinMode(transistorPin11, OUTPUT); 
   pinMode(transistorPin12, OUTPUT);
   pinMode(transistorPin13, OUTPUT);  
}

void loop() {

int brightness = pwmVals[i];

int sensorValue = analogRead(potPin);
  Serial.println(sensorValue);          
  delay(1);                             

int timer = map ( analogRead(potPin), 0,1023, 2000,400 );

   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin2, brightness);
      delayMicroseconds(timer);}
    
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin3, brightness);
      delayMicroseconds(timer);}
  
   for (int i = 255; i > 0; i--); 
      {analogWrite(transistorPin4, brightness);
      delayMicroseconds(timer);}
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin5, brightness);
      delayMicroseconds(timer);}
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin6, brightness);
      delayMicroseconds(timer);}
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin7, brightness);
      delayMicroseconds(timer);}
    
   for (int i = 255; i > 0; i--);  
      {analogWrite(transistorPin8, brightness);
      delayMicroseconds(timer);}
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin9, brightness);
      delayMicroseconds(timer);}
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin10, brightness);
      delayMicroseconds(timer);}
  
   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin11, brightness);
      delayMicroseconds(timer);}

   for (int i = 255; i > 0; i--);  
      {analogWrite(transistorPin12, brightness);
      delayMicroseconds(timer);}

   for (int i = 0; i < valCount; i++); 
      {analogWrite(transistorPin13, brightness);
      delayMicroseconds(timer);}

}

the result is just that all the pins are high. Any help would be enormously appreciated.

You have a global variable called 'i' that sets brightness, then multiple locals also called 'i'.

Could that be what is confusing you?

Why not an array of output pins?

TolpuddleSartre:
You have a global variable called 'i' that sets brightness, then multiple locals also called 'i'.

Could that be what is confusing you?

Yes, that is possibly confusing me. I only wanted the 'i' to effect the value of brightness. Is there better way to index through the array?

TolpuddleSartre:
Why not an array of output pins?

I have done that, and may after I get this array running... In this instance I would rather have all the pins simultaneously producing an output - but that is not what even this code is doing. Is that possible? How do I do that?

Thank you

Here is the code simplified, and for just 1 pin, so that hopefully it is easier to analyze.
Can anyone tell me why this isn’t working?

const int transistorPin13 = 13;

int timer = 4000; //

int pwmVals [] = {
  127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
  242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
  221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
  76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
  33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124
};

int valCount = 256;
 void setup() {
   pinMode(transistorPin13, OUTPUT);

 }
 void loop() 
{
  int i;
int brightness = pwmVals[i];

    for (int i = 0; i < 255; i++)            
      {analogWrite(transistorPin13, brightness);
      delayMicroseconds(timer);}    
 }

You are writing the same value,(127), 255 times to the same pin.

Edit, correction: you're writing the same value 255 times, but I have no idea what that value is.
Neither do you.

You set the value "brightness" outside the for loop...so it never changes. Either move it inside the loop or change your analogWrite to use pwmVals directly.

Steve

TolpuddleSartre:
You are writing the same value,(127), 255 times to the same pin.

That's definitely what it looks like. How do I increment that value?

Fix the problem I pointed out in my edit.
Hint: which element of pwmVals are you assigning to brightness?

slipstick:
You set the value “brightness” outside the for loop…so it never changes. Either move it inside the loop or change your analogWrite to use pwmVals directly.

Ah, using pwmVals directly did it, thanks!

const int transistorPin13 = 13;

int timer = 4000; //

int pwmVals [] = {
  127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
  242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
  221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
  76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
  33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124
};

int valCount = 256;
 void setup() {
   pinMode(transistorPin13, OUTPUT);

 }
 void loop() 
{
int i;
    for (int i = 0; i < 255; i++)            
      {analogWrite(transistorPin2, pwmVals[i]);
      delayMicroseconds(timer);}    
}

Now that I have that sorted, the result is not quite what I was after. Is there any way to get this to occur for all of 12 of the pins simultaneously?

No, but it can be done quickly enough that you won't notice the difference.

TolpuddleSartre:
No, but it can be done quickly enough that you won't notice the difference.

I would be interested in that, how can I stripe this array across the pins? So each pin is updating one shift at a time?

Make an array of pin numbers, and use a for loop to iterate over the array.

TolpuddleSartre:
Make an array of pin numbers, and use a for loop to iterate over the array.

I did that, alas, it remains runs the entire array on one pin at a time, which at extreme speeds looks pretty similar to a regular scan. What is just one value of array to increment successively with every increment of the pin number. Any ideas?

I did that, alas, it remains runs the entire array on one pin at a time, which at extreme speeds looks pretty similar to a regular scan

Can we just assume I don't understand that sentence.
Because I don't.

Please post the code that you tried, describe how it behaves, and how that differs from what you ezpected.

TolpuddleSartre:
Can we just assume I don’t understand that sentence.
Because I don’t.

Please post the code that you tried, describe how it behaves, and how that differs from what you ezpected.

Sure thing!

int potPin = 0;
int timer = analogRead(potPin);
int ledPins[] =   {2,3,4,13,12,5,6,11,10,7,9,9,8,10,7,6,11,12,5,4,3,2};

int pinCount = 30;

int pwmVals [] = {
  127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
  242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
  221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
  76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
  33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124
};

int valCount = 256;

void setup() {
Serial.begin(9600);

  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    pinMode(ledPins[thisPin], OUTPUT);
  }
}

void loop() {

int i;
  
int sensorValue = analogRead(potPin);
  Serial.println(sensorValue);          
  delay(1);                             

int timer = map ( analogRead(potPin), 0,1023, 5000,100 );

//ONE

    for (int thisPin = 0; thisPin <= 5 ; thisPin++) {
    for (int i = 0; i < 127; i++) 
      {analogWrite(ledPins[thisPin], pwmVals[i]);
      delayMicroseconds(timer);}
  }
    for (int thisPin = 10; thisPin >= 6 ; thisPin--) {
    for (int i = 127; i > 0; i--) 
      {analogWrite(ledPins[thisPin], pwmVals[i]);
      delayMicroseconds(timer);}
  }
    for (int thisPin = 11; thisPin <= 16 ; thisPin++) {
    for (int i = 0; i < 127; i++) 
      {analogWrite(ledPins[thisPin], pwmVals[i]);
      delayMicroseconds(timer);}
  }
    for (int thisPin = 21; thisPin >= 17 ; thisPin--) {
    for (int i = 127; i > 0; i--) 
      {analogWrite(ledPins[thisPin], pwmVals[i]);
      delayMicroseconds(timer);}
  }
}

In this code, one pin runs through the array pwmVals at a time, while an array cycles through a series of pins in an array of pins.

What I want to happen is for each increment in the pin array, I want one different increment out of of the pwmVals array.

Thanks again!

I’m not sure I understand what you’re talking about but maybe try making the pwmVals loops the outside ones and inside them have the loop that iterates through all the pins.

So it sort of goes - next pwmVals, now apply that value to all the pins, then get another pwmVals etc.

Steve