Untitled
unknown
plain_text
5 months ago
6.6 kB
3
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