Eccomi sono ritornato sul mio progetto.
L'ho trascurato qualche settimana ma adesso andiamo avanti un pezzetto.
Ho "accettato" di usare il codice che avevo copito anche se ridondante. Capito che bastava introdurre un ritardo (la funzione loop era praticamente vuota) per leggere e confrontare le variazioni di posizione dell'encoder, adesso voglio usarle come discriminante per scegliere la azione da compiere.
Le azioni saranno essenzialmente 4 ovvero andare, a rotazione, su una delle 4 pagine del mio display. Ad ogni pagina corrisponde un pezzo di codice per fare comparire dati diversi.
In questa fase poco conta che cosa si farà nelle varie pagine, voglio solo usare l'encoder per selezionarle.
Se sono qui a scriverne ovviamnte non è per tediarvi ma perchè mi sono intoppato nuovamente.
Io ho il valore dell'encoder al passo attuale e quello al passo precedente.
Se la loro differenza è negativa (rotazione oraria dell'encoder) incremento il contatore delle pagine di 1
se la differenza è positiva (rotazione antioraria dell'encoder) il contatore delle pagine scnde di 1
Poichè le pagine sono solo 4, quando il contatore raggiunge il valore 5 gli viene assegnato d'ufficio nuovamente il valore 1, se scende a 0 invece torna a valere 4. Totale rotazione.
Bene, fatto lo spiego, arriaviamo all'intoppo.
Nello sketch che allego hoo voluto stampare a monitor seriale i 4 dati base: valore encoder attuale, precedente, loro differenza, contatore delle pagine.
Ho poi messo altri 2 campi per capire, come debug, in quale ramo del ciclo "if else" mi stavo infilando.
Cosa succede?
I valori dell'encoder variano in modo coerente, la loro diffrenza pure (pare ovvio), il valore della pagina (la variabile si chiama "page") invece non varia come deve:
Al primo ciclo ha il valore 1 che gli assegno quando la dichiaro cone int.
Se non tocco l'encoder resta tutto immutato.
se ruoto l'encoder....idem
Sembrerebbe non accadere alcuna delle condizioni del ciclo if
invece non è così: le altre due cose che faccio scrivere a monitor sono proprio all'interno del ciclo e vengono stampate al momento giusto.
Sia che ruoti in un senso che nell'altro, il ciclo viene rispettato e la variabile "page", variata proprio all'interno del ciclo, assume il giusto valore.
Purtroppo al ciclo successivo tornaad assumere il vlore iniziale.
Io non riesco a trovare alcun punto in cui la variabile debba essere resettata al valore iniziale. Il codice è di poche righe ed è quasi possibile fare un debug manuale!
Mi chiedo se sia veramente tonto o se non sia ncora "colpa" dell'uso degli interrupt che mi frega. Come se facessero uscire dal ciclo resettando i valori.
So che l'ho detta male, non vogliatemene....
Questo il codice
int encoderPin1 = 2;
int encoderPin2 = 3;
volatile int lastEncoded = 0;
volatile int encoded = 0;
volatile int status0 = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int page = 1;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
Serial.begin (9600);
pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
}
void loop(){
Serial.println("--------------");
Serial.println(encoderValue);
Serial.println(status0);
Serial.println(encoderValue-status0);
Serial.println(page);
Serial.println("+++++++++++++");
if ((encoderValue-status0)>0) //se l'encoder è stato ruotato in senso antiorario
{
page = page-1; // vai alla pagina precedente
Serial.println("antiorario!!!"); // serve a verificare se questa evenienza è accaduta
Serial.println(page); // vediamo subito il valore che assume la variabile
if (page=0) page=4; // le pagine sono 4, dopo la 4 c'è nuovamente la 1
}
else if ((encoderValue-status0)<0) // se l'encoder è stato ruotato in senso orario
{
page = page+1; // vai alla pagina successiva
Serial.println("orario!!!"); // serve a verificare se questa evenienza è accaduta
Serial.println(page); // vediamo subito il valore che assume la variabile
if (page=5) page=1; // le pagine sono sempre 4 quindi prima della 1 c'è la 4
}
else // si verifica solo se le due variabili hanno lo stesso identico valore
{ // continua a non fare un bel cazzo di niente
Serial.println("nessuna rotazione!!!"); // serve a verificare se questa evenienza è accaduta
Serial.println(page); // vediamo subito il valore che assume la variabile
}
status0 = encoderValue;
delay(1500);
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
{encoderValue ++;
}
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
{encoderValue --;
}
lastEncoded = encoded; //store this value for next time
}
ho messo un sacco di commenti, spero che qualcuno abbia il coraggio di entrarci.
qui copioincollo quanto appare sul seriale (i commenti in rosso ovviamente li ho aggiunti qui!):
--------------
0 valore dell'encoder attuale
0 valore dell'encoder precedente
0 differenza tra i due valori
1 valore della variabile page
+++++++++++++
nessuna rotazione!!! l'encoder non è stato toccato
1 il valore di page non viene variato
--------------
-4 ho girato un passo quindi l'encoder cambia valore
0 il valore precedente non cambia
-4 ha loro differenza è negativa
1
+++++++++++++
orario!!! questa scritta testimonia che siamo entrati nel ramo giusto del ciclo if
2 coerentemente page si incrementa di 1
--------------
-4 non ho più mosso nulla quindi questo valore resta invariato rispetto al passo precedente
-4 ecco che il passo precedente si è aggiornato alla variazione
0 coerentemente la differenza dei valori è nulla
1 la variabile page però non ha assunto il valore 2 che avrebbe dovuto
+++++++++++++
nessuna rotazione!!!
1
forse che la variazione di "page" nel ciclo if else venga vista come variabile locale e non venga riconosciuta fuori dal ciclo? Se si, che fare?
Grazie.