forma elegante per sketch

Salve a tutti, ho adattato questo codice per accendere due led in base alla pressione di quattro pulsanti.

int tempo = 400;
int pinLed = 7;
int pinLed1 = 8;
int buttonPin2 = 2;
int buttonPin3 = 3;
int buttonPin4 = 4;
int buttonPin5 = 5;

void setup() {
  pinMode(pinLed, OUTPUT);
  pinMode(pinLed1, OUTPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
}
void loop() {

led25();
led50();
led75();
led100();
}

void led25()
{
if(digitalRead(buttonPin2)==HIGH)
{
  for(int i=0; i<5; i++) {
    
     digitalWrite(pinLed, HIGH);
     delay(tempo);
     digitalWrite(pinLed, LOW);
     delay(tempo);
   }  
  delay (500);
 {
  for(int i=0; i<3; i++) {
     digitalWrite(pinLed1, HIGH);
     delay(tempo);
     digitalWrite(pinLed1, LOW);
     delay(tempo);
     }
    } 
  }
 }
void led50()
{
if(digitalRead(buttonPin3)==HIGH)
{
  for(int i=0; i<5; i++) {
    
     digitalWrite(pinLed, HIGH);
     delay(tempo);
     digitalWrite(pinLed, LOW);
     delay(tempo);
   }  
  delay (500);
 {
  for(int i=0; i<2; i++) {
     digitalWrite(pinLed1, HIGH);
     delay(tempo);
     digitalWrite(pinLed1, LOW);
     delay(tempo);
     }
    } 
  }
 }
 void led75()
{
if(digitalRead(buttonPin4)==HIGH)
{
  for(int i=0; i<5; i++) {
    
     digitalWrite(pinLed, HIGH);
     delay(tempo);
     digitalWrite(pinLed, LOW);
     delay(tempo);
   }  
  delay (500);
 {
  for(int i=0; i<1; i++) {
     digitalWrite(pinLed1, HIGH);
     delay(tempo);
     digitalWrite(pinLed1, LOW);
     delay(tempo);
     }
    } 
  }
 }

void led100()
{
if(digitalRead(buttonPin5)==HIGH)
{
  for(int i=0; i<5; i++) {
    
     digitalWrite(pinLed, HIGH);
     delay(tempo);
     digitalWrite(pinLed, LOW);
     delay(tempo);
   }  
  delay (500);
 
  }
 }

Vorrei sapere se posso scrivere in maniera più elegante questo sketch.
Grazie per l'aiuto
Fabio

Potere si può sempre. Ma perché dovresti? Se funziona é sufficiente.
Comunque ottima idea le funzioni, ma usate così temo che non siano molto utili.
Comincia a unirle in loop e poi si vede

Le funzioni le ho utilizzate per poi richiamarle in un lavoro più complesso:
ciò che chiedevo è proprio quello di semplificare il codice relativo ai diversi casi:25-50-75-100.

Se hai qualche idea.....

Fabio

Cosa cambia tra le varie funzioni? Non riesco a capirlo (dico tranne il controllonsu un tasto diverso)

Il "lavoro" che fanno le varie funzioni può essere svolto da un unica funzione con parametri.

Hai una prima ripetizione, una seconda ripetizione e in una funzione un unica ripetizione.

puoi farti una funzione che usa parametri in questo modo

void led(byte led, byte pulsante, byte primaRipetizione, byte secondaRipetizione){

}

e in caso del led che fa un unica ripetizione lo richiameresti in questo modo

led(mioled, miopulsante, 5, 0);

See tu descrivi cosa fanno le varie funzioni, poi si può capire come parametrizzarlo

Se parliamo di eleganza...
Pinled e buttonpin ... meglio tutti pinXxx direi
Poi essendo fissi, const byte invece di int
Poi in IDE usa CTRL+T che indenta meglio il codice

Scusa, tu i sei simpatico e ti ho aiutato anche di recente, con quel trasmettitore di Ph e Redox
ma ho una domanda
tu pasticci con arduino dal 2011 e già allora hai fatto una cosa come questa

void blink (int times)
{
for (int cnt=times; cnt>0; cnt--)
{
   digitalWrite(ledPIN, HIGH);   // set the LED on
   delay(200);
   digitalWrite(ledPIN, LOW);    // set the LED off
   delay(200);
}
}

i tag code te li ho messi io, che tu te li sei dimenticati da allora
dicevo, hai scritto questo 7 anni fa e adesso non sei nemmeno capace di andare a ripescartelo?

Silente:
Cosa cambia tra le varie funzioni? Non riesco a capirlo (dico tranne il controllonsu un tasto diverso)

effettivamente non cambia niente tranne il numero dei lampeggi del secondo led e il pulsante che premo.

torn24:
Il "lavoro" che fanno le varie funzioni può essere svolto da un unica funzione con parametri.

Hai una prima ripetizione, una seconda ripetizione e in una funzione un unica ripetizione.

puoi farti una funzione che usa parametri in questo modo

void led(byte led, byte pulsante, byte primaRipetizione, byte secondaRipetizione){

}

e in caso del led che fa un unica ripetizione lo richiameresti in questo modo

led(mioled, miopulsante, 5, 0);

mi sembra una buona idea....

nid69ita:
Se parliamo di eleganza...
Pinled e buttonpin ... meglio tutti pinXxx direi
Poi essendo fissi, const byte invece di int
Poi in IDE usa CTRL+T che indenta meglio il codice

Grazie per il consiglio

Standardoil:
Scusa, tu i sei simpatico e ti ho aiutato anche di recente, con quel trasmettitore di Ph e Redox
ma ho una domanda
tu pasticci con arduino dal 2011 e già allora hai fatto una cosa come questa

void blink (int times)

{
for (int cnt=times; cnt>0; cnt--)
{
  digitalWrite(ledPIN, HIGH);  // set the LED on
  delay(200);
  digitalWrite(ledPIN, LOW);    // set the LED off
  delay(200);
}
}



i tag code te li ho messi io, che tu te li sei dimenticati da allora
dicevo, hai scritto questo 7 anni fa e adesso non sei nemmeno capace di andare a ripescartelo?

Scusami ma mi ero proprio dimenticato di questo post: grazie per il tuo aiuto, pian piano sto aggiungendo funzioni a quel progetto di controllo ph e redox che spero presto di condividere....

Se mi permettete, espongo il mio obiettivo.

Ho una pompa dosatrice regolabile con due pulsanti "+" e "-" (quattro stadi): 25-50-75-100%.

A seconda di un evento (nel mio codice di test un pulsante, ma potrebbe essere anche una soglia), dovrei regolare la velocità della pompa.
Ho pensato di gestire così:

non sapendo a che punto sia la regolazione, mando al massimo la pompa inviando cinque impulsi (i miei cinque lampeggi) su un relè collegato al pulsante"+" e poi ci sarebbero le quattro condizioni;

25% 3 impulsi sul relè collegato al pulsante "-";
50% 2 impulsi sul relè collegato al pulsante "-";
75% 1 impulsi sul relè collegato al pulsante "-";
100% 0 impulsi sul relè collegato al pulsante "-";

in questo modo sono sicuro che la percentuale sarà corrispondente a ciò che voglio......

Spero di aver esposto correttamente ciò che Arduino dovrà fare e spero che abbia scelto la logica giusta per farlo.

Grazie per esserti simpatico Standaroil :smiley:

scritta qui

void premi (int times, int uscita)
{
for (int cnt=times; cnt>0; cnt--)
{
   digitalWrite(uscita, HIGH);   // set the LED on
   delay(200);
   digitalWrite(uscita, LOW);    // set the LED off
   delay(200);
}
delay(500);

}

questa serve per premere N volte i tasti che ti servono, collegati al relè collegato sul pin di numero pin

adesso quando serve tu chiami per una volta la funzione con 5 impulsi al piu'
premi(5, pindelpiu);
e poi premi quello che ti serve, ad esempio 3 volte
premi(3,pindemeno);
oppure 27 volte (OK OK scherzo)
premi(27,pindelmeno);

int times = 0;
int pinpiu = 7;
int pinmeno = 8;
int buttonPin2 = 2;
int buttonPin3 = 3;
int buttonPin4 = 4;
int buttonPin5 = 5;

void setup() {
  pinMode(pinpiu, OUTPUT);
  pinMode(pinmeno, OUTPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
}
void loop() {
  if (digitalRead(buttonPin2) == HIGH)
  {
    premi(5, pinpiu);
    premi(3, pinmeno);
  }
  if (digitalRead(buttonPin3) == HIGH)
  {
    premi(5, pinpiu);
    premi(2, pinmeno);
  }
  if (digitalRead(buttonPin4) == HIGH)
  {
    premi(5, pinpiu);
    premi(1, pinmeno);
  }
  if (digitalRead(buttonPin5) == HIGH)
  {
    premi(5, pinpiu);

  }

}


void premi (int times, int uscita)
{
  for (int cnt = times; cnt > 0; cnt--)
  {
    digitalWrite(uscita, HIGH);   // set the LED on
    delay(300);
    digitalWrite(uscita, LOW);    // set the LED off
    delay(300);
  }
}

Ecco qui il codice adattato e funzionante, magari a qualcuno potrà far comodo così com'è.
Penso che più di così non si possa ridurre.

Grazie ancora Standardoil per il tuo aiuto.
Unica cosa che non mi è ancora chiara è la differenza tra:

for(int i=0; i<5; i++)

e

for (int cnt = times; cnt > 0; cnt--)

fafidio:
Penso che più di così non si possa ridurre.

E come no? Nel loop c'è ancora diverso codice ripetuto, che differisce per solo uno o due valori, anche quello può diventare una funzione unica.

Il loop ad esempio potrebbe diventare:

void loop() {
    esegui(buttonPin2, 3);
    esegui(buttonPin3, 2);
    esegui(buttonPin4, 1);
    esegui(buttonPin5, 0);
}

fafidio:
Grazie ancora Standardoil per il tuo aiuto.
Unica cosa che non mi è ancora chiara è la differenza tra:

for(int i=0; i<5; i++)

e

for (int cnt = times; cnt > 0; cnt--)

fondamentalmente solo stile e preferenze personali, io di solito faccio rovescio
ma per questo io ho solo copiato dal tuo, cambiato il minimo, nemmeno ho toccato i commenti

[

Ecco qui il codice adattato e funzionante, magari a qualcuno potrà far comodo così com'è.
Penso che più di così non si possa ridurre.
[/quote]
grosso modo ci siamo
la tua versione compila in 1326 byte di programma e nove di variabili
questa, ridotta all'osso come tipi di variabili e usando cicli per ridurre gli statement

byte pinpiu = 7;
byte pinmeno = 8;
#define MASSIMO 5
#define MAXBOTTONI 4
byte bottoni[MAXBOTTONI] = {2, 3, 4, 5};

void setup()
{
    pinMode(pinpiu, OUTPUT);
    pinMode(pinmeno, OUTPUT);

    for (byte i = 0; i < MAXBOTTONI; i++)
    {
        pinMode(bottoni[i], INPUT);
    }
}
void loop()
{
    for (byte i = 0; i < MAXBOTTONI; i++)
    {
        if (digitalRead(bottoni[i]))
        {
            premi(MASSIMO, pinpiu);
            premi(3 - i, pinmeno);
            break;
        }
    }
}
void premi(byte times, byte uscita)
{
    for (byte cnt = times; cnt > 0; cnt--)
    {
        digitalWrite(uscita, HIGH);   // set the LED on
        delay(300);
        digitalWrite(uscita, LOW);    // set the LED off
        delay(300);
    }
}

compila in 1240 byte, credo che meno di cosi' in C con lo IDE di arduino, senza chiamare santo assemblatore non sia possibile
stranamente però usa 13 byte di variabili, pur avendo passato tutto il passabile da int a byte e dichiarando una variabile in meno
forse lo spazio per il puntatore all'array?
non so, qui ci vuole uno più esperto di me

fafidio:
...
Vorrei sapere se posso scrivere in maniera più elegante questo sketch.
...

... potresti scriverlo usando il font "Calligraphique" ... :smiley:

scusa, ma proprio non ho resistito :wink: ... scherzi a parte, ma piu che "elegante", non sarebbe invece meglio "efficente", parlando di un programma ? ...

dal mio punto di vista in programmazione elegante ed efficente sono sinonimi