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à