Buongiorno a tutti, sono nuovo del mondo della programmazione e avrei bisogno di un aiuto.
Sto programmando un encoder rotativo con ARDUINO e ho trovato tale codice on line , già pronto e bello funzionante.
#define ENC_A 14
#define ENC_B 15
#define ENC_PORT PINC
void setup()
{
/* Setup encoder pins as inputs */
pinMode(ENC_A, INPUT);
digitalWrite(ENC_A, HIGH);
pinMode(ENC_B, INPUT);
digitalWrite(ENC_B, HIGH);
Serial.begin (9600);
Serial.println("Start");
}
void loop()
{
static uint8_t counter = 0; //this variable will be changed by encoder input
int8_t tmpdata;
/**/
tmpdata = read_encoder();
if( tmpdata ) {
Serial.print("Counter value: ");
Serial.println(counter, DEC);
counter += tmpdata;
}
}
/* returns change in encoder state (-1,0,1) */
int8_t read_encoder()
{
static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
static uint8_t old_AB = 0;
/**/
old_AB <<= 2; //remember previous state
old_AB |= ( ENC_PORT & 0x03 ); //add current state
return ( enc_states[( old_AB & 0x0f )]);
}
Il codice va bene ma io avrei bisogno di qualcosa di leggermente diverso.
I dati vengono scritti ad ogni click (il dato nuovo compare solo quando giro la manopola, se la manopola rimane ferma la scrittura si arresta all'ultimo dato rilevato), mentre io avrei bisogno che i dati vengano scritti di continuo, ad una frequenza da me scelta, rilevando ovviamente tutte le variazioni di stato anche...
Oppure che ad ogni dato riguardante la rotazione sia affiancato uno con l'orario in cui è avvenuta (preciso ai millisecondi ad esempio).
Ho provato un po' ma non ne sono venuto fuori, qualcuno può aiutarmi?
Problema programmazione encoder rotativo
Moderatore:
Paolino
8 messaggi
• Pagina 1 di 1
0
voti
Ultima modifica di
mixmaxmaxxx33 il 4 ott 2014, 9:35, modificato 1 volta in totale.
-

mixmaxmaxxx33
0 2 - Messaggi: 14
- Iscritto il: 1 ott 2014, 15:59
- Località: Udine
0
voti
Facciamo prima cosi forse; come faccio ad affiancare ad ogni dato riguardante i click avvenuti sull'encoder una data precisa al millisecondo nel qualè è avvenuta la misurazione (il click rilevato)?
-

mixmaxmaxxx33
0 2 - Messaggi: 14
- Iscritto il: 1 ott 2014, 15:59
- Località: Udine
0
voti
StefDrums ha scritto:puoi usare un timer, è una soluzione a costo zero.
Ma ARDUINO dovrebbe avere un clock interno...io non so come modificare il codice per sfruttare quel clock come timer.
A me il riferimento temporale mi basta che sia espresso in millisecondi dall'avvio della misurazione, non una data giornaliera precisa (dd/mm/yy hh:mm:ss)
Scusate la mia ignoranza
Ultima modifica di
mixmaxmaxxx33 il 4 ott 2014, 9:51, modificato 1 volta in totale.
-

mixmaxmaxxx33
0 2 - Messaggi: 14
- Iscritto il: 1 ott 2014, 15:59
- Località: Udine
0
voti
mixmaxmaxxx33 ha scritto:StefDrums ha scritto:puoi usare un timer, è una soluzione a costo zero.
Ma ARDUINO dovrebbe avere un clock interno...io non so come modificare il codice per sfruttare quel clock come timer.
Scusate la mia ignoranza
"ARDUINO" non è niente di più che un processore ATMEL, quindi ti consiglio di prendere il datasheet e controllare.
Inoltre ti consiglio di cominciare a guardarti come si programma in C, perché senza conoscere i fondamenti sarà molto difficile utilizzare qualsiasi microprocessore.
0
voti
Ciao
mixmaxmaxxx33, aprendo un nuovo thread, quando il contenuto di questo ha origine e si riconduce alle valutazioni derivate da un altro, di quest'ultimo sarebbe il caso di recuperare parte dei contenuti in modo tale che chi legge possa farsi un'idea, semplicemente perché nessuno legge tutto.
Per questa volta mi faccio interprete, a beneficio anche di altri utenti: la questione è partita da qui.
Saluti
Per questa volta mi faccio interprete, a beneficio anche di altri utenti: la questione è partita da qui.
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8986
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
A me il riferimento temporale mi basta che sia espresso in millisecondi dall'avvio della misurazione
Arduino ha la funzione "millis()" che restituisce il tempo trascorso dall'accensione.
Deve essere una variabile "unsigned long int" occupa memoria ma registra circa 50 gg prima di riazzerarsi.
Praticamente devi assegnare una variabile per esempio la puoi chiamare time:
- Codice: Seleziona tutto
unsigned long int time;
poi nel loop quando fai la misurazione
- Codice: Seleziona tutto
time = millis();
Il vantaggio di usare mills() è che il programma continua la sua normale esecuzione, quindi puoi utilizzare tipo un IF dichiarando che se time > di time + millisecondi fai una lettura.
Ricorda che millis() restituisce un valore in millisecondi quindi anche te devi ragionare in millisecondi.
8 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 15 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


