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
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.
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).
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 ...
Brado:
Appunto, era esattamente quello che avevo scritto io ...
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
Anche un puntatore può essere void:
// generic pointer
void *ptrVoid;
Quindi non si può osare nemmeno in gergo informatico.
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
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.
Il miglior corso di programmazione? L'esperienza sul campo, un buon reference sotto mano, e via.
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.