memorizzare e confrontare stato di valori diversi

Ciao ragazzi,
avrei bisogno di un aiuto, sto realizzando il mio primo progetto, ho creato un termostato formato da:arduino uno, lcd 16x2, potenziometro e scheda relè. Il tutto funziona egregiamente, ora vorrei implementare una funzione:
lo schermo lcd ha l’illuminazione interna che se collegata ai 5V illumina costantemente il display. Ora l’ho collegata ad un ingresso digitale di Arduino, quando il potenziometro viene mosso il display si accenda per x tempo.
Il mio problema è come fare a memorizzare lo stato attuale del potenziometro e fare il confronto, ho provato a seguire il ragionamento dell’esempio fatto con interruttore e led, ma non riesco a replicarlo con il potenziometro che non restituisce solo High o low ma bensì 30 valori.

come posso fare il confronto per attivare il display?
A livello logico ci sono, non riesco a scriverlo in linguaggio:

Leggo valore potenziometro —> lo inserisco in una variabile ( int stato)
Se il potenziometro viene mosso—>inserisco il dato in un altra variabile (in newstato)
se int stato è diverso != da new stato
digitalWrite ecc… ecc…

Grazie dell’aiuto e della pazienza :slight_smile:

Questo è il codice:

#include <DallasTemperature.h>


#include <LiquidCrystal.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 8

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int led = 13; //led pin 13
int luce = 9; //luce lcd su pin 9




void setup() {
  lcd.begin(16,2); //colonne e righe
  lcd.setCursor(0, 0);
  lcd.print("temp amb");
  pinMode(led, OUTPUT); //imposto il pin 13 in output LED
  pinMode(luce, OUTPUT);
  lcd.setCursor(8, 1);
  lcd.print("cald");
  sensors.begin();
 
}

void loop() {
  
  sensors.requestTemperatures(); // invio dati a sonda per leggere temperatura
  double temperatura = sensors.getTempCByIndex(0); // imposto a temperatura il valore letto dal sensore
  lcd.setCursor(10, 0);
  lcd.print(temperatura);
  int potenziometro= analogRead(5); //dichiaro potenziometro numero con virgola
  int tempimp = (30* potenziometro) / 1000; //divido il valore del potenziometro in 30 valori
  digitalWrite(luce, HIGH);
  lcd.setCursor (0, 1);
  lcd.print("imp");
  lcd.setCursor(4, 1);
  lcd.print(tempimp); //stampo valore potenziometro
  if (temperatura < tempimp) {     //se temperatura è minore di temperatura impostata accendo led (modulo relè)
    digitalWrite(led, HIGH); //accendo led
    lcd.setCursor(13,1);
    lcd.print("ON ");
  }
  else {                        //se no
    
    digitalWrite(led, LOW);    // modulo relè OFF
    lcd.setCursor(13,1);
    lcd.print("OFF");
  }
    
}

Cosi a logica, dichiara tre variabili in piu che usi come “memorie” per lo stato precedente dei valori e per la condizione del led (chiamale come vuoi, ad esempio tempoLed, tempPrec e statoLed), e poi nel loop le controlli … tipo, con un primo if controlli se tempPrec e’ diverso dal valore del potenziometro (potenziometro mosso), se si, lanci un ciclo di temporizzazione con millis (non con delay, altrimenti ti blocca tutto) dove usi l’altra variabile per controllare il tempo trascorso ( Leo ha un bell’articolo sull’uso di millis al posto di delay su lsuo sito) … una cosa tipo questa (occhio che e’ solo un’esempio, la devi adattare … in piu non sono un programmatore, quindi controllala bene :P)

if (tempimp != tempPrec)
{
    tempPrec = tempimp;
    statoLed = TRUE;
    digitalWrite (pinLuce, HIGH);
    tempoLed = millis();
}
if ((millis() - tempoLed > 3000) && (statoLed == TRUE)) //tre secondi led acceso, se serve intervallo diverso cambialo qui
{
    digitalWrite (pinLuce, LOW);
    statoLed = FALSE;
}

In teoria, ogni volta che muovi il potenziometro, dovrebbe resettare il tempo della luce (se non vuoi che si resetti, cambia “if (tempimp != tempPrec)” con “if ((tempimp != tempPrec) && (statoLed == FALSE))” , cosi il tempo della retroilluminazione riparte solo se si era gia spento) … nel primo caso da anche un’altro HIGH al pin della luce ogni volta che muove il potenziometro, ma non dovrebbe causare nessun problema dare un digitalWrite “high” ad un pin che e’ gia “high”

Softwaristi, correggete spietatamente se sbaglio, ok ?

kitesurfer_it:
lo schermo lcd ha l’illuminazione interna che se collegata ai 5V illumina costantemente il display. Ora l’ho collegata ad un ingresso digitale di Arduino, quando il potenziometro viene mosso il display si accenda per x tempo.

Spero che non l’abbia collegato direttamente ma tramite un transistor.

grazie della dritta Etemenanki, adesso provo a studiarmi il tuo ragionamento e il post di leo.

Per quanto riguarda la retroilluminazione, si l'ho collegata direttamente, ne ero quasi sicuro poi ho avuto conferma dalla guida di maffucci, dici che è meglio pilotarlo con un transistor? Non è corretto alimentarlo dal pin? Ho un paio di bc547 npn, potrei usare quello con il pin arduino nella base

La retroilluminazione di un display LCD classico come minimo è di qualche decina di mA, ma in alcuni casi può arrivare anche a valori molto elevati (ne ho uno che consuma 200 mA!!). Se ad un pin attacchi qualcosa che consuma più di 40 mA, bruci quel pin!

Quindi, sì: il consiglio è pilotarlo con un transistor.

leo72:
La retroilluminazione di un display LCD classico come minimo è di qualche decina di mA, ma in alcuni casi può arrivare anche a valori molto elevati (ne ho uno che consuma 200 mA!!). Se ad un pin attacchi qualcosa che consuma più di 40 mA, bruci quel pin!

Quindi, sì: il consiglio è pilotarlo con un transistor.

Grazie della dritta, spero che il pin si bruci alla lunga perchè è da due giorni che faccio prove con il pin collegato direttamente al display, il mio arduino ha 3 giorni di vita :~

Al max dovresti cambiare microcontrollore, però se puoi risparmiare 5/6 euri di componenti... :wink: