Mogę operować wyświetlaczem, aby uzyskać potrzebną ilość kroków do celu. Wszystko działa ślicznie, obydwa silniki pracują równocześnie ( także z innymi prędkościami) ale pojawił się problem z którym nie mogę sobie poradzić..... Aby uzyskać jeden obrót muszę zaprogramować 200 kroków- no i to jest logiczne, ale zupełnie nie do przyjęcia np przy zaprogramowaniu 300 obrotów

Arduino UNO, TB6600
//Program pozwala działać na dwóch silnikach równocześnie
//z dowolnym wyborem celu (w krokach) dla każdego silnika.
// dla jednego silnika guzik 12, dla drugiego 13
//Włączenie 12 i 13 obsługuje jednocześnie dwa silniki.
// Działają bez problemów. W moim przypadku nie szkodzą mi delay(1), Jest OK.
#include <AccelStepper.h>
#include <MultiStepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
class Button{
uint8_t pin;
bool last_state;
unsigned long timmer, debounce;
public:
Button(uint8_t _pin,unsigned long _debounce = 10){
pin = _pin;
debounce = _debounce;
pinMode(pin, INPUT_PULLUP);
}
bool keyDown(){
if(millis()-timmer >= debounce){
timmer = millis();
bool state_now = !digitalRead(pin);
if(last_state == false && state_now == true){
last_state = state_now;
return true;
}else{
last_state = state_now;
return false;
}
}else{
return false;
}
}
bool keyUp(){
if(millis()-timmer >= debounce){
timmer = millis();
bool state_now = !digitalRead(pin);
if(last_state == true && state_now == false){
last_state = state_now;
return true;
}else{
last_state = state_now;
return false;
}
}else{
return false;
}
}
};
//Program pozwala działać na dwóch silnikach równocześnie
//z dowolnym wyborem celu (w krokach) dla każdego silnika.
// dla jednego silnika guzik 12, dla drugiego 13
//Włączenie 12 i 13 obsługuje jednocześnie dwa silniki.
// Działają bez problemów. W moim przypadku nie szkodzą mi delay(1), Jest OK.
// Definicje pinów dla silnika i przycisku
#define M1_STEP_PIN 3
#define M1_DIR_PIN 4
#define M2_STEP_PIN 2,
#define M2_DIR_PIN 5
#define BUTTON_PIN 13
#define BUTTON_PIN1 12
#define ZWIEKSZ 6
AccelStepper M1(1,3,4);
AccelStepper M2(1,2,5);
int kroki = 0;
int targetSteps = 0; // Liczba kroków do wykonania
int stepCount = 0;
bool running = false; // Flaga do kontroli stanu silnika
bool buttonStatePrevious = HIGH; // Poprzedni stan przycisku
int targetSteps1 = 0; // Liczba kroków do wykonania
int stepCount1 = 0;
bool running1 = false; // Flaga do kontroli stanu silnika
bool buttonStatePrevious1 = HIGH; // Poprzedni stan przycisku
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUTTON_PIN1, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP); //zwiększ
M1.setMaxSpeed(1000);
M1.setSpeed(500);
M2.setMaxSpeed(1000);
M2.setSpeed(500);
Serial.begin(9600);
lcd.init();
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("kroki");
}
void loop() {
if(btn1.keyDown()){
lcd.setCursor(0, 0); //dzięki tej sekcji będzie od razu widać po naciśnięciu klawisza 10 do jakiej funkcji program wchodzi.
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("obr: ");
lcd.print(kroki);
if (digitalRead(6) == LOW) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
kroki++;
lcd.print("obr: ");
lcd.print(kroki);
lcd.print(" ");
//delay(300);
}
}
int buttonState = digitalRead(13);
delay(1);
// Sprawdź, czy przycisk został wciśnięty (zbocze narastające)
if (buttonState == LOW && buttonStatePrevious == HIGH) {
buttonStatePrevious = buttonState; // Aktualizacja poprzedniego stanu przycisku
running = !running; // Przełącz stan silnika (start/stop)
stepCount = 0; // Reset liczby kroków przy starcie
} else {
buttonStatePrevious = buttonState; // Aktualizacja poprzedniego stanu przycisku
}
// Uruchom lub zatrzymaj silnik w zależności od stanu
if (running) {
M1.runSpeed(); // Utrzymywanie stałej prędkości
//M2.runSpeed();
targetSteps = kroki ;
stepCount++;
if (stepCount >= targetSteps) {
running = false; // Zatrzymaj silnik po osiągnięciu liczby kroków
}
}
int buttonState1 = digitalRead(BUTTON_PIN1);
delay(1);
if (buttonState1 == LOW && buttonStatePrevious1 == HIGH) {
buttonStatePrevious1 = buttonState1;
running1 = !running1;
stepCount1 = 0;
} else {
buttonStatePrevious1 = buttonState1;
}
if (running1) {
M2.runSpeed();
stepCount1++;
if (stepCount1 >= targetSteps1) {
running1 = false;
}
}
}