Indice
Descrizione
Nella vasta gamma di dispositivi di input disponibili per i progetti di Arduino, l'encoder rotativo spicca per la sua versatilità e facilità d'uso. Immagina questo componente come il ponte tra il movimento fisico e il mondo digitale, traducendo le tue azioni in segnali digitali che Arduino può comprendere.
Imparerai a collegare l'encoder ai pin di Arduino, comprendendo il ruolo dei vari pin come CLK, DT e, se presente, il pulsante integrato. Oltre all'aspetto hardware, esamineremo anche la gestione del movimento rotativo e del pulsante attraverso nello sketch di Arduino. Questo ti consentirà di interpretare i segnali provenienti dall'encoder e di reagire di conseguenza, aprendo la strada a una varietà di applicazioni interattive.
Infine, esploreremo la creazione di un menu sul display LCD controllato tramite l'encoder rotativo. Questo processo coinvolge la scrittura di codice che risponde alle rotazioni e alle pressioni del pulsante, consentendo agli utenti di navigare e selezionare opzioni sul display. Grazie a questa guida, sarai in grado di sfruttare appieno il potenziale dell'encoder rotativo nei tuoi progetti Arduino, aggiungendo un livello di interattività e controllo che arricchirà l'esperienza dell'utente finale.
#include <Encoder.h>
#define DT_PIN 2
#define CLK_PIN 3
#define BUTTON_PIN 4
Encoder encoder(DT_PIN, CLK_PIN);
int lastEncoderValue = 0;
int lastButtonState = LOW;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
int encoderValue = encoder.read() / 4;
int buttonState = !digitalRead(BUTTON_PIN);
if (encoderValue != lastEncoderValue) {
Serial.println("Encoder: " + String(encoderValue));
}
lastEncoderValue = encoderValue;
if (buttonState != lastButtonState && buttonState == HIGH) {
encoder.write(0);
delay(200);
}
lastButtonState = buttonState;
}
#include <Encoder.h>
#include <LiquidCrystal_I2C.h>
#define DT_PIN 2
#define CLK_PIN 3
#define BUTTON_PIN 4
#define MENU_LENGTH 5
Encoder encoder(DT_PIN, CLK_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int lastEncoderValue = 0;
int lastButtonState = LOW;
int currentMenu = 0;
int lastMenu = -1;
bool isMenuSelected = false;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.clear();
}
void loop() {
int buttonState = !digitalRead(BUTTON_PIN);
if (buttonState != lastButtonState && buttonState == HIGH) {
isMenuSelected = !isMenuSelected;
if (isMenuSelected) {
selectMenu(currentMenu);
lastMenu = -1;
} else {
lastEncoderValue = 0;
encoder.write(lastEncoderValue);
}
delay(200);
}
lastButtonState = buttonState;
if (isMenuSelected) {
return;
}
currentMenu = constrainMenu(currentMenu + readDelta());
if (currentMenu != lastMenu) {
showMenu(currentMenu);
lastMenu = currentMenu;
}
}
int readDelta() {
int value = encoder.read() / 4;
int delta = value - lastEncoderValue;
lastEncoderValue = value;
return delta;
}
int constrainMenu(int value) {
return value - MENU_LENGTH * floor((float) value / MENU_LENGTH);
}
void printCentered(String text, int row) {
lcd.setCursor((16 - text.length()) / 2, row);
lcd.print(text);
}
void showMenu(int menu) {
lcd.clear();
printCentered("MENU", 0);
switch (menu) {
case 0: printCentered("01 - opzione 1", 1); break;
case 1: printCentered("02 - opzione 2", 1); break;
case 2: printCentered("03 - opzione 3", 1); break;
case 3: printCentered("04 - opzione 4", 1); break;
case 4: printCentered("05 - opzione 5", 1); break;
}
}
void selectMenu(int menu) {
lcd.clear();
printCentered("Hai scelto:", 0);
switch (menu) {
case 0: printCentered("opzione 1", 1); break;
case 1: printCentered("opzione 2", 1); break;
case 2: printCentered("opzione 3", 1); break;
case 3: printCentered("opzione 4", 1); break;
case 4: printCentered("opzione 5", 1); break;
}
}