Salve a tutti ho un problema: ho questo programma per contare le cifre su 8 display a sette segmnti, comandati tramite multiplexing, cioè con 7 pin mando i segmenti che devono essere accesi e con altri 3 mando in binario la cifra su cui devono essere posizionati. La questione che mi affligge da un bel po è: come posso regolare la luminosità di codesti ?
#include <TimerOne.h>
int dig1 = 11,dig2 = 9,dig3 = 10;
int a = 3,b = 4,c = 5,d = 6,e = 7,f = 8,g = 12;
char currDig = 0;
char Dmilioni,milioni,Cmigliaia,Dmigliaia,migliaia,centinaia,decine,unita;
// Array delle cifre e lettere (A,B,C,D,E,F,G)
char letters[18][7] = {
{0,0,0,0,0,0,1}, // 0
{1,0,0,1,1,1,1}, // 1
{0,0,1,0,0,1,0}, // 2
{0,0,0,0,1,1,0}, // 3
{1,0,0,1,1,0,0}, // 4
{0,1,0,0,1,0,0}, // 5
{0,1,0,0,0,0,0}, // 6
{0,0,0,1,1,1,1}, // 7
{0,0,0,0,0,0,0}, // 8
{0,0,0,0,1,0,0}, // 9
{0,0,0,1,0,0,0}, // A
{1,1,0,0,0,0,0}, // b
{1,1,1,0,0,1,0}, // c
{1,0,0,0,0,1,0}, // d
{0,1,1,0,0,0,0}, // E
{0,1,1,1,0,0,0}, // F
{0,1,0,0,0,0,1}, // G
{1,1,0,1,0,0,0} // h
};
void setup()
{
Timer1.initialize(2000); // initialize timer1, and set a 1,5 millisecond period
Timer1.attachInterrupt(setDigit); // attaches callback() as a timer overflow interrupt
pinMode(dig1,OUTPUT);
pinMode(dig2,OUTPUT);
pinMode(dig3,OUTPUT);
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
pinMode(g,OUTPUT);
Serial.begin(9600);
}
void loop()
{
long i=0; //inserita la variabile di tipo "long" in modo da non limitare i numeri a 32000
for(i=0;i<=99999999;i++)
{
unita=i%10;
decine=(i%100)/10;
centinaia=(i%1000)/100;
migliaia=(i%10000)/1000;
Dmigliaia=(i%100000)/10000;
Cmigliaia=(i%1000000)/100000;
milioni=(i%10000000)/1000000;
Dmilioni=(i%100000000)/10000000;
delay(1);
Serial.println(i);
}
}
void SendLetters(unsigned char digs)
{
digitalWrite(a,letters[digs][0]);
digitalWrite(b,letters[digs][1]);
digitalWrite(c,letters[digs][2]);
digitalWrite(d,letters[digs][3]);
digitalWrite(e,letters[digs][4]);
digitalWrite(f,letters[digs][5]);
digitalWrite(g,letters[digs][6]);
}
void setDigit()
{
if(currDig++>7) currDig=0;
switch(currDig)
{
case 7:
SendLetters(Dmilioni);
digitalWrite(dig1,1);
digitalWrite(dig2,1);
digitalWrite(dig3,1);
break;
case 6:
SendLetters(milioni);
digitalWrite(dig1,1);
digitalWrite(dig2,1);
digitalWrite(dig3,0);
break;
case 5:
SendLetters(Cmigliaia);
digitalWrite(dig1,1);
digitalWrite(dig2,0);
digitalWrite(dig3,1);
break;
case 4:
SendLetters(Dmigliaia);
digitalWrite(dig1,1);
digitalWrite(dig2,0);
digitalWrite(dig3,0);
break;
case 3:
SendLetters(migliaia);
digitalWrite(dig1,0);
digitalWrite(dig2,1);
digitalWrite(dig3,1);
break;
case 2:
SendLetters(centinaia);
digitalWrite(dig1,0);
digitalWrite(dig2,1);
digitalWrite(dig3,0);
break;
case 1:
SendLetters(decine);
digitalWrite(dig1,0);
digitalWrite(dig2,0);
digitalWrite(dig3,1);
break;
case 0:
SendLetters(unita);
digitalWrite(dig1,0);
digitalWrite(dig2,0);
digitalWrite(dig3,0);
break;
}
}