Encoder rotativo con pulsane

const int pinA = 9;  // Pin A dell'encoder
const int pinB = 8;  // Pin B dell'encoder

volatile unsigned long timerDuration = 0;  // Durata del timer in millisecondi
volatile int lastStateA = HIGH;  // Ultimo stato letto del pin A
volatile int lastStateB = HIGH;  // Ultimo stato letto del pin B

unsigned long previousMillis = 0;  // Memorizza l'ultimo tempo di aggiornamento
const long interval = 1000;  // Intervallo di aggiornamento (1 secondo)

void setup() {
  pinMode(pinA, INPUT_PULLUP);  // Imposta pin A come input con pullup
  pinMode(pinB, INPUT_PULLUP);  // Imposta pin B come input con pullup
  
  attachInterrupt(digitalPinToInterrupt(pinA), checkEncoder, CHANGE);
  attachInterrupt(digitalPinToInterrupt(pinB), checkEncoder, CHANGE);
  
  Serial.begin(9600);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    if (timerDuration > 0) {
      timerDuration -= interval;
      if (timerDuration < 0) timerDuration = 0;
    }

    Serial.print("Timer: ");
    Serial.print(timerDuration / 1000);  // Converti in secondi
    Serial.println(" secondi");
  }
}

void checkEncoder() {
  int stateA = digitalRead(pinA);
  int stateB = digitalRead(pinB);
  
  if ((stateA != lastStateA) || (stateB != lastStateB)) {
    if (stateA == stateB) {
      // Rotazione oraria
      timerDuration += 5000;  // Aumenta di 5 secondi
    } else {
      // Rotazione antioraria
      if (timerDuration >= 5000) {
        timerDuration -= 5000;  // Diminuisce di 5 secondi
      } else {
        timerDuration = 0;
      }
    }
    
    lastStateA = stateA;
    lastStateB = stateB;
  }
}```[quote="shooting-labs, post:1, topic:1288325, full:true"]

const int pinA = 9; // Pin A dell'encoder
const int pinB = 8; // Pin B dell'encoder

volatile unsigned long timerDuration = 0; // Durata del timer in millisecondi
volatile int lastStateA = HIGH; // Ultimo stato letto del pin A
volatile int lastStateB = HIGH; // Ultimo stato letto del pin B

unsigned long previousMillis = 0; // Memorizza l'ultimo tempo di aggiornamento
const long interval = 1000; // Intervallo di aggiornamento (1 secondo)

void setup() {
pinMode(pinA, INPUT_PULLUP); // Imposta pin A come input con pullup
pinMode(pinB, INPUT_PULLUP); // Imposta pin B come input con pullup

attachInterrupt(digitalPinToInterrupt(pinA), checkEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(pinB), checkEncoder, CHANGE);

Serial.begin(9600);
}

void loop() {
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;

if (timerDuration > 0) {
  timerDuration -= interval;
  if (timerDuration < 0) timerDuration = 0;
}

Serial.print("Timer: ");
Serial.print(timerDuration / 1000);  // Converti in secondi
Serial.println(" secondi");

}
}

void checkEncoder() {
int stateA = digitalRead(pinA);
int stateB = digitalRead(pinB);

if ((stateA != lastStateA) || (stateB != lastStateB)) {
if (stateA == stateB) {
// Rotazione oraria
timerDuration += 5000; // Aumenta di 5 secondi
} else {
// Rotazione antioraria
if (timerDuration >= 5000) {
timerDuration -= 5000; // Diminuisce di 5 secondi
} else {
timerDuration = 0;
}
}

lastStateA = stateA;
lastStateB = stateB;

}
}```
[/quote]
Buongiorno, premetto che il mio livello è pari a ==0== , e che sto approcciando da poco questo intrigato mondo, ho fatto un progettino per lo sport che pratico e mi ha acceso la voglia di continuare ho altri 2 progetti in mente ma per ora sono fantasie perché il mio livello è ancora troppo scadente , venendo a noi con questo codice non riesco tramite encoder a far aumentare il tempo all'interno di un set di countdown ,
sostanzialmente devo creare un contatore alla rovescia dove partendo da un set deciso tramite encoder faccia il conto alla rovescia , che ad ogni 10 secondi parta un bip tramite buzzer e che a 10 secondi dalla fine il buzzer suoni ogni secondo deve essere presente sul display sempre la rimanenza dei secondi e come per il buzzer agli ultimi 10 secondi cominci anche a lampeggiare al termine deve fafe un bip prolungato di 3 secondi e poi resettarsi tenendo in memoria il timer che era stato scelto in precedenza , per questo mi serviva l'encoder x diminuirlo all'occorrenza.
Con rp2040 codificato in pyton funzionacome descritto unico problema che non tiene il programma in memoria e non capisco , detto anche questo volevo traslare tutto su nano 33 iot in quanto era da integrare l'altro progettino che avevo già fatto con c++ dove con 3 led mi indicava la messa in bolla del mio mezzo sportivo , non so se mi sono spiegato bene .
ringrazio anticipatamente chi mi aiuterà :pray:

Ti segnalo che, nella sezione in lingua Inglese, si può scrivere solo in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato.

Grazie.

Grazie mille !!

1 Like

... A quanto scritto da "pert" aggiungo ...

... fosse anche per una sola riga, come richiesto al punto 7 del REGOLAMENTO, tutto il codice va racchiuso tra i tag CODE, per cui, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farlo al più presto. :wink: