#include <AccelStepper.h>
#include <Arduino.h> // Aggiungiamo la libreria Arduino.h per accedere a delay()
// Collegamenti dei pin del driver A4988
const int dirPin = 5;
const int stepPin = 6;
// Collegamento del pulsante
const int buttonPin = 11;
unsigned long buttonPressTime = 0;
const unsigned long longPressTime = 1500; // 1500 millisecondi = 1.5 secondo
// Creazione dell'oggetto stepper
AccelStepper stepper(AccelStepper::FULL4WIRE, stepPin, dirPin);
// Variabili di controllo della velocità del motore
const float rpm2 = 800.0;
const float rpm1 = 400.0;
float currentRPM = 0;
int val = 0; // si userà val per conservare lo stato del pin di input
int vecchio_val = 0; // si userà vecchio_val per conservare lo stato del pin di input al passo precedente
int stato = 0; // ricorda lo stato in cui si trova
float accelerazione = 0.5; //valore per cambio velocità e frenata
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
stepper.setMaxSpeed(10000); // Velocità massima in passi al secondo (puoi modificarla se necessario)
stepper.setAcceleration(100); // Accelerazione in passi al secondo
// Assicuriamoci che lo stepper sia posizionato a zero all'avvio
//stepper.setCurrentPosition(0);
Serial.begin(9600); // open the serial port at 9600 bps:
}
void loop() {
val = digitalRead(buttonPin); // legge il valore dell'input e lo conserva
// Controllo se il pulsante è stato premuto
// controlla se è accaduto qualcosa
if ((val == LOW) && (vecchio_val == HIGH)){
stato = 1 - stato;
if(stato == -1){
stato = 1;
}
buttonPressTime = millis();
//delay(15); // attesa di 15 millisecondi
stepper.runSpeed();
delay(20); // Debouncing - ritardo di 20 ms
while (digitalRead(buttonPin) == LOW) {
stepper.runSpeed();
} // Attendi che il pulsante venga rilasciato
unsigned long buttonReleaseTime = millis();
unsigned long buttonPressDuration = buttonReleaseTime - buttonPressTime;
// Gestione delle diverse azioni in base alla durata della pressione del pulsante
if (buttonPressDuration >= longPressTime) {
stato = 2;
float velocita = currentRPM*360/60;
while(velocita > 0){
velocita = velocita - accelerazione;
stepper.setSpeed(velocita);
stepper.runSpeed();
}
Serial.println("stop");
stepper.setSpeed(0); // Convertiamo RPM in passi al secondo
stepper.runSpeed();
currentRPM = 0;
delay(20);
}else{
if (stato == 1) {
if(currentRPM == 0){
//mi trovo nell'avvio
float velocita = 0;
while(velocita < rpm1*360/60){
velocita = velocita + accelerazione;
stepper.setSpeed(velocita);
stepper.runSpeed();
}
Serial.println("velocita rpm1");
}else{
//sto rallentando da rpm2
float velocita = rpm2*360/60;
while(velocita > rpm1*360/60){
velocita = velocita - accelerazione;
stepper.setSpeed(velocita);
stepper.runSpeed();
}
Serial.println("velocita da rpm2 a rpm1");
}
currentRPM = rpm1;
}else if (stato == 0){
float velocita = rpm1*360/60;
while(velocita < rpm2*360/60){
velocita = velocita + accelerazione;
stepper.setSpeed(velocita);
stepper.runSpeed();
}
Serial.println("velocita rpm2");
currentRPM = rpm2;
}
stepper.setSpeed(currentRPM * 360 / 60); // Convertiamo RPM in passi al secondo
stepper.runSpeed();
delay(20);
}
}
vecchio_val = val; // ricordiamo il valore precedente di val
// Aggiorna il motore (se in movimento)
stepper.runSpeed();
}