Ich hab gerade ein bisschen was durchgetestet. Bislang war die Encoder Libary nicht das schlechteste, aber defentiv noch nicht das, was ich davon gerne erwarte. Der Sketch unten ist weder vollständig, noch zwingend ordentlich oder korrekt. Fehler sind bekannt, vorallem das falsch gezählt wird beim Encoder auslesen.
@Jurs, sicher kann man auch unter bestimmten Umständen jeden Encoder verwenden, mir gefällt der Alps Encoder dennoch nicht. Die Drehungen gehen verhältnismäßig sehr schwer. Die Rastung ist sehr stark. Des weitern muss ein starker Druck erfolgen, um den Taster zu betätigen.
Alternativ würde ich auch einen Encoder nehmen, der keinen Taster hat. Dann würde ich auch die MenüItems mit einem Button + Encoder durchschalten.
Taster schaltet durch (Modus, Rot, Grün, Blau, Helligkeit, Geschwindigkeit, Weite) und mit dem Encoder soll dann der Wert +1 oder -1 den Wert umschalten.
Preislich sollte der Encoder wenn möglich unter 10€ inkl. Versand bleiben.
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <Bounce2.h>
#include <Encoder.h>
/* ITEAD 1.8" Display 160x240 */
#include <SPI.h>
#define TFT_CS 10
#define TFT_SCL 13
#define TFT_SDA 11
#define TFT_RS 9
#define TFT_RST 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_RS, TFT_SDA, TFT_SCL, TFT_RST);
/* ALPS Drehencoder + Button */
#define ENCODER_A 2
#define ENCODER_B 3
#define ENCODER_C 4
Encoder encoder(2, 3);
//Bounce encoderA = Bounce();
//Bounce encoderB = Bounce();
Bounce encoderC = Bounce();
/* Button */
#define BUTTON 5
Bounce button = Bounce();
void pillar(int x, int y, int val, unsigned int color)
{
x += 4; y += 4;
int mapVal = map(val, 0, 255, 0, 85);
tft.fillRect(x, y, 12, 85 - mapVal, 0x0000);
tft.fillRect(x, y + 85 - mapVal, 12, mapVal, color);
tft.setTextColor(0xFFFF, 0x0000);
tft.setCursor(x - 2, y + 90);
if (val < 10) tft.print(" ");
else if (val < 100) tft.print(" ");
tft.print(val);
}
int main(void)
{
init();
/* ITEAD 1.8" Display 160x240 */
tft.initR(INITR_BLACKTAB);
tft.setRotation(3);
tft.fillScreen(0x0000);
for (int i = 0; i < 6; i++) tft.drawRect(i * 25 + 7, 20, 20, 93, 0xFFFF);
tft.drawRect(7, 20, 20, 93, 0x00FF);
/* ALPS Drehencoder + Button */
pinMode(ENCODER_A, INPUT_PULLUP);
pinMode(ENCODER_B, INPUT_PULLUP);
pinMode(ENCODER_C, INPUT_PULLUP);
// encoderA.attach(ENCODER_A);
// encoderA.interval(1);
// encoderB.attach(ENCODER_B);
// encoderB.interval(5);
encoderC.attach(ENCODER_C);
encoderC.interval(50);
/* Button */
pinMode(BUTTON, INPUT_PULLUP);
button.attach(BUTTON);
button.interval(20);
while (1)
{
static int data[6];
static unsigned colorData[6] = { ST7735_RED, ST7735_GREEN, ST7735_BLUE, ST7735_YELLOW, ST7735_CYAN, ST7735_MAGENTA };
enum data
{
red, green, blue, brightness, speed, width
};
/* ALPS Button */
static int value1;
static int lastValue1;
if (encoderC.update() && !encoderC.read()) value1++;
if (value1 < 0 || value1 > 5) value1 = 0;
if (value1 != lastValue1)
{
lastValue1 = value1;
for (int i = 0; i < 6; i++) tft.drawRect(i * 25 + 7, 20, 20, 93, 0xFFFF);
tft.drawRect(value1 * 25 + 7, 20, 20, 93, 0x00FF);
}
/* Button */
static int value2;
static int lastValue2;
if (button.update() && !button.read()) value2++;
if (value2 < 0 || value2 > 20) value2 = 0;
if (value2 != lastValue2)
{
lastValue2 = value2;
tft.setCursor(0, 0);
tft.setTextColor(0x0000, 0xFFFF);
if (value2 < 10) tft.print(0);
tft.print(value2);
}
/* ALPS Drehencoder */
int newPos = encoder.read();
static int oldPos;
if (newPos != oldPos)
{
oldPos = newPos;
data[value1] += newPos;
if (data[value1] > 255) data[value1] = 255;
pillar(value1 * 25 + 7, 20, data[value1], colorData[value1]);
}
}
return 0;
}