#include <SevSeg.h> // Knihovna pro řízení 7segmentového displeje
#include <Stepper.h> // Knihovna pro ovládání krokového motoru
SevSeg sevseg;
// STEPPER
const int stepsPerRevolution = 2048; // Počet kroků pro jednu otáčku motoru
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11); //přiřazení pinů (8=-A, 10=+A, 9=-B, 11=+B)
// POTENCIOMETR
int potPin = A0; // Potenciometr připojen na pin A0
// TLACITKO
int buttonPin = 2; // Tlačítko na pinu 2
// PROMĚNNÉ
int displayedValue = 0; // Hodnota zobrazovaná na displeji
int lastStepperPos = 0; // Poslední známá pozice motoru
bool confirmed = false; // Stav potvrzení (1. stisk = na hodnotu, 2. stisk = na nulu)
void setup() {
// Seven-Segment Display
byte numDigits = 4; // Displej má 4 číslice
byte digitPins[] = {3, 4, 5, 6}; // Piny pro zapínání jednotlivých číslic
byte segmentPins[] = {7, 12, 13, A1, A2, A3, A4}; // Piny pro segmenty (a,b,c,d,e,f,g)
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
sevseg.setBrightness(90); // Nastavení jasu displeje
myStepper.setSpeed(15); // Nastavení rychlosti krokového motoru (15 RPM)
pinMode(buttonPin, INPUT_PULLUP); // Tlačítko jako vstup
}
void loop() {
// POTENCIOMETR 0–2048
int pot = analogRead(potPin); // Přečtení hodnoty potenciometru (0–1023)
displayedValue = map(pot, 0, 1023, 0, 2048); // Přemapování na 0–2048 (0 až celá otáčka)
sevseg.setNumber(displayedValue); // Zobrazení hodnoty na displeji
// TLACITKO – potvrzení
if (digitalRead(buttonPin) == LOW) { // Pokud je tlačítko stisknuté
delay(300);
if (!confirmed) { // Pokud ještě nebylo potvrzené
int delta = displayedValue - lastStepperPos; // Rozdíl mezi cílem a aktuální pozicí
if (delta != 0) { // Pokud je potřeba motor pohnout
myStepper.step(-delta); // Posun motoru (v opačné polaritě)
lastStepperPos = displayedValue; // Uložení nové pozice
}
confirmed = true; // Nyní čeká na 2. stisk
}
else { // Pokud už bylo potvrzeno — druhý stisk
int delta = 0 - lastStepperPos; // Rozdíl do pozice nula
if (delta != 0) { // Pokud není motor v nule
myStepper.step(-delta); // Návrat motoru do nuly
lastStepperPos = 0; // Uložení pozice 0
}
confirmed = false; // Vrací se zpět do stavu prvního stisku
}
}
sevseg.refreshDisplay();
}