Avrei bisogno di aiuto per verificare la correttezza di un esercizio svolto

Settimana scorsa ho fatto una verifica con Arduino (sono ancora alle primissime armi), in un esercizio chiedeva: Scrivere uno sketch Arduino che consenta di far lampeggiare un led quando il cursore del
potenziometro supera il 50% della propria resistenza interna; Se il potenziometro si trova al di
sotto del valore impostato il lampeggio deve interrompersi. Io ho svolto l’esercizio come nel file allegato, e il prof ha commentato con: non serve il ciclo for, non serve l’else alla fine. Poi commentando a voce che, il ciclo for impedisce al circuito di operare come richiesto dall’esercizio, cioè quando il potenziometro è al di sotto del 50% non deve più lampeggiare, secondo il prof il ciclo for deve finire il suo numero di cicli prima che possa attuare un altro ordine, ma la cosa che io ho pensato è che se metto subito dopo un else (all’if di sopra) possa comunque rispettare l’esercizio. Spero di essermi spiegato, nel caso sono disponibile a dare chiarimenti. Spero possiate aiutarmi a capire se ho ragione o torto. Grazie in anticipo

int potenziometro=0;
int led=13;
int i=0;

void setup() {
 // put your setup code here, to run once:
pinMode(led,OUTPUT);
pinMode(potenziometro,INPUT);
}

void loop() {
 // put your main code here, to run repeatedly:
potenziometro=analogRead(0);
if(potenziometro>511){
 for(i=0;i>=0;i++){
   digitalWrite(led,HIGH);
   delay(500);
   digitalWrite(led,LOW);
   delay(500);
 }} else {
   digitalWrite(led,LOW);
 }
}

Benvenuto,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

nid69ita

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)

>xxxippe: ** in conformità al regolamento, punto 7, devi editare il tuo post #1 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More…* → Modify che si trova in basso a destra del tuo post*) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Ovvero, prima del codice devi mettere [ code ] (senza gli spazi che ho messo io tra le parentesi), dopo il codice devi mettere [ /code ] (sempre senza gli spazi) così da avere il codice racchiuso tra di essi. Grazie.

Dovrei aver fatto la presentazione, mi scuso per non aver letto il regolamento con la dovuta attenzione.

Ho visto il mio errore mentre immettevo il codice e dovrei aver risolto, grazie per l'appunto, nel caso spero tu possa correggermi di nuovo :wink:

xxxippe:
ho pensato è che se metto subito dopo un else (all’if di sopra) possa comunque rispettare l’esercizio

Eh no, non conta quello che pensi tu o io, conta quello che “pensa” la macchina :slight_smile:
E noi umani dobbiamo descrivere le procedure che ci interessano tenendo presente “come pensa”.
Se fai finta di essere Arduino ed esegui una alla volta le istruzioni che hai scritto, scopri che appena entri in quel for rimani intrappolato la dentro per 32768 cicli…

Quindi ha ragione il professore? :confused:
Puoi spiegarmi la logica dietro la macchina? Non l'ho ben capita, il ciclo for è "sopra" l'else come ordine di attuazione? Grazie mille

Allora è un dubbio sull' ordine di esecuzione delle istruzioni, prova a disegnare il diagramma di flusso che rappresenta il codice.

L'if è una ramificazione. Il primo ramo (if vero) porta all'esecuzione di un ciclo for, che può terminare solo quando la condizione specificata nel for diventa falsa. Solo quando il ciclo for termina è possibile fare un altro giro e testare di nuovo l'if iniziale.

Si, il prof ha ragione :wink:

Grazie mille, mi hai insegnato qualcosa di nuovo, peccato aver sbagliato una tale sciocchezza. Buona serata

xxxippe:
Quindi ha ragione il professore?

Si (per fortuna!!) e per tutte e due le osservazioni fatte (inutilità del ciclo for ed inutilità del blocco else)

@xxxippe, probabilmente l'errore è pensare di fare il solito programma in C, una sequenza eventualmente con deviazioni (if) e cicli
Ma in questo caso, in Arduino, è meglio ragionare in maniera diversa:

  1. uno sketch Arduino è comunque un programma in C con il suo main; il core nasconde schematicamente questo:
void main()
{ setup();
  while (1) loop();
}
  1. perciò dentro alla loop (che è già dentro a un ciclo infinito) bisogna evitare dei ulteriori cicli.
    di solito si leggono gli input (il tuo potenziometro) e poi in base a dei valori si azionano gli output (il tuo led) in maniera adeguata.
  2. in molti casi come questo utile una macchina a stati finiti: LINK_ITA LINK_ING
    a. una variabile può assumere un solo valore in un istante tra diversi valori stabiliti; nel tuo caso LAMPEGGIA oppure NON_LAMPEGGIA
    b. un evento pilotato dagli ingressi (potenziometro) stabilisce il valore dello stato
    c. azioni gli output (il led) in base allo stato, utile un bel switch(stato) con i vari case
    ma dentro ai vari case non si devono usare cicli. per il tuo lampeggio utile vedere l'esempio fornitoro in arduino ide, BlinkWithoutDelay

Ciao!
In pratica per eseguire il lampeggio hai bisogno di un ciclo, ma la funzione loop() è già un ciclo per cui la cosa migliore è usare quello e non crearne altri.

Seconda cosa hai bisogno di eseguire il lampeggio solo se il potenziometro supera il 50%, e per farlo basta una sola condizione if.

void loop(){// ripete all'infinito
     if(potenziometro>=50%){// solo se il potenziometro è 50% lampeggia, altrimenti se inferiore non esegue

       accendi
       pausa
       spegni
       pausa

     }
}