Ciao,dal consiglio di questo link : http://forum.arduino.cc/index.php?topic=492121.0;topicseen
ho acquistato i driver della serie mic2981 avendo a disposizione dei led rgb ho creato nel tempo 2 display 7 segmenti.
Assemblato il circuito ho creato un codice [ Allego Codice Anomalo ] per verificare l'accensione almeno nel colore verde dei led rgb.
Questo codice mi ha creato dei problemi ( onestamente non riesco a capire dove sbaglio ) perchè alcuni segmenti mi rimangono accesi a " mezza luce " quando dovrebbero essere spenti.
Non riuscendo a capire se il problema fosse hw o del codice [ Allego Codice NO Anomalia ,ho scritto un altro codice,non proprio uguale,ma penso che mi faccia escludere un " bugs " Hardware,almeno penso.
Allego [ Codice Anomalo ] :
extern unsigned long timer0_millis; //
int digit1 = A2; // Display pin xx [ Decine ]
int digit2 = A1; // Display pin xx [ Unità ]
int segA = 2; //
int segB = 3; //
int segC = 4; //
int segD = 5; //
int segE = 6; //
int segF = 7; //
int segG = 8; //
int start_num_valore = 99; //
int seg_ON = 0; //
int valore; //
int pwm_v = 9; //
int pwm_v_on = 255;
int pwm_v_off = 0;
void setup() {
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(pwm_v, OUTPUT);
timer0_millis = 0 ;
}
void loop () {
if (seg_ON==0) {
if (((millis()/1000) <= start_num_valore)) {
displayNumber (start_num_valore -(millis()/1000));
valore = (start_num_valore -(millis()/1000));
}
else
{
timer0_millis = 0 ;
}
}
}
void displayNumber(int toDisplay) {
#define DISPLAY_LUMINOSITA 5000 // Vmax luminosità 5000
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
long beginTime = millis();
for(int digit = 2 ; digit > 0 ; digit--) {
//
// Rotazione dei Digit 1+2 [ D+U ] in funzione On / Off
//
switch(digit) {
case 1:
if(valore >= 10) {
digitalWrite(digit1, DIGIT_ON);
break;
}
else
{
digitalWrite(digit1, DIGIT_OFF);
break;
}
case 2:
digitalWrite(digit2, DIGIT_ON);
break;
}
//
// Gestione Display con il Pwm
//
lightNumber(toDisplay % 10);
toDisplay /= 10;
//Display digit luminosità (...da 1us a 5000us, 500 Valore di Default...)
delayMicroseconds(DISPLAY_LUMINOSITA);
//Spegni tutti i Segmenti
lightNumber(10);
//Spegni tutti i digit
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
analogWrite(pwm_v, pwm_v_off);
}
while((millis() - beginTime) < 10) ;
}
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
switch (numberToDisplay) {
case 0:
if(valore >= 1) {
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
analogWrite(pwm_v, pwm_v_on);
break;
}
else {
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
analogWrite(pwm_v, pwm_v_off);
break;
}
case 1:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
analogWrite(pwm_v, pwm_v_on);
break;
case 2:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
analogWrite(pwm_v, pwm_v_on);
break;
case 3:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
analogWrite(pwm_v, pwm_v_on);
break;
case 4:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
analogWrite(pwm_v, pwm_v_on);
break;
case 5:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
analogWrite(pwm_v, pwm_v_on);
break;
case 6:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
analogWrite(pwm_v, pwm_v_on);
break;
case 7:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
analogWrite(pwm_v, pwm_v_on);
break;
case 8:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
analogWrite(pwm_v, pwm_v_on);
break;
case 9:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
analogWrite(pwm_v, pwm_v_on);
break;
case 10:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
analogWrite(pwm_v, pwm_v_off);
break;
}
}
Se qualcuno mi riesce a dare a qualche dritta,lo ringrazio in anticipo.
I led comunque essendo del tipo 5mm non ho potuto pilotarli in serie ,ma ad ogni led una sua resistenza in serie ( Catodo Comune ) e pilotato dall'uscita del driver MICxxxxx.
Tensione di pilotaggio 12Vcc.
Il Codice [ No Anomalia ] lo allego successivamente perchè ,il portale mi dice che ho superato i 9000 caratteri.
Grazie,Mauro
[/code]