#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
const byte ROWS = 4; // Liczba wierszy klawiatury
const byte COLS = 3; // Liczba kolumn klawiatury
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {2, 3, 4, 5}; // Piny wierszy klawiatury
byte colPins[COLS] = {6, 7, 8}; // Piny kolumn klawiatury
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Ustawienia LCD z interfejsem I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adres I2C wyświetlacza, liczba kolumn, liczba wierszy
// Konfiguracja silnika krokowego
const int stepsPerRevolution = 200; // Kroków na pełny obrót silnika
const int motorPin1 = 9; // Pin 9 na Arduino - IN1 na sterowniku L298N
const int motorPin2 = 10; // Pin 10 na Arduino - IN2 na sterowniku L298N
const int motorPin3 = 11; // Pin 11 na Arduino - IN3 na sterowniku L298N
const int motorPin4 = 12; // Pin 12 na Arduino - IN4 na sterowniku L298N
Stepper stepper(stepsPerRevolution, motorPin1, motorPin3); // Utworzenie obiektu silnika krokowego
// Piny dla przekaźnika sterującego siłownikiem
const int COIL1_PIN = A1; // Pin A1 do sterowania cewką 1 (wysuwanie siłownika)
const int COIL2_PIN = A2; // Pin A2 do sterowania cewką 2 (wsuwanie siłownika)
String inputLength = ""; // Zmienna przechowująca wprowadzoną długość przewodu
String inputQuantity = ""; // Zmienna przechowująca wprowadzoną ilość sztuk
bool enterLength = true; // Flaga określająca czy wprowadzamy długość (true) czy ilość (false)
void setup() {
Serial.begin(9600); // Inicjalizacja komunikacji szeregowej
lcd.init(); // Inicjalizacja wyświetlacza LCD
lcd.backlight(); // Włączenie podświetlenia LCD
lcd.clear(); // Wyczyszczenie LCD
lcd.setCursor(0, 0);
// Zapytaj użytkownika o wymianę szpuli
lcd.clear(); // Wyczyszczenie wyświetlacza
lcd.setCursor(0, 0); // Ustawienie kursora na początku pierwszej linii
lcd.print("Wymienic szpule?"); // Wyświetlenie pytania
lcd.setCursor(0, 1); // Ustawienie kursora na początku drugiej linii
lcd.print("1-Tak / 2-Nie"); // Wyświetlenie opcji odpowiedzi
while(true) {
char key = keypad.getKey(); // Pobranie klawisza od użytkownika
if (key == '1') {
// Użytkownik potwierdził chęć wymiany szpuli
lcd.clear(); // Wyczyszczenie wyświetlacza
lcd.setCursor(0, 0); // Ustawienie kursora na początku pierwszej linii
lcd.print("Wymiana..."); // Informacja o wymianie
delay(2000); // Odczekanie dwóch sekund dla symulacji wymiany szpuli
break; // Wyjście z pętli
} else if (key == '2') {
// Użytkownik odrzucił chęć wymiany szpuli
break; // Wyjście z pętli
}
delay(100); // Krótkie opóźnienie między kolejnymi odczytami klawisza
}
lcd.clear();
lcd.print("Wprowadz dlugosc (s):");
stepper.setSpeed(100); // Ustawienie prędkości obrotowej silnika (100 kroków na sekundę)
// Inicjalizacja pinów dla przekaźnika sterującego siłownikiem
pinMode(COIL1_PIN, OUTPUT);
pinMode(COIL2_PIN, OUTPUT);
// Ustawienie początkowe przekaźnika (wsunięty siłownik)
digitalWrite(COIL1_PIN, HIGH); // IN1 - stan wysoki (wsuwanie)
digitalWrite(COIL2_PIN, LOW); // IN2 - stan niski (wsuwanie)
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
if (key == '*') {
if (enterLength) {
// Zmiana trybu na wprowadzanie ilości
enterLength = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wprowadz ilosc:");
} else {
// Zakończenie wprowadzania i wyświetlenie wyników
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dlugosc: ");
lcd.print(inputLength);
lcd.setCursor(0, 1);
lcd.print("Ilosc: ");
lcd.print(inputQuantity);
// Obliczenie czasu trwania jednego obrotu silnika (w milisekundach)
float durationSeconds = inputLength.toFloat(); // Konwersja długości na liczbę zmiennoprzecinkową (s)
int durationMillis = durationSeconds * 1000; // Przeliczenie na milisekundy
// Wykonanie obrotów silnika zgodnie z wprowadzoną ilością
for (int i = 0; i < inputQuantity.toInt(); ++i) {
rotateMotor(durationMillis);
// Sterowanie siłownikiem - Wysuwanie
digitalWrite(COIL1_PIN, LOW); // IN1 - stan niski (wysuwanie)
digitalWrite(COIL2_PIN, HIGH); // IN2 - stan wysoki (wysuwanie)
delay(1000); // Czas wysunięcia (1 sekunda)
// Powrót siłownika - Wsuwanie
digitalWrite(COIL1_PIN, HIGH); // IN1 - stan wysoki (wsuwanie)
digitalWrite(COIL2_PIN, LOW); // IN2 - stan niski (wsuwanie)
delay(1000); // Czas wsunięcia (1 sekunda)
delay(1000); // Przerwa między kolejnymi obrotami
}
// Resetowanie zmiennych i powrót do wprowadzania długości
inputLength = "";
inputQuantity = "";
enterLength = true;
// Wyświetlenie komunikatu początkowego
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Wprowadz dlugosc (s):");
}
} else if (key == '#') {
// Ignorowanie znaku '#' - nie wykonuje żadnej akcji
} else {
// Dodawanie wprowadzonych cyfr do odpowiednich zmiennych
if (enterLength) {
inputLength += key;
lcd.setCursor(0, 1);
lcd.print(inputLength);
} else {
inputQuantity += key;
lcd.setCursor(0, 1);
lcd.print(inputQuantity);
}
}
}
}
// Funkcja obracająca silnik przez określony czas w jednym kierunku (zgodnie z ruchem wskazówek zegara)
void rotateMotor(int duration) {
unsigned long startTime = millis();
while (millis() - startTime < duration) {
// Sekwencja kroków w jednym kierunku (do przodu)
stepper.step(stepsPerRevolution);
delayMicroseconds(1000); // Opóźnienie między krokami
}
}