#include <Adafruit_NeoPixel.h>
#define LED_PIN 2 // Pin na koji je povezana WS2812 LED traka
#define NUM_LEDS 8 // Broj LED dioda na traci
#define ENCODER_CLK 8 // Pin za CLK signal enkodera
#define ENCODER_DT 9 // Pin za DT signal enkodera
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
int encoderPos = 0; // Trenutna pozicija enkodera
int lastEncoderPos = -1; // Prethodna pozicija enkodera
int lastClkState; // Država CLK pina enkodera
void setup() {
strip.begin(); // Pokretanje LED trake
strip.show(); // Osiguravamo da su sve LED diode ugašene
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
lastClkState = digitalRead(ENCODER_CLK); // Čitanje početnog stanja CLK pina
}
void loop() {
int currentClkState = digitalRead(ENCODER_CLK);
// Detekcija promene stanja na CLK pinu enkodera
if (currentClkState != lastClkState && currentClkState == LOW) {
if (digitalRead(ENCODER_DT) != currentClkState) {
encoderPos++; // Rotacija u smeru kazaljke na satu
} else {
encoderPos--; // Rotacija suprotno od smera kazaljke na satu
}
encoderPos = constrain(encoderPos, 0, NUM_LEDS - 1); // Ograničavamo na broj LED dioda minus prva
}
lastClkState = currentClkState;
// Ako je promenjena pozicija enkodera, ažuriramo LED traku
if (encoderPos != lastEncoderPos) {
updateLEDs(encoderPos);
lastEncoderPos = encoderPos;
}
}
void updateLEDs(int pos) {
// Gasi sve diode osim prve
for (int i = 1; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 0); // Gasi sve diode osim prve
}
// Uvek uključujemo prvu diodu kao zelenu
strip.setPixelColor(0, strip.Color(0, 255, 0)); // Prva dioda je uvek zelena
// Pali diode u zavisnosti od pozicije enkodera
for (int i = 1; i <= pos; i++) {
if (i < 3) {
strip.setPixelColor(i, strip.Color(0, 255, 0)); // Zelene diode (druga i treća)
} else if (i < 6) {
strip.setPixelColor(i, strip.Color(255, 255, 0)); // Žute diode (četvrta, peta i šesta)
} else if (i < 8) {
strip.setPixelColor(i, strip.Color(255, 0, 0)); // Crvene diode (sedma i osma)
}
}
strip.show(); // Ažuriramo traku
}