Alla fine credo di avere risolto in questa maniera, anche se in realtà non so se il motorino riesce a percepire incrementi frazionari del tempo di ritardo tra un passo e l'altro o li avverte solo quando superano il millisecondo...
#include <LiquidCrystal.h>
#define SCENDI 2
#define SALI 3LiquidCrystal lcd(12, 13, 7, 6, 5, 4);
int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;int speedPinPot = 0;
int decelPinPot = 1;int i = 0;
int down = 0;
int up = 0;
int stop = 0;
int downDelayTime = 1;
double upDelayTime;
double ritardo;
long previousMillis = 0;
long interval = 100;void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);pinMode(SCENDI, INPUT);
pinMode(SALI, INPUT);
pinMode(speedPinPot, INPUT);
pinMode(decelPinPot, INPUT);lcd.begin(20, 2);
lcd.print("Vel.iniz.");
lcd.setCursor(16, 0);
lcd.print("mm/s");
lcd.setCursor(0, 1);
lcd.print("Deceler.");
lcd.setCursor(15, 1);
lcd.print("mm/s2");
}void loop() {
int speedReadPin = analogRead(speedPinPot);
upDelayTime = (map(speedReadPin, 0, 1024, 10000, 100000)/1000.);
double velocita = (1000/upDelayTime) * 0.226;int decelReadPin = analogRead(decelPinPot);
ritardo = (map(decelReadPin, 0, 1024, 0, 1000)/1000.);
double decelerazione = ( ( (1/upDelayTime) - (1/(upDelayTime + ritardo)) )/0.1 ) * 1000 * 0.226;lcd.setCursor(10, 0);
if (velocita < 10)
lcd.print(" ");
lcd.print(velocita);lcd.setCursor(10, 1);
if (decelerazione < 10)
lcd.print(" ");
lcd.print(decelerazione);down = digitalRead(SCENDI);
up = digitalRead(SALI);
if (down == HIGH)
scendi();
if (up == HIGH)
sali();
}void scendi() {
if(!stop) {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(downDelayTime);
i++;digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(downDelayTime);
i++;digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(downDelayTime);
i++;digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(downDelayTime);
i++;if (i > 164)
stop = 1;
}
}void sali() {
stop = 0;
while(i>0){
unsigned long currentMillis = millis();if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(upDelayTime);
i--;if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(upDelayTime);
i--;if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay( upDelayTime );
i--;if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(upDelayTime);
i--;
}}
Sapreste suggerirmi anche un metodo per visualizzare sul display l'apice del quadrato? Mi servirebbe per l'accelerazione da esprimere in mm/s^2.