Untitled
unknown
plain_text
a year ago
6.6 kB
4
Indexable
#include <Wire.h>
#include "DFRobot_RGBLCD1602.h"
// Definicje pinów
const int DIR_PIN = 8; // Pin do zmiany kierunku
const int STEP_PIN = 9; // Pin do kroku
const int SW_STEP = 2; // Przycisk krok
const int SW_DIR = 3; // Przycisk kierunek
const int ZERO_LICZNIK = 4; // Przycisk do zerowania licznika
const int ODLEGLOSC_KONKRETNA = 5; // Przycisk do przesunięcia o 5 kroków
const int LED_PIN = 11; // Pin do diody LED
// Zmienna stanu kierunku
boolean DIR_STATE = 0;
// Zmienna licząca kroki
long stepCount = 0; // Liczba wykonanych kroków
long stepsSinceReset = 0; // Liczba kroków od ostatniego zerowania
float mmPerStep = 0.0193; // Przemiana kroków na milimetry (1 krok = 0.0193 mm)
// Kolory wyświetlacza
const int colorR = 255; // Czerwony
const int colorG = 0; // Zielony
const int colorB = 0; // Czerwony (RGB)
// Inicjalizacja wyświetlacza LCD I2C
DFRobot_RGBLCD1602 lcd(0x60, 16, 2);
// Zmienna do debouncingu
unsigned long lastStepPressTime = 0;
const long debounceDelay = 50; // 50ms debouncing
// Funkcja aktualizacji wyświetlacza LCD
void updateDisplay() {
lcd.setCursor(0, 0);
lcd.print(" "); // Wyczyść górną linię
lcd.setCursor(0, 0);
lcd.print(stepCount); // Wyświetl licznik kroków
lcd.print(" ");
lcd.print(DIR_STATE == 0 ? "przod" : "tyl"); // Wyświetl kierunek
lcd.setCursor(0, 1);
lcd.print(" "); // Wyczyść dolną linię
lcd.setCursor(0, 1);
lcd.print(stepCount * mmPerStep, 3); // Wyświetlenie liczby kroków w mm
lcd.print(" mm"); // Dodanie jednostki "mm"
}
void setup() {
// Konfiguracja pinów
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(SW_STEP, INPUT_PULLUP);
pinMode(SW_DIR, INPUT_PULLUP);
pinMode(ZERO_LICZNIK, INPUT_PULLUP); // Konfiguracja przycisku zerowania
pinMode(ODLEGLOSC_KONKRETNA, INPUT_PULLUP); // Konfiguracja przycisku odleglosc_konkretna
pinMode(LED_PIN, OUTPUT);
// Początkowy stan kierunku
digitalWrite(DIR_PIN, DIR_STATE);
// Inicjalizacja wyświetlacza LCD
lcd.init();
lcd.setBacklight(LOW); // Włączenie podświetlenia
lcd.setRGB(colorR, colorG, colorB); // Ustawienie koloru podświetlenia na czerwony
updateDisplay(); // Początkowa aktualizacja wyświetlacza
}
void loop() {
// Sprawdzanie stanu przycisku zmiany kierunku (toggle)
boolean currentDirButtonState = digitalRead(SW_DIR);
// Jeśli przycisk zmiany kierunku został wciśnięty (zmiana stanu z HIGH na LOW)
static boolean lastDirButtonState = HIGH;
if (lastDirButtonState == HIGH && currentDirButtonState == LOW) {
DIR_STATE = !DIR_STATE; // Zmiana kierunku
digitalWrite(DIR_PIN, DIR_STATE);
updateDisplay(); // Aktualizacja wyświetlacza
delay(200); // Debounce dla przycisku zmiany kierunku
}
// Sprawdzanie, czy przycisk krok jest wciśnięty (debouncing)
if (digitalRead(SW_STEP) == LOW && (millis() - lastStepPressTime > debounceDelay)) {
lastStepPressTime = millis(); // Zapamiętaj czas ostatniego naciśnięcia
// Jeśli przycisk jest trzymany, wykonaj kroki
digitalWrite(STEP_PIN, HIGH);
digitalWrite(LED_PIN, HIGH); // Włączenie diody LED
delay(5); // Krótki impuls kroku (5 ms)
digitalWrite(STEP_PIN, LOW);
digitalWrite(LED_PIN, LOW); // Wyłączenie diody LED
delay(5); // Krótki czas między krokami
// Zwiększenie lub zmniejszenie licznika kroków w zależności od kierunku
if (DIR_STATE == 0) {
stepCount++; // Zwiększanie liczby kroków, gdy kierunek jest 0 (np. w prawo)
stepsSinceReset++;
} else {
stepCount--; // Zmniejszanie liczby kroków, gdy kierunek jest 1 (np. w lewo)
stepsSinceReset--;
}
updateDisplay(); // Aktualizacja wyświetlacza
}
// Sprawdzanie przycisku ODLEGLOSC_KONKRETNA (przesunięcie o 5 kroków)
if (digitalRead(ODLEGLOSC_KONKRETNA) == LOW) {
for (int i = 0; i < 5; i++) {
digitalWrite(STEP_PIN, HIGH);
delay(5); // Krótki impuls kroku (5 ms)
digitalWrite(STEP_PIN, LOW);
delay(5);
// Zwiększenie lub zmniejszenie licznika kroków w zależności od kierunku
if (DIR_STATE == 0) {
stepCount++;
stepsSinceReset++;
} else {
stepCount--;
stepsSinceReset--;
}
}
updateDisplay(); // Aktualizacja wyświetlacza po wykonaniu 5 kroków
delay(200); // Krótkie opóźnienie dla debouncingu
}
// Sprawdzanie, czy przycisk zerowania licznika został przytrzymany przez 5 sekund
if (digitalRead(ZERO_LICZNIK) == LOW) {
unsigned long pressStartTime = millis();
while (digitalRead(ZERO_LICZNIK) == LOW) {
// Jeśli przycisk jest przytrzymany przez 5 sekund
if (millis() - pressStartTime >= 5000) {
// Cofnij lub przesuń do przodu do pozycji zerowej w zależności od stepsSinceReset
boolean originalDirState = DIR_STATE;
DIR_STATE = stepsSinceReset > 0 ? 1 : 0; // Cofnij lub przesuń do przodu
digitalWrite(DIR_PIN, DIR_STATE);
for (int i = 0; i < abs(stepsSinceReset); i++) {
digitalWrite(STEP_PIN, HIGH);
delay(5); // Krótkie opóźnienie dla płynności
digitalWrite(STEP_PIN, LOW);
delay(5);
stepCount += DIR_STATE == 0 ? 1 : -1; // Aktualizacja stepCount w odpowiednim kierunku
updateDisplay(); // Aktualizacja wyświetlacza
}
// Ustaw kroki od ostatniego zerowania na 0 po powrocie
stepsSinceReset = 0;
// Przywróć oryginalny kierunek
DIR_STATE = originalDirState;
digitalWrite(DIR_PIN, DIR_STATE);
break; // Przerwij pętlę po zakończeniu cofania
}
}
// Jeśli przycisk nie był trzymany przez 5 sekund, wyzeruj licznik kroków na wyświetlaczu
if (millis() - pressStartTime < 5000) {
stepCount = 0;
stepsSinceReset = 0;
updateDisplay(); // Aktualizacja wyświetlacza
}
delay(200); // Debounce dla przycisku zerowania
}
lastDirButtonState = currentDirButtonState; // Aktualizacja ostatniego stanu przycisku
}Editor is loading...
Leave a Comment