Incrementare/decrementare un valore in una condizione if da pulsante

Ciao a tutti. Volevo chiedervi se è possibile tramite pulsante cambiare un valore impostato per leggere due igrometri in una condizione if.
Leggendo questa riga

if (s == 0  &&  fcS_Chiuso && lettura >= 750  &&  lettura1 >= 750) { 
avviaPompa();
}

una pompa viene accesa quando i due igrometri superano la soglia di 750 impostata, ma se devo cambiare questo valore devo agire per via software o IDE. E se invece collegassi 3 pulsanti :
Uno per Aumentare il valore, Uno per Diminuire il valore ed Uno serve per scegliere quale igrometro deve cambiare valore.
All'accensione o riavvio Arduino deve leggere l'ultimo valore impostato. Visto che questo valore lo imposto solo in questa condizione quello che ho detto si può fare??

cicciozuc:
Visto che questo valore lo imposto solo in questa condizione quello che ho detto si può fare??

Si.

Ciao, Ale.

Grazie, ma come faccio a ricordare ad Arduino l'ultimo valore impostato? Ad ogni riavvio non posso inserire il valore voluto.
quale variabile devo creare?

Devi scrivere il valore nella Eprom, e rileggerlo all'avvio. Leggi bene come funziona la Eprom, sopratutto per quanto riguarda i cicli di scrittura utilizzabili, a differenza della ram le scritture non possono essere infinite, ma hanno un limite di vita (comunque abbastanza adeguato per un uso comune).
Qui trovi la documentazione relativa.

Ciao, Ale.

Sulla EEPROM se non erro dovresti averi 100.000 cicli di scrittura/cancellazione, per consumarla, sono sufficienti se non stai lì a scriverli di continuo, con hardware aggiuntivo (se non ce l'hai già) potresti anche usare la SD card volendo.
Inoltre ti consiglierei anche di aggiungere un output visivo al valore delle variabili di soglia, altrimenti tu le aumenti e le diminuisci con i pulsanti, ma come fai a sapere qual'è la soglia che hai impostato?

il programma che uso monta un lcd 20x4 che mi indica l'umidità dei due sensori, pensavo già di visualizzare il valore impostato e quello da modificare su lcd ma usando un 20x4 devo togliere la lettura dei sensori quando interagisco sui pulsanti, quindi opto per un TFT lcd da 3.2" in questo modo ho più spazio per visualizzare le letture..
Se nella EEPROM posso scrivere solo valori che vanno da 0 a 255 e il sensore legge da 0 a 1023 per memorizzare un valore di 750 devo dividere x4 giusto? in questo caso devo memorizzare 187.

Il problema che ancora non ho capito come applicare queste variabili in una condizione if

Ora che ci penso ho acquistato tempo fà una tastiera a membrana 4x4 che potrei usare al posto dei pulsanti così da impostare un valore premendo i numeri evitando di cliccare ripetutamente un pulsante per arrivare al numero scelto.

si forse è meglio, con i tasti "+" e "-" io avrei diviso per 64 più che per 4, in modo da avere 16 preset, con la tastiera puoi mettere quello che vuoi senza diventare matto a schiaccare pulsanti, quindi se vuoi usare solo un byte dividi per 4.

Se non vuoi perdere risoluzione del sensore invece sulla eeprom puoi anche usare 2 byte invece che uno solo, spezzi una variabile int in 2 per metterla nei due byte della eeprom, poi la riassembli quando leggi i 2 byte.

cicciozuc:
Se nella EEPROM posso scrivere solo valori che vanno da 0 a 255 e il sensore legge da 0 a 1023 per memorizzare un valore di 750 devo dividere x4 giusto? in questo caso devo memorizzare 187.

Perchè? Ma l'hai letto il link che ti ho messo sopra? Mi sa di no, altrimenti avresti visto anche questo.

Ciao, Ale.

Mah... Io preferisco avere un controllo preciso sulle locazioni che uso. Basta usare due byte: un high byte e un low byte. Nel primo scrivi il valore diviso 256, che è un'operazione che puoi fare con lo scorrimento binario (non so se il compilatore, trovando una divisione per 256, la ottimizzi comunque facendo semplicemente scorrere i bit):

high_byte=valore>>8;

Il low byte è il resto, ovvero valore%256.

ilguargua:
Perchè? Ma l'hai letto il link che ti ho messo sopra? Mi sa di no, altrimenti avresti visto anche questo.

Certo che ho letto il tuo link e le sue funzioni di eeprom, ma non so dove ho letto che poteva memorizzare max 255 byte, Pardon sbaglio mio..

andrearizla:
si forse è meglio, con i tasti "+" e "-" io avrei diviso per 64 più che per 4, in modo da avere 16 preset, con la tastiera puoi mettere quello che vuoi senza diventare matto a schiaccare pulsanti, quindi se vuoi usare solo un byte dividi per 4.

Se monto la keypad per inserire il valore da me richiesto non mi serve agire sul tasto +/- ma semplicemente digito il valore nella tastiera, se voglio impostare una soglia di 750 digito 7-5-0, poi mi serve un tasto per passare da un igrometro all'altro ed un tasto di conferma per salvare il valore in eeprom..

Datman:
Mah... Io preferisco avere un controllo preciso sulle locazioni che uso. Basta usare due byte: un high byte e un low byte. Nel primo scrivi il valore diviso 256, che è un'operazione che puoi fare con lo scorrimento binario (non so se il compilatore, trovando una divisione per 256, la ottimizzi comunque facendo semplicemente scorrere i bit):

high_byte=valore>>8;

Il low byte è il resto, ovvero valore%256.

scusami l'ignoranza ma perchè devo dividere per 256 (750/256) non posso memorizzare il valore impostato letto dalla tastiera? è la prima volta che utilizzo queste istruzioni e qui sono in un gradino di comprensione molto più alto di tutto quello che ho imparato fino adesso. è molto più difficile di quanto mi aspettavo,non si finisce mai di imparare.

Perché anche le locazioni di memoria della EEPROM sono a 8 bit, quindi in una locazione puoi scrivere solo valori da 0 a 255.

Molto chiaro quello che dici,ma ancora poco comprensibile per me.
Però ragionando un pò ho scoperto che prima di uscire matto a scrivere queste istruzioni devo capire come assemblare il tutto, mi spiego. Questo progetto è una Serra Automatica autogestita (se ne parlato molto in questo post,da allora ho aggiunto più funzioni e la gestisco anche dal cellulare con l'App di Blink. Uso una Mega2560 con una ethernet shield montata sopra e gestisco 8 pin tra cui 2 Analogici per i sensori di umidità e 6 digitali.. Se voglio montarci sopra una TFT Shield per un lcd da 3.2" tipo questa o semplicemente solo l'LCD senza shield posso scordarmi sia la W5100 (che per me è fondamentale) ne tanto meno collegarci una tastiera e i gli 8 pin che già uso... Se così fosse lascio tutto comè e se devo modificare un valore mi tocca ogni volta aggiornare lo sketch.. Avete un'idea??

Forse se la Shield con LCD montata la ponticello a parte usando i pin che vanno da 22 a 53 mi rimangono i pin liberi sulla w5100 per la tastiera che vanno dal 2 al 9(10,11,12,13 sono usati dalla w5100) e per i pin che uso restato gli Analogici da A2 a A15 che posso dichiararli come digitali e i pin di comunicazione(scl,sda,tx1,2,3,rx1,2,3) che penso sia il caso di lasciarli vuoti. Cosa pensate si può fare

prova a cercare un tft con bus spi oppure i2c, nel primo caso in più dovrebbe occuparti solo un pin di chip select, gli altri li dovrebbe poter condividere con la ethernet shield, nel secondo puoi usare i pin 20/21 se non sbaglio

Ho trovato questo LCD TFT UART da 3.2 e credo che fà al caso mio, ha quattro pin 2 Alimentazione e 2 di comunicazione. Non riesco a trovare la keypad 4x4 e penso di comprarla di nuovo insieme al display tft..Ho scritto qualche riga di codice per esercitarmi con la tastiera e la Eeprom inserendo solo pochi comandi per capire se sbaglio qualcosa ma senza tastiera non ho modo di provare se funziona.. Chiedo a voi se ho iniziato bene o sto sbagliando

#include <Keypad.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#define Sensore1 A0
#define Sensore2 A1
#define Pompa    12
#define fcS      24  // finecorsa snistro, premuto == LOW
#define fcD      25  // finecorsa destro, premuto == LOW

#define RELE_OFF_LEVEL  HIGH  // livello che spegne rele'
#define RELE_ON_LEVEL   LOW   // livello che accende rele'
#define FC_PRESS_LEVEL  LOW   // livello a finecorsa premuto
#define FC_OPEN_LEVEL   HIGH  //  livello a finecorsa aperto

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4};

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C  lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


byte errore = 0;
int lettura;
int lettura1;

void setup() {
  Serial.begin(9600);
  pinMode(Sensore1, INPUT);
  pinMode(Sensore2, INPUT);
  pinMode(Pompa, OUTPUT);
  // put your setup code here, to run once:
  int val = 750;
  EEPROM.write(0, val);
}

void loop() {
  char customKey = customKeypad.getKey();
  if (customKey) {
    EEPROM.update(0, customKey);
  }
}

void avviaPompa() {
  digitalWrite(Pompa, RELE_ON_LEVEL);
}
void fermaPompa() {
  digitalWrite(Pompa, RELE_OFF_LEVEL);
}

void letturaIgrometri() {
  lettura = analogRead(Sensore1);
  int sensorVal = map(lettura, 1020, 160, 0, 100); // converto in %

  Serial.print("Umidità terra 1 : ");
  Serial.print(sensorVal);
  Serial.println ("%"); //Stampa a schermo il valore

  lettura1 = analogRead(Sensore2);
  sensorVal = map(lettura1, 1022, 178, 0, 100); // converto in %

  Serial.print("Umidità terra 2 : ");
  Serial.print(sensorVal);
  Serial.println ("%"); //Stampa a schermo il valore

}

void logicaPompa() {
  static unsigned long t = 0;  // tempo processo
  static byte          s = 0;  // stato processo
  boolean fcS_Chiuso = (digitalRead(fcS) == FC_PRESS_LEVEL);

  if (errore == 1) fermaPompa();

  int val = EEPROM.read(0);
  if (s == 0  &&  fcS_Chiuso && EEPROM.get(0, val))  {
    avviaPompa();
  }
}

Quello che intendo fare all'accensione è leggere l'ultimi due valori precedente impostati perchè i sensori sono 2, quando inserisco un valore da tastiera scelgo quale igrometro verrà modificato e questo verrà aggiornato in eeprom, quando all'interno della condizione if questi 2 valori vengono raggiunti esegue l'istruzione. Potrei usare un solo valore per i due igrometri sarebbe più semplice ma visto che hanno letture poco differenti meglio avere un valore per sensore.. Da quello che sto scrivendo qui e il codice postato non fà una piega lo sò ma almeno è un punto d'inizio

Ho trovato questo LCD TFT UART da 3.2 e credo che fà al caso mio, ha quattro pin 2 Alimentazione e 2 di comunicazione.

Quel prezzo mi sembra fin troppo conveniente, ma con i cinesi non si sa mai.

Non riesco a trovare la keypad 4x4 e penso di comprarla di nuovo insieme al display tft..

Ne puoi anche fare a meno, studiati come funziona il display, i pulsanti li disegni direttamente li sopra, altrimenti esiste anche una espansione con 6 pulsanti ed un buzzer che si collega direttamente al display (la puoi vedere qui, casomai cercala su Ali).

Evita come la peste la libreria di default (quella del produttore, per indenterci), il display volendo lo puoi usare senza alcuna libreria (qui trovi come fare), o se vuoi puoi provare la mia libreria (attualmente sto sistemando delle parti per renderla più compatibile con un maggior numero di schede possibili, ma con gli arduino "standard" già funziona abbastanza bene, ed occupa meno della metà di memoria [vedi qui]).

Ciao, Ale.

E' un ottima idea, non riflettevo bene sulle funzionalità di questo display .. Grazie Ale

Riguardo alla eeprom anziché usare i metodi write() e read() usa put() e get().

Non li ho provati di recente, quindi sperimentali tu ed se non dovesse funzionare posta qui il problema.

Come usarli:

// fuori da ogni funzione dichiari normalmente la variabile
float myFloat = 12.5;


// dentro una tua funzione o dentro il loop e nel setup
EEPROM.put(0, &myFloat);   //

Il metodo get lavora allo stesso modo, non dimenticare '&' prima del nome della variabile.

Ricorda anche che ogni cella della eeprom è grande 8 bit per cui può contenere valori nel range 0÷255.
Nell'esempio sopra si myFloat richiede 32 bit, quindi 32/8=4 celle eeprom (da 0÷3), se devi scrivere altre variabili a seguire che le prime 4 celle (0÷3) sono già impegnate per cui, scriverai:

EEPROM.put(4, &myFloat);

Questo salva in eeprom myFloat due volte in posizioni differenti.
[ 0 1 2 3 ] la prima volta
[ 4 5 6 7 ] la seconda volta.

Evidentemente la prossima cella libera è la 8.

Se hai molte variabile da salvare in eeprom mettile in una struttura dati, se non sai come fare
vedi in C come si definisce una struttura con la parola chiave struct.

Il metodo put non scrive continuamente il dato ma esegue un "update", nel senso che
se quello che vuoi scrivere es. myFloat (che vale 12.5) è già scritto nella eeprom non avverrà una scrittura .

Ciao.

Grazie sei stato molto chiaro, appena posso mi esercito e vediamo come va'.