Untitled

 avatar
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