Creare una funzione, come?

Sto cercando di implementare in uno scketch e quindi capire come funzionano le funzioni. Ho letto parecchio ma proprio non riesco a capire come inserirne una in uno sketch che ho sviluppato e che funziona perfettamente, questo:

#define PJON_INCLUDE_SWBB
#include <PJON.h>
#include <Ethernet.h>
#include <SPI.h>
#include "Metro.h"

PJON<SoftwareBitBang> bus(1); //<Strategy name> bus(ID dispositivo)
Metro pollingMetro = Metro(2000); //intervallo tra le letture

float watt = 12121; //valore lettura
String prefix = "C"; //prefisso per identificazione dispositivo  C = consumo
void setup() {
  bus.strategy.set_pin(9); //pin connessione del bus di trasmissione
  bus.begin();
  Serial.begin(9600);  
}

void loop(){
 bus.update();

 if(pollingMetro.check() == 1){
  String readWatt= String(watt,0);//crea una stringa da un valore float con 0 posti decimali
  String stringTmp = String(prefix + readWatt); //prepara la stringa con prefisso  + lettura
  int lun = stringTmp.length(); //salva nella variabile la lunghezza della stringa appena creata
  char stringBuf[lun]; //crea un array di char con lunghezza <lun>
  stringTmp.toCharArray(stringBuf, lun+1); //converte la stringa in array di char con lunghezza <lun> +1 (carattere fine riga) 
  bus.send(3, stringBuf, lun); //invia l'array di char al dispositivo con ID 3 con lunghezza <lun>
 
 // debug dati in trasmissione
 Serial.print("Dati trasmessi: ");
 for(int i=0; i<lun; i++){
  Serial.print(stringBuf[i]);
 }
  Serial.println(); 
 } 
}

Mi piacerebbe creare una funzione dalla sezione finale di codice, quella dopo il commento //debug dati in trasmissione.

Ho provato in molto modi ma o mi esce errore in fase di copilazione oppure se senza errori, sulla seriale non appare nulla. Chi mi illumina?
Grazie mille.

Ciao Franchelli,

non ho capito se a te interessa creare una tua funzione, ed utilizzarla nel setup/loop o se non riesci ad utilizzare, nel senso che non ti ritornano quello che credi, quelle già presenti nel loop dello sketch che hai allegato?

Mi sono spiegato male:

vorrei creare una mia funzione per poterla richiamare dal loop.

... credo che il motivo per cui non ti funziona è perché NON tieni conto che le variabili dichiarate localmente sono visibili SOLO all'interno di dove le hai dichiarate e NON in altre parti del programma. Prova a pensarci e vedere quello che vorresti fare :wink:

Guglielmo

Le variabili interessate sono int lun ed char stringBuf[] e ho già provato a renderle globali (fuori da setup e loop) ma nonostante tutto ho i problemi elencati.

Metti la funzione che hai scritto e riporta gli errori che ti da il compilatore.

Guglielmo

Ho fatto molti tentativi e siccome è la prima volta che affronto la creazione di funzioni che non siano semplici void non ho chiarissimo come strutturare la cosa. Magari qualche suggerimento sul come strutturarle sarebbe utile per risolvere da solo il problema. Ti ringrazio

Beh ... almeno metti il "contenuto" della funzione (... ovvero cosa vorresti che facesse quando è chiamata), che parametri ti aspetti di passargli e cosa ti aspetti essa ti ritorni ... altrimenti posso solo scriverti :

tipo_valore_ritorno  nome_funzione(tipo_p1, tipo_p2, tipo_p3, ....) {
  ...
  istruzioni da eseguire
  ...
}

Guglielmo

ciao...quando crei una funzione come prima cosa devi "dichiarare" cosa (tipo) ritornerà la funzione stessa:

void = niente
int = un valore tipo int
float = un valore tipo float
etc...

questo perchè se crei una funzione tipo void (chiamiamola myFunction) e fai tipo:

int a;

a = myFunction()

Ti darà errore su associazione variabile tipo int con funzione void che non torna nulla.

Poi alle funzioni puoi "passare" degli argomenti che verranno elaborati all'interno di essa:

void myFunction(int a, char b){
fare qualche cosa con a e b
la funzione non ritorna valori
}

poi quando richiami la funzione farai così:

int variabile = 50;
char lettera = 'C';

myFunction(variabile, lettera)

questa, con i due parametri passati, farà quello che gli dici di fare.

se necessiti di avere un dato ritornato dalla funzione la funzione deve NON essere void:

int myFunction(char a){

int returnedVar;

returnedVar = (int)a;

return returnedVar;

}

e poi richiamerai la funzione così:

int castLetter;
char letter = 'D';

castLetter = myFunction(letter);

Attenzione che le variabili passate come argomento in una funzione NON si modificano all'esterno ma vengono solo considerate per il "valore" che hanno in quel momento...almeno che nella funzione stessa vengano usate le variabili Globali stesse..facendo così la funzione si riferirà solamente a quelle variabili e perderà di flessibilità; diversamente devi utilizzare i puntatori...(argomento complicatino).

Ovviamente le tue funzioni vanno create fuori dalle due funzioni di base SETUP e LOOP.

Spero di NON aver sparato boiate...spero di non averti confuso ulteriormente le idee.

Sei stato assolutamente chiaro, caspita...

Per rispondere anche a Guglielmo:

vorrei creare una funzione da questo blocco di codice

 // debug dati in trasmissione
 Serial.print("Dati trasmessi: ");
 for(int i=0; i<lun; i++){
  Serial.print(stringBuf[i]);
 }
  Serial.println();
 }

in questo blocco trovo due variabili int lun ed charstringBuf[] e quindi la funzione potrebbe essere cosi ?

Se va bene poi proseguiamo.

void stampa(int lun, char stringBuf[]){
  Serial.print("Dati trasmessi: ");
  for(int i=0; i<lun; i++){
   Serial.print(stringBuf[i]);
  }
  Serial.println();
 }

Si, anche se si potrebbe scrivere in un altro modo, evitaimo al momento di parlare di puntatori e diciamo che va bene così ... quindi ?

Guglielmo

Come detto da Guglielmo...così può andare bene...

la funzione la devi chiamare nel loop così;

void loop{

int lenght = 4;
char charArray[]={'a','b','c','d'};

stampa(lenght, charArray);

}

Grazie Orso e Guglielmo, ho provato con i vostri suggerimenti e finalmente ora il tutto funziona ( e soprattutto ho capito un po' meglio le funzioni).
A buon rendere.