Ciao a tutti ho montato un encoder che andrà a controllare un display 7 segmenti (tm1637).
L'obbiettivo è quello di regolare le prime due decine e le seconde due decine (minuti e secondi).
Il problema è che quando vado a ruotare l'encoder il campionamento dei valori non è sempre lineare...
Ho rilevato un secondo problema, quando aziono il pulsante di switch mi va a scalare il valore di un unità.
Credo siano problemi Hardware visto che il software sembra giri correttamente.
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
#define outputA 7
#define outputB 8
const int ledPin = 13;
const int buttonPin = 6;
int ledState = 1;
int buttonState;
int lastButtonState = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int click = 0;
int clickState;
int secondi = 0;
int minuti = 0;
int aState;
int aLastState;
int aState_;
int aLastState_;
TM1637Display display(CLK, DIO);
void setup() {
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
pinMode (buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin (9600);
aLastState = digitalRead(outputA);
aLastState_ = digitalRead(outputA);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == 0) {
ledState = !ledState;
}
}
}
digitalWrite(ledPin, ledState);
if(ledState == 1){
click = 1;
}else{
click = 0;
}
lastButtonState = reading;
switch(click){
case 0:
seconds();
break;
case 1:
minutes();
break;
}
}
void seconds(){
display.setBrightness(7, true);
display.showNumberDec(secondi, true, 2, 2);
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
secondi ++;
if(secondi > 59){
secondi = 0;
}
} else {
secondi --;
if(secondi < 0){
secondi = 59;
}
}
Serial.print("SECONDI: ");
Serial.println(secondi);
}
aLastState = aState;
}
void minutes(){
display.setBrightness(7, true);
display.showNumberDec(minuti, true, 2, 0);
aState_ = digitalRead(outputA);
if (aState_ != aLastState_){
if (digitalRead(outputB) != aState_) {
minuti ++;
if(minuti > 99){
minuti = 0;
}
} else {
minuti --;
if(minuti < 0){
minuti = 99;
}
}
Serial.print("MINUTI: ");
Serial.println(minuti);
}
aLastState_ = aState_;
}