PWM for 8 LED's with only 6 pins available?


it seems work!  can see problem code?
you not need series res except maybe fancy blinking in setup.
just connect 8 led's , 8 switches pins below.
the other side of switches gnd.

code: [select]

#define uper 50   //step period in ms 200 max non-pwm
#define bmax 30  //255 or 50 no need series res way
#define l1a 2   //a means not pwm
#define l2  3
#define l3a 4
#define l4  5  
#define l5  6
#define l6  9
#define l7  10
#define l8  11
#define sw1 7   //d7
#define sw2 8
#define sw3 12
#define sw4 13  //a0?
#define sw5 a1  //a means analog pins
#define sw6 a2
#define sw7 a3
#define sw8 a4

#define aw(x) analogwrite(cbout[x],a[x])
#define aw2(x,v) analogwrite(cbout[x],v)
#define dw0(x) digitalwrite(cbout[x],low)
#define dw1(x) digitalwrite(cbout[x],high)
#define push(x) (!digitalread(cbin[x]))
#define v1 (int(a[1])*uper/26)  //0- 1000  26=255/10  when uper=100
#define v3 (int(a[3])*uper/26)

const byte cbout[9]={0,l1a,l2,l3a,l4,l5,l6,l7,l8};
const byte cbin[9]={0,sw1,sw2,sw3,sw4,sw5,sw6,sw7,sw8};
byte a[9],ud[9];  //0 none 1 2 dn
int i,j,k=0;
//long m,wasm;

void setup(){
//serial.begin(9600);
for(i=1;i<9;i++){
a[i]=ud[i]=0;
pinmode(cbout[i],output);
digitalwrite(cbin[i],high);  //20k pullup
}
//fancy blinking after start choose 1?
for(i=1;i<9;i++){dw1(i);delay(50);}
for(i=8;i>0;i--){dw0(i);delay(50);} delay(100);
for(i=1;i<9;i++){dw1(i);delay(50);}
for(i=1;i<9;i++){dw0(i);delay(50);} delay(100);
for(i=10;i<50;i++){dw1((i%8)+1);delay(2+i/2);dw0((i%8)+1);}
for(i=0;i<100;i++){dw1(j=random(8)+1);delay(random(50)+10);dw0(j);}
}
void loop(){
//while((m=millis())==wasm) ;  //wait until next ms
mydelay(uper);
for(i=1;i<9;i++){
if push(i) dop(i);
doi(i);
}}
void mydelay(int d) {  //ms
int vv1=v1,vv3=v3;
//serial.print(v1);serial.write(32);
for(i=0;i<10;i++) {
if(vv1)dw1(1);
if(vv3)dw1(3);
for(j=0;j<d*9;j++) {  //10->9
if(j==vv1)dw0(1);
if(j==vv3)dw0(3);
delaymicroseconds(10);
}}
dw0(1);dw0(3); //just in case
}
void dop(byte p) {
if((ud[p]==0)&&(a[p]==0   ))ud[p]=1;
if((ud[p]==0)&&(a[p]==bmax))ud[p]=2;
}  
void doi(byte p) {  //p pin
int ainc=1;
if(a[p]>bmax/2)ainc++;  //bmax should not 255
if((ud[p]==1)&&(a[p]<bmax))a[p]+=ainc;  //2nd part not needed cuz below
if((ud[p]==2)&&(a[p]>0   ))a[p]-=ainc;
if(a[p]==bmax)ud[p]=0;
if(a[p]==0   )ud[p]=0;
if((p==1)||(p==3))return;  //not pwm
aw(p);
}
/*
the pwm outputs generated on pins 5 , 6 have higher-than-expected duty cycles.
this because of interactions millis() , delay() functions,
which share same internal timer used generate pwm outputs.
this noticed on low duty-cycle settings (0 - 10)
and may result in value of 0 not turning off output on pins 5 , 6.
*/

so have 40ma+ leds fo 200ms no resistor?

here's typical red led
http://www.vishay.com/docs/83028/tlhk5800.pdf

supports surge current of 0.1a.
but 10us

what leds using tolerant of higher current long?


Arduino Forum > Using Arduino > LEDs and Multiplexing > PWM for 8 LED's with only 6 pins available?


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial