contamarce per moto

Salve a tutti i partecipanti del forum, siate clementi con me poichè è la mia prima pubblicazione che effettuo e sono alle prime esperienze di programmazione.
Mi sono presentato qualche giorno fa sul forum con il nick Lollo65, spero di averlo inserito nella sezione giusta.
Veniamo al sodo vi spiego la mia esigenza:
Vorrei realizzare un contamarce per la mia moto. Su internet e sul sito ne ho trovati di diversi tipologie.
Infattio un primo contamarce che ho realizzato utilizzava un contatore up/dwn cd4029 ed un diplsy TIL311 capace di conatre in esadecimale; pero cio che non mi piaceva era lindicazione F quando la moto è in folle.
Io, però, volevo far indicare al mio contatore la lettera N (neutral) quando la moto è in Folle e ho aggiunto al primo contatore un Intersil 7243 riuscendo nell'impresa di fargli indicare la lettera N ma le dimensioni del circuito diventano troppo gradi per piazzarlo sulla moto.
Poi sono caduto nell'immenso modo di Arduino e girovagando in questo mondo ho trovato alcuni proggetti di contamarce per auto e moto ma aime essendo Io un anziano signore che ha rispolverato l'elettronica logica ho trovato enormi difficolta a comprendere il linguaggio di programmazione per arduino.
Però essendo io caparpio e determinato ho cominciato a comprendere come funzionavano i vari sketch dei proggetti per contamarce e ne ho adattoato uno alle mie esigenze.
Comprendo che il contamarce è un proggettino assai semplice in confronto a d altri molto più complessi
ma nel mio sketch ce qualcosa che mi sfugge e non capisco dove è l'errore.
Come interruttori uso due sensori magnetici effetto Hall NO con logica da alto a basso a sono applicati algli ingressi analogici A1 e A2 ed impostati con ingressi digitali.
L'A0 invece è utilizzato sempre come ingresso digitale e applicato direttamente allo switch neutral della moto.
Le funzioni base che arduino deve eseguire sono:
All'accensione del quadro strumenti della moto deve indicare la lettera N e questo lo esegue poiche il selettore delle marce è in posizione neutral .
Accesa la moto premo la frizione ed inserisco la 1ma marcia e qui nascono delle indecisioni di arduino che non capisco alcune volte per far indicare il nr 1 devo passare il magnete davanti al sensore Dwn 2 volte.
Continuo passandi il magnete sul sensore Up e arduino comincia a contare la sequenza 1,2,3,5,6.
non so per quale motivo salta il nr 4. Questo incoveniente lo ho risolto

Rimane il problema di :
Realizzato il circuito su B/B Il tutto sembra funziona correttamente, Accendo la Moto il selettore marce è su neutral e la lettera N viene visualizzata sul display.
L'unico inconvenniete lo riscontro quando dal Neutral devo passare alla 1ma marcia, quindi passo il magnete sul sensore DWN ma L'arduino non ne vuole sapere di indicare il nr 1 e rimane visualizzata la lettera N.
Se invece di passare il magnete sul sensore DWN lo passo sul sensore UP arduino indica il Nr 2 come se fosse stata inserita la 2nda marcia se prosego con le pigiate su UP arriva fino alla 6sta marcia.
Poi passo sul sensore DWN ed il conteggio arriva fino alla prima marcia, il nr 1 viene indicato sul dipslay.

qui di seguito ce lo sketch:

   // uso degli ing analogici come ing digitali 
// A0,A1,A2, siano definiti 14,15,16
// Contamarce, o meglio definito, indicatore di marcia inserita.
// Hardware utilizzato per test:
// Arduino UNO R3 made in cina
// Due finecorsa magnetici a tre poli (NO)
// display alphanumerico Rosso 16seg Kcom con Resistenza da 330
//
 // Sketch di base scritto da rikip98
// Adattato da  Lollo65
//


// definizione ingressi sensori
#define A2_giu 16 // pin interruttore di marcia giu
#define A1_su 15 // pin intterruttore di marcia su
#define A0_n 14 // pin segnale folle

//definizione pin display

int ledPinA =  2;    // LED connected to digital pin 2
int ledPinB =  3;    // LED connected to digital pin 3
int ledPinC =  4;    // LED connected to digital pin 4
int ledPinD =  5;    // LED connected to digital pin 5
int ledPinE =  6;    // LED connected to digital pin 6
int ledPinF =  7;    // LED connected to digital pin 7
int ledPinG =  8;    // LED connected to digital pin 8
int ledPinH =  9;    // LED connected to digital pin 9
int ledPinL =  10;   // LED connected to digital pin 10 

 
 
 int value = 0;
 int val_n = 0;
 int val_giu = 0;
 int old_val_giu = 0;
 int val_su = 0;
 int old_val_su = 0;
 int state = 0;
 int gear = 1;
 int datoeeprom = 0;





void setup() {

 pinMode(ledPinA, OUTPUT);
 pinMode(ledPinB, OUTPUT);
 pinMode(ledPinC, OUTPUT);
 pinMode(ledPinD, OUTPUT);
 pinMode(ledPinE, OUTPUT);
 pinMode(ledPinF, OUTPUT);
 pinMode(ledPinG, OUTPUT);
 pinMode(ledPinH, OUTPUT);
 pinMode(ledPinL, OUTPUT);

 pinMode(A1_su, INPUT);
 pinMode(A2_giu, INPUT);
 pinMode(A0_n, INPUT);

  // initialize serial communication:
 Serial.begin(9600);
}

void loop() {

 if ( value == 1) {
 numero_1;
 gear == 1;
 }
 if (value == 2){
  numero_2;
  gear == 2;
 }
 if (value == 3){
   numero_3;
   gear == 3;
 }
 if (value == 4){
   numero_4;
   gear == 4;
 }
 if (value == 5){
   numero_5;
   gear == 5;
 }
 if (value == 6){
   numero_6;
   gear == 6;
 }
   
 
 val_n = digitalRead (A0_n);
 if (val_n == LOW) {
   lettera_n();
  
  delay(0050);
  }

val_su = digitalRead(A1_su);
  if ((val_su == LOW) && (old_val_su == HIGH)) {
    gear += 1;
    setnum(gear);
   
    delay(100);
  }
old_val_su = val_su;
  
  val_giu = digitalRead(A2_giu);
  if ((val_giu == LOW) && (old_val_giu == HIGH)) {
    gear -= 1;
    setnum(gear);
   delay(100);
  }
  old_val_giu = val_giu; 
  
 if (gear >= 6) {
    gear = 6;
  }
  if (gear <= 1) {
    gear = 1;
  }

}
  
 void lettera_n(){
     digitalWrite(ledPinA, LOW);
     digitalWrite(ledPinB, HIGH);
     digitalWrite(ledPinC, HIGH);
     digitalWrite(ledPinD, LOW);
     digitalWrite(ledPinE, HIGH);
     digitalWrite(ledPinF, HIGH);
     digitalWrite(ledPinG, LOW);
     digitalWrite(ledPinH, HIGH);
     digitalWrite(ledPinL, HIGH);
}
void numero_1(){
     digitalWrite(ledPinA, LOW);
     digitalWrite(ledPinB, HIGH);
     digitalWrite(ledPinC, HIGH);
     digitalWrite(ledPinD, LOW);
     digitalWrite(ledPinE, LOW);
     digitalWrite(ledPinF, LOW);
     digitalWrite(ledPinG, LOW);
     digitalWrite(ledPinH, LOW);
     digitalWrite(ledPinL, LOW);
}
void numero_2(){
     digitalWrite(ledPinA, HIGH);
     digitalWrite(ledPinB, HIGH);
     digitalWrite(ledPinC, LOW);
     digitalWrite(ledPinD, HIGH);
     digitalWrite(ledPinE, HIGH);
     digitalWrite(ledPinF, LOW);
     digitalWrite(ledPinG, HIGH);
     digitalWrite(ledPinH, LOW);
     digitalWrite(ledPinL, LOW);
}
void numero_3(){
     digitalWrite(ledPinA, HIGH);
     digitalWrite(ledPinB, HIGH);
     digitalWrite(ledPinC, HIGH);
     digitalWrite(ledPinD, HIGH);
     digitalWrite(ledPinE, LOW);
     digitalWrite(ledPinF, LOW);
     digitalWrite(ledPinG, HIGH);
     digitalWrite(ledPinH, LOW);
     digitalWrite(ledPinL, LOW);
}
void numero_4(){
     digitalWrite(ledPinA, LOW);
     digitalWrite(ledPinB, HIGH);
     digitalWrite(ledPinC, HIGH);
     digitalWrite(ledPinD, LOW);
     digitalWrite(ledPinE, LOW);
     digitalWrite(ledPinF, HIGH);
     digitalWrite(ledPinG, HIGH);
     digitalWrite(ledPinH, LOW);
     digitalWrite(ledPinL, LOW);
}
void numero_5(){
     digitalWrite(ledPinA, HIGH);
     digitalWrite(ledPinB, LOW);
     digitalWrite(ledPinC, HIGH);
     digitalWrite(ledPinD, HIGH);
     digitalWrite(ledPinE, LOW);
     digitalWrite(ledPinF, HIGH);
     digitalWrite(ledPinG, HIGH);
     digitalWrite(ledPinH, LOW);
     digitalWrite(ledPinL, LOW);
}
void numero_6(){
     digitalWrite(ledPinA, HIGH);
     digitalWrite(ledPinB, LOW);
     digitalWrite(ledPinC, HIGH);
     digitalWrite(ledPinD, HIGH);
     digitalWrite(ledPinE, HIGH);
     digitalWrite(ledPinF, HIGH);
     digitalWrite(ledPinG, HIGH);
     digitalWrite(ledPinH, LOW);
     digitalWrite(ledPinL, LOW);
}
void setnum (int number){
 switch (number){
   case 1:
   numero_1();
   break;

   case 2:
   numero_2();
   break;

   case 3:
   numero_3();
   break;

   case 4:
   numero_4();
   break;

   case 5:
   numero_5();
   break;

   case 6:
   numero_6();
   break;

 }
}

potrei allegar un video ma le dimensioni in Mb non lo consentono.
Grazie a tutti coloro che vogliano aiutarmi o darmi indicazioni sul come risolvere il problemino.

Saluti a tutti Lorenzo

>LOLLO65: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Ciao e Buon giorno Gugliemo,
grazie per la reprimenda, essendo nuovo non ho ancora ben compreso come funziona si forum.
Però avendo visto che i precedenti post erano molto datati ho ipotizzato che aprendo un nuovo post avrei ottenuto assistenza.

Seguiro le tue istruzioni.
Nel frattempo un problemino lo ho risolto e cioè la mancata indicazione della 4rta marcia.

Grazie ancora

Buona domenica

LOLLO65:
Però avendo visto che i precedenti post erano molto datati ho ipotizzato che aprendo un nuovo post avrei ottenuto assistenza.

Scusa che c'entra? :o ... ovvio che dovevi aprire un nuovo thread per il tuo problema (oltretutto i vecchi thread NON vanno riaperti ... REGOLAMENTO, punto 16.9), il problema è nella presentazione del codice ... che devi mettere a posto come ti ho spiegato dettagliatamente. Grazie :slight_smile:

Guglielmo

Ciao Guglielmo,

non riuscivo a trovare l'icona </> pur avendola sotto il naso, poi guardando meglio le ho trovate.

Credo di aver fatto in maniera giusta ora.

Grazie ancora.

Saluti Lorenzo

:smiley: ... si, perfetto :wink:

Guglielmo

Qui a seguire c'è il codice che non ha senso, c'è stato un problema con copia e incolla?

if ( value == 1) {
 numero_1;
 gear == 1;
 }

gear == 1; non sortisce alcune effetto, come pure numero_1;

Per il primo posso intuire che basta togliere un = per fare in modo che alla variabile gear venga assegnato il valore 1, mentre per numero_1; non intuisco nulla.

Ciao.

Ciao Maurotec,

grazie per la info, in effetti lo sketch lo ho copiato da quello pubblicato da ripik98 e rivisitato da Camp78 qualche anno fà dove lui voleva memorizzare l'ultima marcia inserita.
Sketch a cui ho eliminato qualche funzione ma evidentemente ho lasciato qualche parte credendo fosse necessaria.

In effetti ho rivisto lo sketch ed eliminato quella parte che non ha senso ma che serviva a memorizzare l'ultima marcia inserita nello sketch di Camp78 ed ora sono giunto a questo:

// definizione ingressi sensori
 #define A2_giu 16 // pin interruttore di marcia giu
 #define A1_su 15 // pin intterruttore di marcia su
 #define A0_n 14 // pin segnale folle
 
 //definizione pin display

int ledPinA =  2;    // LED connected to digital pin 2
int ledPinB =  3;    // LED connected to digital pin 3
int ledPinC =  4;    // LED connected to digital pin 4
int ledPinD =  5;    // LED connected to digital pin 5
int ledPinE =  6;    // LED connected to digital pin 6
int ledPinF =  7;    // LED connected to digital pin 7
int ledPinG =  8;    // LED connected to digital pin 8
int ledPinH =  9;    // LED connected to digital pin 9
int ledPinL =  10;   // LED connected to digital pin 10 

  
  
  int value = 0;
  int val_n = 0;
  int val_giu = 0;
  int old_val_giu = 0;
  int val_su = 0;
  int old_val_su = 0;
  int state = 0;
  int gear = 1;
  

void setup() {

  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(ledPinC, OUTPUT);
  pinMode(ledPinD, OUTPUT);
  pinMode(ledPinE, OUTPUT);
  pinMode(ledPinF, OUTPUT);
  pinMode(ledPinG, OUTPUT);
  pinMode(ledPinH, OUTPUT);
  pinMode(ledPinL, OUTPUT);

  pinMode(A1_su, INPUT);
  pinMode(A2_giu, INPUT);
  pinMode(A0_n, INPUT);

   // initialize serial communication:
  Serial.begin(9600);
}

void loop() {

 val_n = digitalRead (A0_n);
  if (val_n == LOW);  { 
    lettera_n();
      delay(100);
   }
  

 val_su = digitalRead(A1_su);
   if ((val_su == LOW) && (old_val_su == HIGH)) {
     gear += 1;
     setnum(gear);
     delay(50);
   }
 old_val_su = val_su;
   
   val_giu = digitalRead(A2_giu);
   if ((val_giu == LOW) && (old_val_giu == HIGH)) {
     gear -= 1;
     setnum(gear);
    delay(50);
   }
   old_val_giu = val_giu; 
   
  if (gear >= 6) {
     gear = 6;
   }
   if (gear <= 1) {
     gear = 1;
   }

}
   
  void lettera_n(){
      digitalWrite(ledPinA, LOW);
      digitalWrite(ledPinB, HIGH);
      digitalWrite(ledPinC, HIGH);
      digitalWrite(ledPinD, LOW);
      digitalWrite(ledPinE, HIGH);
      digitalWrite(ledPinF, HIGH);
      digitalWrite(ledPinG, LOW);
      digitalWrite(ledPinH, HIGH);
      digitalWrite(ledPinL, HIGH);
}
void numero_1(){
      digitalWrite(ledPinA, LOW);
      digitalWrite(ledPinB, HIGH);
      digitalWrite(ledPinC, HIGH);
      digitalWrite(ledPinD, LOW);
      digitalWrite(ledPinE, LOW);
      digitalWrite(ledPinF, LOW);
      digitalWrite(ledPinG, LOW);
      digitalWrite(ledPinH, LOW);
      digitalWrite(ledPinL, LOW);
}
void numero_2(){
      digitalWrite(ledPinA, HIGH);
      digitalWrite(ledPinB, HIGH);
      digitalWrite(ledPinC, LOW);
      digitalWrite(ledPinD, HIGH);
      digitalWrite(ledPinE, HIGH);
      digitalWrite(ledPinF, LOW);
      digitalWrite(ledPinG, HIGH);
      digitalWrite(ledPinH, LOW);
      digitalWrite(ledPinL, LOW);
}
void numero_3(){
      digitalWrite(ledPinA, HIGH);
      digitalWrite(ledPinB, HIGH);
      digitalWrite(ledPinC, HIGH);
      digitalWrite(ledPinD, HIGH);
      digitalWrite(ledPinE, LOW);
      digitalWrite(ledPinF, LOW);
      digitalWrite(ledPinG, HIGH);
      digitalWrite(ledPinH, LOW);
      digitalWrite(ledPinL, LOW);
}
void numero_4(){
      digitalWrite(ledPinA, LOW);
      digitalWrite(ledPinB, HIGH);
      digitalWrite(ledPinC, HIGH);
      digitalWrite(ledPinD, LOW);
      digitalWrite(ledPinE, LOW);
      digitalWrite(ledPinF, HIGH);
      digitalWrite(ledPinG, HIGH);
      digitalWrite(ledPinH, LOW);
      digitalWrite(ledPinL, LOW);
}
void numero_5(){
      digitalWrite(ledPinA, HIGH);
      digitalWrite(ledPinB, LOW);
      digitalWrite(ledPinC, HIGH);
      digitalWrite(ledPinD, HIGH);
      digitalWrite(ledPinE, LOW);
      digitalWrite(ledPinF, HIGH);
      digitalWrite(ledPinG, HIGH);
      digitalWrite(ledPinH, LOW);
      digitalWrite(ledPinL, LOW);
}
void numero_6(){
      digitalWrite(ledPinA, HIGH);
      digitalWrite(ledPinB, LOW);
      digitalWrite(ledPinC, HIGH);
      digitalWrite(ledPinD, HIGH);
      digitalWrite(ledPinE, HIGH);
      digitalWrite(ledPinF, HIGH);
      digitalWrite(ledPinG, HIGH);
      digitalWrite(ledPinH, LOW);
      digitalWrite(ledPinL, LOW);
}
void setnum (int number){
  switch (number){

    case 1:
    numero_1();
    break;

    case 2:
    numero_2();
    break;

    case 3:
    numero_3();
    break;

    case 4:
    numero_4();
    break;

    case 5:
    numero_5();
    break;

    case 6:
    numero_6();
    break;

  }
}

Permane la situazione di indizazione della lettera N quando si innesta la 1ma marcia, mentre se effettuo il passaggio da neutral alla 2nda marcia viene indicato il nr 2 e poi se innesto la 1ma marcia viene indicato il nr 1 sul display.

Che cosa sono H e L? Vengono sempre pilotati in parallelo...

Forse questa è la soluzione (gli else):

void loop()
{
val_n=digitalRead (A0_n);
val_su=digitalRead(A1_su);
val_giu=digitalRead(A2_giu);

if (val_n==LOW)
  {
  lettera_n(); delay(100);
  }
else if (val_su==LOW && old_val_su==HIGH)
  {
  gear+=1;
  setnum(gear);
  old_val_su=val_su;
  delay(50);
  }
else if (val_giu==LOW && old_val_giu==HIGH)
  {
  gear-=1;
  setnum(gear);
  old_val_giu=val_giu;
  delay(50);
  }
   
if (gear>6) {gear=6;}
if (gear<1) {gear=1;}
} // FINE loop()

Inoltre, se non ti serve la seriale (o usi softwareSerial) puoi collegare i segmenti agli I/O 0...7 e pilotarli in blocco, con una incredibile semplificazione e accelerazione, soprattutto se H e L vanno sempre pilotati insieme.

Ciao Datam,

Grazie per il suggerimento, al momento non posso verificarlo ma appena rientro in Italia, tra 10gg, testerò gli else, ci avevo pensato ad usarli ma non mi funzionavano, ottenevo errore alla verifica dello sketch, probabile avevo scritto male la funzione logica.

H e L definiscono due led e servono per pilotare un display 16seg.
Con La mia idea riesco a fargli indicare la lettera N (neutral) quando il selettrore marce della moto è in neutral.
Si in effetti H e L vengono utilizzati solo per lalettera N. Pilotarli insieme mi porterebbe al risparmio di una uscita digitale e ridurre il consumo di corrente.
Risparmiando una uscita mi porterebbe ad usare solo i pin digitali e non più gli ingressi analogici, cio significa modificare lo sketch attentamente.

Ho allegato 1 foto per rendere l'idea

Grazie ancora per l'aiuto

Lorenzo

Bel display! :slight_smile: Dove l'hai trovato?...

I due segmenti puoi metterli in serie, diminuendo la resistenza in serie. Per i segmenti singoli hai usato 330 Ohm, quindi (5-1,6)/330= 10mA; con due in serie: (5-3,2)/10mA=180 Ohm. Dato che il display mi sembra molto luminoso, potresti anche usare resistenze un po' più alte per ridurre la corrente, dato che il limite massimo per la somma di tutte le uscite dell'atmega328p è 90mA.
Usando solo 8 uscite e usando gli I/O da 0 a 7, usi solo la porta D e puoi fare port manipulation (cerca con Google): con una sola istruzione imposti gli 8 bit della porta :slight_smile:

Tutto si ridurrebbe a questo:

// definizione ingressi sensori
#define mar_giu A2 // pin interruttore di marcia giu
#define mar_su A1 // pin interruttore di marcia su
#define mar_n A0 // pin segnale folle
 
int value = 0;
int val_n = 0;
int val_giu = 0;
int old_val_giu = 0;
int val_su = 0;
int old_val_su = 0;
int state = 0;
int gear = 1;
 

void setup()
{
for(byte x=0; x<8; x++)
  {pinMode (x, OUTPUT);}
// Oppure, più semplicemente, senza il for: DDRD=0b11111111;
}


void loop()
{
val_n=digitalRead (mar_n);
val_su=digitalRead(mar_su);
val_giu=digitalRead(mar_giu);

if (val_n==LOW)
  {
  PORTD=0b01101101;
  }
else if (val_su==LOW && old_val_su==HIGH)
  {
  gear+=1;
  setnum(gear);
  old_val_su=val_su;
  }
else if (val_giu==LOW && old_val_giu==HIGH)
  {
  gear-=1;
  setnum(gear);
  old_val_giu=val_giu;
  }
   
if (gear>6) {gear=6;}
if (gear<1) {gear=1;}
} // FINE loop()

void setnum(int marcia)
{
switch(marcia)
  {
  case 1:
  PORTD=0b01100000;
  break;
  
  case 2:
  PORTD=0b11011010;
  break;
    
  case 3:
  PORTD=0b11110010;
  break;
  
  case 4:
  PORTD=0b01100110;
  break;
  
  case 5:
  PORTD=0b10110110;
  break;
  
  case 6:
  PORTD=0b10111110;
  break;
  }
} // FINE setnum

Studialo bene :slight_smile:
Ciao

Ariciao Datam, anche io sono di Roma, se ce apportunità potremmo incontrarci e scambiare qualche idea,

cmq ho provato la tua soluzione degli else, solo nello sketch per il momento, però mi viene restuito questo errore:

Contatore_MARCE_suggerimento_DATAM\Contatore_MARCE_suggerimento_DATAM.ino: In function 'void loop()':

Contatore_MARCE_suggerimento_DATAM:73:1: error: 'else' without a previous 'if'

 else if (val_su==LOW && old_val_su==HIGH)

 ^~~~

exit status 1
'else' without a previous 'if' [code]

Il Diplay lo ho acquistato sul sito Aliexpress, ne vendevano 5 per un prezzo irrisorio, me ne avanzano 3 al momento.

Sì, hai ragione: mi è sfuggito un punto e virgola dopo l'if precedente! Me ne sono accorto provando il programma che ho pubblicato dopo e lì lo avevo corretto.

Gianluca,
verificando il tuo secondo sufìggerimento sembra funzionare correttamente, non mi viene restituito nessun errore.

Confrontando poi il primo suggerimento con il secondo noto che il Void loop è pressocchè uguale però.
Non capisco perche nel primo suggerimento viene restituito l'errore.

Per ora Buona serata, domani ci perderò dell'altro tempo.

ciao Lorenzo

Poco fa ho corretto anche lì: ricarica la pagina e riprovalo!

Ciao Gianluca,

ho confrontato il tuo primo sketch con il secondo ancora una volta, non ho visto differenze, forse perche li hai corretti.
ora ora funzionano entrambi alla verifica dello sketch.

Mi è sfuggito in che punto mancava il ;.
Quello che ho fatto sullo sketch che riportava errore è di aggiustare la spaziatura nelle funzioni rendendola uguale al secondo suggerimento.

Per quanto riguarda poter pilotare il led H e L in serie credo proprio non sia possibile poiche il dispaly è un Katodo comune quindi non mi da la possibilita di collegare 2 led in serie. Però come detto in precedenta posso pilotarli utilizzando un solo pin come avviene per i segmenti A,D,G.

Per limitare lerogazione di corrente posso aumentare il valore delle R a 470 per il singolo led e a 130 per i doppi led in modo limitare la corrente ad un totale di 63-65ma alla sua massima dissipazione con il nr 6
oppure usare dei Transistor per pilotare il display riducendo moltissinmo la corrente erogata dal 328P.

Forse questa ultima soluzione è la piu idonea perchè il display ha 16segmenti e ciò coporta per il segmento A,D,G accendere un doppio led. quindi per questi tre segmenti l'erogazione sarà di 14mA x 3 =42mA e i restanti 3 led l'erogazione sarà 7 x3 =21mA per un totale di 63mA circa.

Altra soluzione utilizzare un display alphanumenrico 14Seg.

Farò dei test con i led per trovare l'esatto valore di Resistenze da applicare ed ottenere la stessa illuminazione su tutti led.

Leggendo le specifiche dell ATMega328 ogni uscita digitale dovrebbe supportare un max di 40mA

Grazie ancora per i tuoi suggerimenti, ti faro sapere i risultati quando testero tutto il circuito.

Mi è sfuggito in che punto mancava il ;

Non mancava: c'era un ; subito dopo un if(), che lo rendeva inefficace (e in questo sono recidivo! :slight_smile: ). Mi sa che avevo scritto:
if (val_n==LOW);
{
...