Non riesco a capire alcune funzioni della programmazione di Arduino.

Ciao, ho un Arduino Uno e sto facendo un progetto in modo che un led si accende tramite due battiti di mano e per questo uso un sensore suono/voce. Ho visto in giro per la programmazione e ho trovato uno sketch che funziona alla perfezione solo che ovviamente lo voglio capire per far in modo che poi in futuro lo possa modificare e ci sono delle funzione che non riesco a capire e che cercando su internet non ho trovato nulla. Le funzioni sono le seguenti (ovviamente tutte le parole come toggleOutput o TOTAL_CLAPS_TO_DETECT sono variabili dichiarate all'inizio):
-int detectClaps(int numClaps);
di questo non riesco a capire il perché dopo aver dichiarato una variabile apro una parentesi e scrivo dentro un'altra variabile;
-int buffer[3];
di questo non riesco a capire cos'è il buffer. Cercando su internet ho capito che dentro questo buffer ci sono dei valori ma non ho capito bene a cosa serve. Al posto di scrivere buffer non potrei dichiarare semplicemente una variabile?;
-int clapState = detectClaps(TOTAL_CLAPS_TO_DETECT);
qui non riesco sempre a capire il perché mette quella variabile (dichiarata all'inizio) tra parentesi;
-toggleOutput = -1;
qui, invece, non riesco a capire cosa significa il "
";

  • loopIteration = (loopIteration+1)%SIZE;
    qui non riesco a capire a cosa serve la "%";
    -poi non riesco a capire la funzione "return" come ad esempio qui:
    return SensorValue;
  • e infine come ultima cosa non riesco a capire la differenza tra "const int" e "int";
    Queste sono le funzioni di Arduino che non riesco a comprendere e se c'è qualcuno che me le spieghi bene e dettagliatamente lo ringrazierei.
    Poi c'è un'ultima cosa. Il mio sensore suono/voce dispone di 4 pin di cui due servono per 5V e GND, un altro per il segnale A0 e l'ultimo (di cui nel mio progetto non ho utilizzato) chiamato DO. Chi mi sa dire a cosa serve quest'ultimo pin? Grazie in anticipo per coloro che mi sapranno rispondere a queste domande.

Ti do qualche spunto:

-int detectClaps(int numClaps);
di questo non riesco a capire il perché dopo aver dichiarato una variabile apro una parentesi e scrivo dentro un'altra variabile;

Non è una dichiarazione di variabile, bensì una di funzione. Quel che vedi tra parentesi sono gli argomenti passati alla funzione. Da qualche altra parte ci sarà la definizione della funzione che è simile, ma al posto del punto e virgola troverai un blocco di istruzioni racchiuso tra parentesi graffe che costituisce il corpo della funzione, ovvero ciò viene eseguito quando la funzione viene richiamata. Probabilmente hai già visto almeno altre due funzioni: setup() e loop(). Ti consiglio di cercare in giro informazioni sull'argomento perché sono una cosa piuttosto fondamentale :).

-int buffer[3];
di questo non riesco a capire cos'è il buffer. Cercando su internet ho capito che dentro questo buffer ci sono dei valori ma non ho capito bene a cosa serve. Al posto di scrivere buffer non potrei dichiarare semplicemente una variabile?;

Beh, è... un buffer ;D, ovvero uno spazio in memoria in cui salvare qualcosa, nella fattispecie questo può contenere 3 interi (è un array/vettore di 3 elementi).

-int clapState = detectClaps(TOTAL_CLAPS_TO_DETECT);
qui non riesco sempre a capire il perché mette quella variabile (dichiarata all'inizio) tra parentesi;

Questa è una chiamata alla funzione dichiarata al primo punto, quello tra parentesi è l'argomento che le viene passato.

-toggleOutput = -1;
qui, invece, non riesco a capire cosa significa il "
";

Questa è una notazione contratta per toggleOutput = toggleOutput * -1;. In sostanza serve ad invertire il segno di toggleOutput.

  • loopIteration = (loopIteration+1)%SIZE;
    qui non riesco a capire a cosa serve la "%";

È l'operatore modulo, serve a restituire il resto della divisione intera. In sostanza in quel caso serve a far sì che loopIteration rimanga nel range [0, SIZE).

-poi non riesco a capire la funzione "return" come ad esempio qui:
return SensorValue;

return non è una funzione, ma serve all'interno delle funzioni per passare al chiamante l'eventuale valore di ritorno. Studiando le funzioni ne capirai l'utilità.

  • e infine come ultima cosa non riesco a capire la differenza tra "const int" e "int";

Beh, const int definisce una costante, ovvero una variabile (intera in questo caso) che non potrà cambiare valore. Questa accortezza permette al programmatore di evitare di cambiare valori che non dovrebbe cambiare, e al compilatore di fare alcune ottimizzazioni. Un modo alternativo per definire costanti è l'utilizzo di #define.

@Marino98:

Prima di tutto, essendo il tuo primo post, ti chiedo cortesemnete di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi, prima di avvicinarsi a qualche cosa come Arduino, sarebbe bene, almeno i concetti base, studiarli! Ti suggerisco quindi di cominciare con le seguenti letture: QUESTO e puoi scaricarti QUESTO libro (... tranquillo, è un sito legale, purché per esclusivo uso PERSONALE). :slight_smile:

Guglielmo

@SukkoPera
Grazie mi hai tolto quasi tutti i miei dubbi tranne uno:
non ho capito bene ciò che si mette nelle parentesi tonde quando dichiaro una funzione. Alcune volte compare una funzione del genere:
int detectClaps(int numClaps) {};
oppure un'altra così:
Void initialize() {}
Qual è la differenza?

Questo è l'intero sketch:

boolean clapDetected();
int detectClaps(int numClaps);
int TOTAL_CLAPS_TO_DETECT = 2; 
int offset = 5;    
int CLAP_TIME=5000; 
int sensorValue = 0; 
int toggleOutput = 1;
int SIZE = 3;
int buffer[3];
int loopIteration = 0;
int average = 0;
int total = 0;
const int inPin0 = A0; 


int out = 7; // relè
int readyPin = 13; // Led del pin 13
int deactivated = 5; //Led RGB: rosso
int activated = 6; // Led RGB: verde

const int FINAL_DETECTED = 0, LOST_CONTINUITY = 1, CLAP_NOT_DETECTED = 2;

void setup() {
Serial.begin(9600);
pinMode(out, OUTPUT);
pinMode(readyPin, OUTPUT);
pinMode(activated, OUTPUT);
pinMode(deactivated, OUTPUT);
}

void loop() {
initialize();
runDetector();
}

void initialize()
{
loopIteration = 0; 
total = 0;
average =0;
digitalWrite(out, LOW);
for(int i = 0; i < SIZE; i++)
{
 readMic(); 
 buffer[i] = sensorValue;
 total = total + sensorValue;
 average = (total/(i+1));
 delay(50);
}
digitalWrite(readyPin, HIGH);
}

void runDetector() {
while(true)  
{
 int clapState = detectClaps(TOTAL_CLAPS_TO_DETECT);
 if(clapState == FINAL_DETECTED || clapState == LOST_CONTINUITY)
 {
   indicateClap(0);
 }
}
}

int detectClaps(int numClaps)
{
int clapNum = numClaps;
if(clapNum == 0)
{
 toggleOutput *= -1;
 indicateClap(clapNum);
 return FINAL_DETECTED;
}
readMic();
total = (total - buffer[loopIteration]) + sensorValue; 
average = (total/SIZE);
buffer[loopIteration] = sensorValue;
loopIteration = (loopIteration+1)%SIZE;
if(clapDetected())
{
 indicateClap(clapNum);
 delay(100);
 for(int i = 0; i < CLAP_TIME; i++)
 {
   int clapState = detectClaps(clapNum - 1);   
   if(clapState == FINAL_DETECTED || clapState == LOST_CONTINUITY)
   {
      return clapState;
   }
 }
 return LOST_CONTINUITY;
}
return CLAP_NOT_DETECTED;
}
void indicateClap(int clapNum)
{
if(clapNum == 0)
{
 if(toggleOutput == 1)
 {
   digitalWrite(out, HIGH);
   digitalWrite(activated, HIGH);
   digitalWrite(deactivated, LOW);
 }
 else
 {
   digitalWrite(out, LOW);
   digitalWrite(activated, LOW);
   digitalWrite(deactivated, HIGH);
  }
}
delay(110);
}
boolean clapDetected()
{
 return sensorValue > average + offset;
}
void readMic()
{
sensorValue = analogRead(inPin0);  
}

@Marino98:

... nel regolamento (... che dovresti aver letto), al punto 7, è chiaramente specificato che il codice DEVE essere racchiuso tra i tag CODE (... e non QUOTE).

Cortesemente edita il tuo post e usa il primo bottone a sinistra (quello fatto così: </>) per racchiudere il codice negli appositi TAG!

Guglielmo

P.S: sequenze particolari di caratteri, che normalmente possono essere presenti all'interno del codice, se NON racchiuse negli appositi tag, vengono interpretate ed alterate, rendendo il codice non leggibile :wink:

Puoi passare a una funzione dei parametri e la funzione puó dare un valore di ritorno.

esempio

int somma [ int numero1, int numero2)
{
return (numero1+numero2);
}
ovvero:

[tipo variabile] [nome funzione] ([tipo variabile1 e nome variabile1] , [tipo variabile1 e nome variabile1] ,...)
{
funzione
}

Dovresti ripassare come funzionano le funzioni in C.

Ciao Uwe

@UweFederer quindi mi stai dicendo che lo sketch è sbagliato? Perchè non è mio. Io l' ho trovato su Internet e ora lo sto studiando per capire come funziona dato che lo voglio modificare e farmi un progetto tutto mio.

@Marino98: Niente PM, grazie. Se devi chiedere qualcosa fallo pure qui.

Quando chiami una funzione puoi passarle degli argomenti, in modo che essa li abbia a disposizione durante la sua esecuzione. Pensa ad esempio ad una funzione che somma due numeri: dovrai pur dirle in qualche modo quali numeri vuoi sommare, no?

Definizione:

int somma (int a, int b) {
  return a + b;
}

Qualche chiamata:

int somma1 = somma (3, 5); // somma1 varrà 8
int somma2 = somma (12, 25); // somma2 varrà 37

Mi sembra abbastanza semplice, no? In realtà credo che tu abbia già visto qualcosa di simile:

Serial.begin (9600);
Serial.println ("Antani");

Sebbene in questo caso non stiamo parlando strettamente di chiamate di funzioni, il concetto è assimilabile: a Serial.begin() devi passare la velocità a cui vuoi inizializzi la seriale. A Serial.println() vorrai ben passare quel che vuoi scrivere, no? :slight_smile:

Tutto questo è necessario perché le variabili dichiarate all'interno di una funzione sono locali a quella funzione e non visibili dalle altre.

Comunque questi sono tutti concetti di base, ti consiglio di leggere qualsiasi libro di programmazione o di seguire qualche corso online.

@SukkoPera
questo sito va bene? C (linguaggio): tutorial per imparare programmare | Guida HTML.it

Marino98:
@SukkoPera
questo sito va bene? C (linguaggio): tutorial per imparare programmare | Guida HTML.it

Ma non hai visto quelli che ti ho già suggerito di leggere QUI ? ? ? :o :o :o

Guglielmo