Salutando e ringraziando anticipatamente per la cortesia, vi spiego il mio problema:
Ho creato un sistema composto da due motori stepper e due fotocellule che voglio definire "trasportatore". I due motori muovono due cinghie che devono portare una serie di oggetti da una parte all'altra di un nastro convogliatore, la prima fotocellula ha la funzione di attivare il trasportatore quando un oggetto si presenta davanti alla fotocellula stessa, mentre la seconda fotocellula, posizionata all'uscita del trasportatore, deve fermare il trasportatore nel caso in cui si formi una "coda" di oggetti in accumulo. A tutto questo ho aggiunto due pulsanti per incrementare e decrementare la velocità degli stepper, che girano in senso opposto uno all'altro, e ho montato un display a due righe per visualizzare la velocità impostata.
Il codice che ho scritto fa esattamente quello che vi ho appena descritto, ma il mio problema nasce dal fatto che, giunto fino a qui, dovrei anche impostare un ritardo dell'intervento delle fotocellule in quanto la loro azione immediata non è funzionale al sistema. Per esempio, nel momento in cui la fotocellula in ingresso è stata attivata da un oggetto in arrivo, nel momento in cui si libera devo attendere che l'oggetto stesso sia passato dall'atra parte del trasportatore, perché diversamente è un continuo di stop&go. Idem per quella in uscita.
E qui arriva il mio problema: il comando delay, che ho utilizzato (forse) in modo troppo esteso, non posso più utilizzarlo in quanto mi rallenta i motori fino a fermarli.
Allego il mio codice:
#include <Wire.h>
#include <EEPROM.h> //libreria relativa alla lettura e scrittura sulla EEPROM
#include <PCF8574_HD44780_I2C.h> //Gestione del monitor LCD
PCF8574_HD44780_I2C lcd(0x27,16,2);
const int buttonUpPin = 8; //numero pin a cui è collegato il pulsante di UP
const int buttonDownPin = 9; //numero pin a cui è collegato il pulsante di DOWN
int buttonUpState; //stato attuale del pulsante di UP
int buttonDownState; //stato attuale del pulsante di Down
long UpDebounceTime; //Variabilie di appoggio per calcolare il tempo di cambio di stato del pulsante di UP
long UpDebounceTimeF1;
long UpDebounceTimeF2;
long DownDebounceTime; //Variabilie di appoggio per calcolare il tempo di cambio di stato del pulsante di Down
long DownDebounceTimeF1;
long DownDebounceTimeF2;
long timerButtonPushed; //tempo che indica da quanto è stato premuto il pulsante
long timerPauseRepeat; //tempo che indica da quanto è stata fatta l'ultima ripetizione
long time_add_10 = 1000; //costante per attivare ripetizione da +10
long time_add_100 = 5000; //costante per attivare ripetizione da +100
long time_pause = 250; //costante che determina il tempo di ripetizione di UP e di DOWN
long debounceDelay = 80; //Tempo di debounce per i pulsanti UP e DOWN
boolean repeatEnable = LOW; //memoria che indica il repeat del pulsante attivo
unsigned int counter = 0; //dichiaro un contatore che mi servirà per il delay della fotocellula 1
int var = 0; //variabile da aumentare o diminuire come valore
const int varMax = 100; //limite massimo valore della variabile
const int varMin = 0; //limite minimo valore della variabile
int readingUp = 0; //Lettura ingresso digitale del pulsante di UP
int readingDown = 0; //Lettura ingresso digitale del pulsante di Down
byte DatoEEprom; // dichiaro il dato che salverò sulla EEPROM
// Definisco i pin per lo stepper:
#define dirPin2 2 //definisco il pin che stabilisce la direzione del motore 1
#define stepPin3 3 //definisco il pin che stabilisce lo step del motore 1
#define dirPin4 4 //idem C.S.
#define stepPin5 5 //idem C.S.
#define pinsensor_1 6 //fotocellula in ingresso
#define pinsensor_2 7 //fotocellula in uscita
int val1 = 0;
int val2 = 0;
void setup() {
lcd.init(); // Inizializzo LCD
lcd.backlight(); // Backlight ON
lcd.clear(); // pulisce lo screen
lcd.setCursor(0,0); // porta il cursore a colonna 0, riga 0
lcd.print("PROVA PROVA"); // Prima riga
lcd.setCursor(0,1); // porta il cursore a colonna 0, riga 0
lcd.print("PROVA");
delay(3000);
lcd.clear();
lcd.print("PROVA"); // Prima riga
lcd.setCursor(0,1); // porta il cursore a colonna 0, riga 0
lcd.print("PROVA2");
delay (2000);
lcd.setCursor(0,0); // porta il cursore a colonna 0, riga 0
lcd.print("REGOLAZ.VELOCITA'"); // Prima riga
lcd.setCursor(0,1); // porta il cursore a colonna 0, riga 0
lcd.print("- +");
DatoEEprom = EEPROM.read(1); //Leggo il dato salvato sulla EEPROM nello slot 1
var = EEPROM.read(1);
Serial.begin(9600); // impostazione baudrate seriale
pinMode (buttonUpPin, INPUT); //impostazione buttonUpPin come ingresso
pinMode (buttonDownPin, INPUT); //impostazione buttonDownPin come ingresso
// Dichiaro i PIN di output:
pinMode(stepPin3, OUTPUT);
pinMode(dirPin2, OUTPUT);
pinMode(stepPin5, OUTPUT);
pinMode(dirPin4, OUTPUT);
pinMode(pinsensor_1, INPUT);
// imposto la direzione dei motori:
digitalWrite(dirPin2, HIGH); //il motore 1 gira in senso ANTIORARIO
digitalWrite(dirPin4, HIGH); //il motore 2 gira in senso ORARIO (Attenzione: nel caso dei NEMA13 non so perché ma in questo caso era LOW e non HIGH. Mistero).
}
void loop() {
readButtonState(); //Lettura stato buttons con controllo antirimbalzo
if (buttonUpState == HIGH || buttonDownState == HIGH) {
if ((repeatEnable == HIGH && ((millis() - timerPauseRepeat) > time_pause)) || repeatEnable == LOW) {
if ((millis() - timerButtonPushed) > time_add_10) {
if ((millis() - timerButtonPushed) > time_add_100) {
if (buttonUpState == HIGH) var = var + 100;
if (buttonDownState == HIGH) var = var - 100;
} else {
int resto = 0;
if (buttonUpState == HIGH) resto = 10 - (var % 10);
if (buttonDownState == HIGH) resto = (var % 10);
if (resto == 0){
if (buttonUpState == HIGH) var = var + 10;
if (buttonDownState == HIGH) var = var - 10;
} else{
if (buttonUpState == HIGH) var = var + resto;
if (buttonDownState == HIGH) var = var - resto;
}
}
} else {
if (buttonUpState == HIGH) var++;
if (buttonDownState == HIGH) var--;
}
timerPauseRepeat = millis();
repeatEnable = HIGH;
if (var > varMax) var = varMax;
if (var < varMin) var = varMin;
Serial.println(var);
EEPROM.write(1, var);
//***qui inizia la procedura per lo screeen LCD***
lcd.clear();
lcd.setCursor(0,0); // porta il cursore a colonna 0, riga 0
lcd.print(" VELOCITA'"); // Prima riga
lcd.setCursor(0,1); // porta il cursore a colonna 0, riga 0
var = EEPROM.read(1);
lcd.print(varMax - var); //questo mi serve per visualizzare la velocità correttamente, diversamente la vedrei decrescere invece che incrementarsi
}
} else {
timerButtonPushed = millis();
timerPauseRepeat = millis();
repeatEnable = LOW;
}
}
void readButtonState() {
int readingUp = digitalRead(buttonUpPin); //Lettura ingresso digitale del pulsante di UP
int readingDown = digitalRead(buttonDownPin); //Lettura ingresso digitale del pulsante di Down
if (readingUp == HIGH) {
if ((millis() - UpDebounceTime) > debounceDelay) {
buttonUpState = HIGH;
}
} else {
buttonUpState = LOW;
UpDebounceTime = millis();
}
if (readingDown == HIGH) {
if ((millis() - DownDebounceTime) > debounceDelay) {
buttonDownState = HIGH;
}
} else {
buttonDownState = LOW;
DownDebounceTime = millis();
}
val1 = digitalRead(pinsensor_1);
val2 = digitalRead(pinsensor_2);
if (val1 == HIGH)
if (val2 == LOW)
{
digitalWrite(stepPin3, HIGH);
digitalWrite(stepPin3, LOW);
digitalWrite(stepPin5, HIGH);
digitalWrite(stepPin5, LOW);
delayMicroseconds(var); //questo è il valore che determina la velocitÃ
}
}