Costruzione funzione

Ho cercato parecchio ma non ho trovato una soluzione:

#define inA 4 
#define outA 8
int lastBs = HIGH;

void setup(){
	pinMode(inA, INPUT_PULLUP);
	pinMode(outA,OUTPUT);
 	Serial.begin(9600);
}

void loop(){



  // invio comandi
  int lettura = digitalRead(inA);                    // leggo lo stato dell' ingresso
 	if (lettura == HIGH && lastBs == LOW){       // se è alto 
 		Serial.print('>');		     // delimitatore per comando
		Serial.print('a');		     // invio segnale OFF                             
		lastBs=lettura	
	}
	if(lettura == LOW && lastBs == HIGH){        // se basso
		Serial.print('>');		   // delimitatore per comando
		Serial.print('A');                  // invio segnale ON
		lastBs=lettura;
	}
	delay(50); 
}

Questo è uno spezzone di uno sketch più articolato e per snellirlo vorrei realizzare una funzione esterna da richiamare quando serve.
La funzione dovrebbe contenere il pezzo di codice indicato dopo la notazione // invio comandi
solo che non avendo capito bene le funzioni non riesco a sviluppare.
Chi mi da una mano, per favore, a capire come risolvere questo problema e più in generale come creare una funzione ?
Grazie

Hai letto il reference ? E' spiegato veramente bene.

Dal codice che hai scritto, ti serve una void.
void Mia_funzione(){
istruzione;
}

Nel loop la richiami con
Mia_funzione();

Franchelli:
Chi mi da una mano, per favore, a capire come risolvere questo problema e più in generale come creare una funzione ?

Semplicemente dichiarando la nuova funzione e poi la chiami dalla loop, guarda come ho modificato il tuo codice di esempio.

#define inA 4 
#define outA 8
int lastBs = HIGH;

void setup(){
	pinMode(inA, INPUT_PULLUP);
	pinMode(outA,OUTPUT);
 	Serial.begin(9600);
}

void loop(){



  // invio comandi
  miafunzione(); 

	delay(50); 
}


void miafunzione(void)
{
 
        int lettura = digitalRead(inA);                    // leggo lo stato dell' ingresso
 	if (lettura == HIGH && lastBs == LOW){       // se è alto 
 		Serial.print('>');		     // delimitatore per comando
		Serial.print('a');		     // invio segnale OFF                             
		lastBs=lettura	
	}
	if(lettura == LOW && lastBs == HIGH){        // se basso
		Serial.print('>');		   // delimitatore per comando
		Serial.print('A');                  // invio segnale ON
		lastBs=lettura;
	}
}

Brado:
Dal codice che hai scritto, ti serve una void.

Guarda che void (= nulla) non è una funzione, è solo una dichiarazione per dire che la funzione non ritorna nulla e/o non richiede dati in ingresso.
Se scrivo :

void pippo(void)
{
  // mio codice
}

Ho dichiarato una funzione con nome pippo che non richiede dati in ingresso e che non ritorna nessun dato quando termina.

Se scrivo:

byte pippo(byte a, byte b)
{
  byte dato;
  // mio codice
 return dato;
}

Ho dichiarato una funzione con nome pippo che richiede due unsigned char come dati e ritorna un unsigned char quando termina, l'uso è di questo tipo "byte dato = pippo(a,b,)".

La soluzione di astrobeed non funziona (non mi da errore quando carico ma non scrive nulla sulla seriale)

probabilmente non si può fare una funzione void in quanto la funzione dovrebbe leggere un pin digitale (inA) scrivere in una variabile (int lastBs) e scrivere su seriale due valori ...

Franchelli:
La soluzione di astrobeed non funziona (non mi da errore quando carico ma non scrive nulla sulla seriale)

Premesso che mi sono limitato a fare copia/incolla del tuo codice senza verificare se è corretto o meno, lo scopo era solo farti capire il concetto, comunque è corretto come ti ho detto io, se non scrive nulla sulla seriale è perché c'è qualcosa che non va bene nel tuo codice oppure non hai le corrette condizioni sugli input per ottenere il risultato desiderato.

Astrobeed... hai ragione, mi scuso c'era un falso contatto...
il tuo codice funziona.
Pertanto come teoria si puo dire che :

la funzione se non deve rendere nessun dato nel programma va richiamata così;

pippo();

quindi dopo l'ultima graffa del loop

devo dichiarare

void pippo(void){
tuttoquello
che
mi
pare
}

