Logica di comando Led con Potenziometro

Buon pomeriggio a tutti,
mi servirebbe qualche dritta per la scrittura di uno sketch. Componenti: potenziometro, led e una resistenza da 330 ohm. La logica del programma dovrebbe essere la seguente:

  • fissato un valore di resistenza di riferimento per il potenziometro, quando ruoto il potenziometro ed il valore di resistenza scende al di sotto di quello di riferimento, deve accendersi il led,
  • quando però ruoto nuovamente il potenziometro, non si deve spegnere subito il led, ma si deve attivare un timer che lo farà spegnere dopo un certo tempo. Ciò, non utilizzando la funzione "delay", in quanto rimarrebbe il codice fermo per troppo tempo.
    In condizioni di normale funzionamento però, con il valore di resistenza superiore al valore di soglia, il led deve rimanere spento.
    Ringrazio in anticipo.

Benvenuto, luigi_parigino :slight_smile:

Per cortesia, come da regolamento, per prima cosa presentati nell'apposita discussione spiegando bene quali esperienze hai in elettronica e programmazione, affinché possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Poi leggi attentamente tutto il [regolamento](http://D:\My Documents\p439994\Documents{https:\forum.arduino.cc\index.php?topic=149082.0}), in particolare leggi bene i punti 15.3 e 17.1, e impegnati a rispettarlo.

Ti ricordo che, purtroppo, fino a quando non avrai fatto la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto.

Ciao! Il tuo problema ha tre situazioni diverse, questo mi fa pensare che si risolverebbe bene con una macchina a stati finiti avente tre stati.
Dipende a che punto sei con la programmazione arduino, perché il programma prevede una macchina a stati finiti e il conteggio di un intervallo di tempo tramite funzione millis(). Sono nozioni un po superiori alla programmazione base

Per creare una macchina a stati finiti puoi usare una variabile globale, dichiarata fuori da ogni funzione, e uno swicth().

Ti faccio un abbozzo di codice che non è funzionante ma deve essere completato. Cosi hai un idea di come scrivere il programma. Probabile che serve qualche modifica per ottenere il tuo scopo, ma hai l'esempio di macchina a stati e uso di millis().

byte stato=0; // Variabile che indica lo stato, la situazione attuale
unsigned long tempo=0; // Variabile per il conteggio del tempo

void loop(){

    switch(stato){

        case 0: // situazione in cui il led deve stare spento
            if(analogRead(A0)>livelloMinimo){

                tempo=millis();// Prendo il tempo per conteggiare un intervallo di tempo
                stato=1; //passo allo stato sucessivo
            }
            break;
        case 1:
             if(milllis()-tempo>=2000){// se sono passati 2 secondi
                 digitalWrite(led,LOW);//spengo il led
                 stato=2; //passo allo stato 2
             }
             break;
         case 2:
              if(analogRead(A0)<=livelloMinimo){// se sono a livello minimo

                digitalWrite(led, HIGH); //accendo il led
                stato=0; //passo allo stato 0
            }
            break;

          
             
           
    }// end switch




}// end loop()