ho notato che funziona anche senza inserire il secondo void tra le parentesi e lasciandole semplicemente vuote. Confermate?

PS: grazie a tutti

Un buon libro di programmazione in linguaggio C risolverebbe questo ed altri dubbi.

Spesso i libri sono estremamente teorici e difficili da interpretare senza un'insegnante.
In fondo Arduino stesso si basa sull' idea dell' "apprendere per esempi e tentativi" e nonostante ciò sono concorde con te che un minimo di studio teorico ci debba essere (ed infatti nel mio caso c'è stato).

Infatti... dovresti studiare un po' di C.

Comunque ti confermo che il secondo void fra () puoi anche ometterlo.

astrobeed:
Guarda che void (= nulla) non è una funzione, è solo una dichiarazione per dire che la funzione non ritorna nulla e/o non richiede dati in ingresso.
Se scrivo :

void pippo(void)

{
  // mio codice
}




Ho dichiarato una funzione con nome pippo che non richiede dati in ingresso e che non ritorna nessun dato quando termina.

Appunto, era esattamente quello che avevo scritto io ... :wink:

Brado:
Appunto, era esattamente quello che avevo scritto io ... :wink:

No tu hai scritto:

Dal codice che hai scritto, ti serve una void.

Lasciando intendere che void è il nome generico per una funzione, cosa che purtroppo succede spesso nel mondo di Arduino, se si vogliono spiegare le cose tocca essere chiari, sopratutto con chi è alle prime armi e sa pochissimo di programmazione.

Lasciando intendere che void è il nome generico per una funzione, cosa che purtroppo succede spesso nel mondo di Arduino, se si vogliono spiegare le cose tocca essere chiari, sopratutto con chi è alle prime armi e sa pochissimo di programmazione.

Esatto.+1 :wink:

Anche un puntatore può essere void:

// generic pointer
void *ptrVoid;

Quindi non si può osare nemmeno in gergo informatico.

Ciao.

Franchelli:
Spesso i libri sono estremamente teorici e difficili da interpretare senza un'insegnante.

Eh sì, gli insegnanti uomini non sono la stessa cosa...

330R:
Eh sì, gli insegnanti uomini non sono la stessa cosa...

:stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

puoi seguire dei videocorsi su Youtube

Mi sembra carino quello di fcamuso Nuovo corso C++ ITA attualmente puntata 47 quindi hai una buona quantità di materiale...

paulus1969:
puoi seguire dei videocorsi su Youtube

In tutta franchezza questo è quanto valgono i vari corsi di programmazione su youtube, idem per la stragrande maggioranza dei libri, sono utili solo a chi li ha scritti e agli editori per fare soldi :grin:

astrobeed:
No tu hai scritto:

Lasciando intendere che void è il nome generico per una funzione, cosa che purtroppo succede spesso nel mondo di Arduino, se si vogliono spiegare le cose tocca essere chiari, sopratutto con chi è alle prime armi e sa pochissimo di programmazione.

Scusa astro, ma i post li leggi nella loro interezza?
Io ho scritto:

Brado:
Hai letto il reference ? E' spiegato veramente bene.

Dal codice che hai scritto, ti serve una void.
void Mia_funzione(){
istruzione;
}

Nel loop la richiami con
Mia_funzione();

Mi pare abbastanza chiaro ed esplicativo. Per quanto stringato possa essere, c'è l'esempio di dichiarazione della funzione che serviva in quel momento, ed il link all'approfondimento del reference.
Non mi pare ci sia nulla di errato e meno esplicativo del tuo post. 8)
Per comodità ho solo chiamato la funzione in modo gergale "void", in quanto non necessitava di return particolari, dando per sottinteso che stessimo parlando di funzioni, in quanto lo stesso Franchelli parlava di funzione.
Solo per chiarimento. :wink:

Il miglior corso di programmazione? L'esperienza sul campo, un buon reference sotto mano, e via. :wink:

Brado:
Per comodità ho solo chiamato la funzione in modo gergale "void",

Non esiste il modo gergale, esistono le corrette definizioni, forse ti sembrerò pedante su questa cosa però l'uso corretto di nomi, definizioni, unità di misura, etc è la base di ogni materia scientifica, trascurare questo aspetto può portare a risultati catastrofici come la sonda marziana Mars Climate Orbiter che andò distrutta per una confusione tra il sistema metrico e quello imperiale.

astrobeed:
... che andò distrutta per una confusione tra il sistema metrico e quello imperiale.

... dannati imperiali ... :stuck_out_tongue: :smiley: :smiley: :smiley: