problema con led di segnalazione

ciao a tutti, chiedo un vostro aiuto dato che sono alle prime armi e prima di fare danni con la scheda sto provando il codice su un simulatore, quindi ci saranno sicuramente dei piccoli errori che poi andrò a correggere)

quello che voglio fare è che durante tutto il tempo in cui il servo è in movimento (penso che lo sostituirò con un motore passo/passo quindi il tempo sarà molto più lungo), due led lampeggino tipo flip-flop e poi si spengano dopo che il motore ha fatto andata e ritorno. è possibile?

vi allego la bozza del software che ho creato

#include <DHT.h>
#include <DHT_U.h>
#include <Servo.h>
#include "DHT.h"

Servo servo_4;
#define DHTPIN 9 //pin di collegamento sensore temperatura
#define DHTTYPE DHT11 //definizione modello

DHT dht(DHTPIN, DHTTYPE);

int stato; //per funzione relè


void setup()
{
  Serial.begin(9600); //comunicazione seriale per controllo su pc
  pinMode(5, INPUT);
  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
  servo_4.attach(4);
  pinMode(6, OUTPUT);
  stato=0; //per funzione relè
  dht.begin(); //inizializzazione comunicazione sensore
}

void loop()
{
  digitalRead(5); //controllo pulsante start
  delay(100);
  digitalRead(3); //controllo pulsante riarmo
  delay(100);
  float t = dht.readTemperature(); //dati sensore temperatura
  float h = dht.readHumidity(); //dati umidità
  Serial.print("Umidità: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" °C");
  
    
  if (digitalRead(5)==1 and stato==0) //funzione per effetto relè acceso
  {
    stato=1;
  }
  else if (digitalRead(3)==1 and stato==1) //funzione per effetto relè spento
  {
    stato=0;
  }
  if (stato==1) //accensione
  {
    digitalWrite(2, HIGH); //accensione led notifica
    servo_4.write(90); //rotazione servo per sgancio molla
    delay(400);
    if (t<=18) //imposta temperatura di accensione riscaldamento
    {
      digitalWrite (6, HIGH); // accensione relè riscaldamento
    }
    else if (t>=20) //imposta memperatura massima
    {
      digitalWrite (6, LOW); //spegnimento relè riscaldamento
    }
  } if (stato==0) //riarmo sistema
  {
    digitalWrite(2, LOW); //spegnimento led notifica
    servo_4.write(0); //rotazione servo per blocco molla
    digitalWrite(6, LOW); //spegnimento relè riscaldamento
  }
  delay(10); // Delay a little bit to improve simulation performance
}

in alternativa (se la funzione del lampeggio non è possibile farla) potrei optare per un buzzer passivo che suoni per tutto il tempo del movimento. questo è possibile farlo?

il metodo più grezzo sarebbe usare un buzzer attivo comandato da relè ma vorrei evitare questa opzione perchè vorrei scegliere la frequenza del suono

grazie

Dovresti cambiare la struttura del programma e utilizzare millis() invece di delay(). Col delay() il programma si blocca e non puoi fare altre cose, come appunto far lampeggiare i led.
In alternativa compri un led che lampeggia da solo e lo fai partire subito prima di avviare il motore...

fratt:
Dovresti cambiare la struttura del programma e utilizzare millis() invece di delay(). Col delay() il programma si blocca e non puoi fare altre cose, come appunto far lampeggiare i led.
In alternativa compri un led che lampeggia da solo e lo fai partire subito prima di avviare il motore...

Grazie per la risposta.
Mi stai dicendo che ci sono in commercio led che lampeggiano autonomamente? Cioè io dò un digitalwrite High e lui lampeggia?
Proverò anche a passare a millis

Non sono un elettronico, ma da qualche parte ho letto che ci sono dei led con all'interno un circuito che li fa lampeggiare. Quindi lampeggiano da soli. Ma non saprei dirti da dove cominciare a cercarli...

In ogni caso puoi fare tutto anche con un normalissimo led se strutturi il programma nel modo corretto.
Per cominciare a capire il funzionamento di millis() puoi guardare l'esempio dell'ide "blink without delay".

Perfetto grazie, domani mi metto davanti al PC e studio il millis.

acuplush:
Perfetto grazie, domani mi metto davanti al PC e studio il millis.

Prova a guardare prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

grazie per i link, mi sono fatto un po di cultura :slight_smile:
ora provo a buttare giù il codice, ma quindi io non andrò a dirgli "lampeggia finchè il motore gira, ma bensì devo vedere +o- quanto tempo ci mette a fare il percorso e lo impongo al codice, giusto?

edit: anzi, ora che ci penso ho un pulsante di finecorsa che devo utilizzare come "azzeramento motore, potrei dirgli che lampeggi per tutto il tempo in cui NON è premuto il pulsante (dato che il motore sarà in rotazione

sono riuscito ad integrare la parte di codice nel programma sfruttando il pulsante di finecorsa del motore e su simulatore funziona.
in tutte le guide ho trovato la procedura per far lampeggiare un solo led, ma io vorrei far alternare 2 led.
ho provato a modificare il codice (sicuramente sbagliando perchè il simulatore dà i numeri). allego qui parte del codice con la mia prova evidenziando l'aggiunta.

if (blinking) {
  currentMillis = millis(); // better to store in variable, for less jitter
  if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
   digitalWrite(7, !digitalRead(7)); // shortcut to toggle the LED
   previousMillis = currentMillis; // sets the time we wait "from"
   digitalWrite(2, LOW); //PROVA INTERMITTENZA CON GIALLLO
  }
 } else {
  digitalWrite(7, LOW); // force LED off when not blinking
 digitalWrite(2, HIGH); //PROVA INTERMITTENZA CON GIALLO
 }
 int reading = digitalRead(3);
 delay(50); // crude de-bouncing

praticamente la mia idea è stata che quando a un led viene dato il comando di high, all'altro ho impostato low.
ma lampeggia in modo anomalo... cosa ho sbagliato?

rieccomi qui con un'altro problema con il lampeggio.
sono passato dal test su simulatore alla prova reale ma ho un problema
quando i 2 led sono in lampeggio, ogni 2 secondi il lampeggio si "blocca" per circa 0.5/1 secondo e poi riparte ma non riesco a capire dovè il problema, ho solo un dalay da 50 e uno da 10, che sia quello il problema? praticamente il quel tempo si spegne anche il led RX sulla scheda mentre per tutto il resto del tempo rimane acceso
è che da quello che ho capito per un corretto funzionamento almeno un dalay serve... alego il mio codice

edit: anche togliendo i dalay il problema rimane

#include <DHT.h>


#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE);
int stato; //per funzione relè
int val=24; // temperatura da mantenere
int ledstato = 2;
int ledmovimento = 3;
int rele = 4;
int startcentrale = 5;
int finecorsa = 6;
int riarmo = 7;



//impostazioni per lampeggio
bool blinking = false; //defines when blinking should occur
unsigned long blinkInterval = 150; // number of milliseconds for blink
unsigned long currentMillis; // variables to track millis()
unsigned long previousMillis;

void setup()
{
  pinMode(startcentrale, INPUT); //pulsante avvio sistema
  pinMode(finecorsa, INPUT); //pulsante lampeggio movimento/reset motore
  pinMode(riarmo, INPUT); //pulsante riarmo
  pinMode(ledstato, OUTPUT); // led stato sistema prenotato
  pinMode(rele, OUTPUT); //relè riscaldamento
  pinMode(ledmovimento, OUTPUT); //led lampeggio movimento
  stato=0; //per funzione relè
  pinMode(DHTPIN, INPUT); // sensore temperatura

  digitalWrite (rele, HIGH); //stato relè spento ad accensione

//comunicazione seriale
Serial.begin(9600); // inizializzo la comunicazione seriale
Serial.println("Test Sensore DHTxx!");
Serial.println(""); 

dht.begin(); // inizializzo la comunicazione del sensore
  
}

void loop()
{
float h = dht.readHumidity();  //lettura umidita
float t = dht.readTemperature(); //lettura temperatura

// controllo l'avvenuta comunicazione, ed avvio la scrittuta dei dati sulla seriale, ed in caso negativo scrito che è fallita
if (isnan(t) || isnan(h)) {
Serial.println("Errore lettura sensore DHT FALLITA");
} else {
Serial.print("Umidita': "); 
Serial.print(h); 
Serial.print(" %\t"); 
Serial.print("Temperatura: "); 
Serial.print(t); 
Serial.println(" *C"); 
}

Serial.println(""); 
  // codice per lampeggio
 if (blinking) {
  currentMillis = millis(); // better to store in variable, for less jitter
  if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
   digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // led rosso
   digitalWrite((ledstato), !digitalRead((ledmovimento))); //intermittenza led giallo
   previousMillis = currentMillis; // sets the time we wait "from"
  }
 } else {
  digitalWrite((ledmovimento), LOW); // spegnimento led rosso
 }
 int reading = digitalRead(finecorsa);
  delay (50);// delay 50
 
 if (reading==LOW) // condizione a finecorsa non premuto
  blinking=true; // start blinking
 else
  blinking=false; // stop blinking
   //fine codice lampeggio

    
  if (digitalRead(startcentrale)==1 and stato==0) //funzione per effetto relè
  {
    stato=1;
  }
  else if (digitalRead(riarmo)==1 and stato==1)
  {
    stato=0;
  }
  if (stato==1) //accensione
  {
     if ((digitalRead(finecorsa) == HIGH) && (stato == 1)) 
     {
     digitalWrite(ledstato, HIGH); //accensione led notifica
     }
    if (t<val) //temperatura di mantenimento
    {
      digitalWrite (rele, LOW); //accensione relè
    }
    else
    {
      digitalWrite (rele, HIGH); //spegnimento relè
    }
  } 
  if (stato==0) //riarmo sistema
   {
     if ((digitalRead(finecorsa) == HIGH) && (stato == 0))
     {
    digitalWrite(ledstato, LOW); //spegnimento led notifica
     }
        digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
  }
  
   delay (10);// Delay a little bit to improve simulation performance
  }

La lettura di umidità e temperatura richiede tempo, mezzo secondo sul DHT22.

Invece di farla ad ogni ciclo di loop si potrebbe fare di tanto in tanto.

Per farla "ogni tanto" devo usare un altro ciclo millis?

Dato che a me l'umidità non interessa potrei togliere la lettura.
così riduco i tempi?

rieccomi alle prese col mio progetto, ora ho unito il motore passo-passo (28byj-48) al resto del circuito ed ho il problema che mentre il motore è in movimento i led non lampeggiano! (i quali mi servono proprio per segnalare che il motore è in movimento)
so che il motivo è che il processore o fà una cosa o fà un'altra, ma ce un modo per "imbrogliarlo"?

grazie

Posta l'ultimo sketch

fratt:
Posta l'ultimo sketch

eccomi qui, lo sketch può risultare un po "sporco" perchè sto facendo delle prove:
praticamente all'if di "avviamento motore" lui fà 90 gradi avanti e poi indietro per un colpo solo, ma essendo anche il pulsante finecorsa non premuto dovrebbe lampeggiare

#include <DHT.h>
#include <StepperMotor.h>

#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE);

int stato; //per funzione relè
int val=24; // temperatura da mantenere
int ledstato = 2;
int ledmovimento = 3;
int rele = 4;
int startcentrale = 5;
int finecorsa = 6;
int riarmo = 7;
int _PIN1 = 8; //pin motore
int _PIN2 = 9; //pin motore
int _PIN3 = 10; //pin motore
int _PIN4 = 11; //pin motore
int cicalino = 12; //cicalino
volatile boolean riposo = false;
int punto0 = 0; //variabile per reset motore
int statoprec = 0; //variabile stato precedente
StepperMotor stepper(_PIN1, _PIN2, _PIN3, _PIN4);

//impostazioni per lampeggio
bool blinking = false; //defines when blinking should occur
unsigned long blinkInterval = 150; // number of milliseconds for blink
unsigned long currentMillis; // variables to track millis()
unsigned long previousMillis;

void setup()
{
  pinMode(startcentrale, INPUT); //pulsante avvio sistema
  pinMode(finecorsa, INPUT); //pulsante lampeggio movimento/reset motore
  pinMode(riarmo, INPUT); //pulsante riarmo
  pinMode(ledstato, OUTPUT); // led stato sistema prenotato
  pinMode(rele, OUTPUT); //relè riscaldamento
  pinMode(ledmovimento, OUTPUT); //led lampeggio movimento
  stato=0; //per funzione relè
  pinMode(DHTPIN, INPUT); // sensore temperatura
  stepper.setPeriod(1);
  digitalWrite (rele, HIGH); //stato relè spento ad accensione
  digitalWrite (cicalino, HIGH); //stato cicalino spento 
  pinMode(_PIN1, OUTPUT); //pin motore
  pinMode(_PIN2, OUTPUT); //pin motore
  pinMode(_PIN3, OUTPUT); //pin motore
  pinMode(_PIN4, OUTPUT); //pin motore
  pinMode(cicalino, OUTPUT); //cicalino

//comunicazione seriale
Serial.begin(9600); // inizializzo la comunicazione seriale
Serial.println("Test Sensore DHTxx!");
Serial.println(""); 
dht.begin(); // inizializzo la comunicazione del sensore
  digitalRead (finecorsa);
  punto0 = digitalRead(finecorsa);
  while (punto0 ==LOW)
  {
   Serial.println(" azzeramento in corso ");
  digitalWrite (cicalino, LOW); //accensione cicalino)
  stepper.move (500);
  delay (200);
  punto0 = digitalRead(finecorsa);
  }
 stepper.stop ();
 digitalWrite (cicalino, HIGH); //spegnimento cicalino
     Serial.println(" azzeramento eseguito ");  
}

void loop()
{
//float h = dht.readHumidity();  //lettura umidita
 float t = dht.readTemperature(); //lettura temperatura

// controllo l'avvenuta comunicazione, ed avvio la scrittuta dei dati sulla seriale, ed in caso negativo scrito che è fallita
if (isnan(t)) {
Serial.println("Errore lettura sensore DHT FALLITA");
} else {
    
    // Serial.print("Temperatura: "); 
     //Serial.print(t); 
     //Serial.println(" *C"); 
}
//Serial.print("Umidita': "); 
//Serial.print(h); 
//Serial.print(" %\t"); 
//Serial.print("Temperatura: "); 
//Serial.print(t); 
//Serial.println(" *C"); 

//Serial.println(""); 
  // codice per lampeggio
 if (blinking) {
  currentMillis = millis(); // better to store in variable, for less jitter
  if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
   digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // led rosso
   digitalWrite((ledstato), !digitalRead((ledmovimento))); //intermittenza led giallo
   previousMillis = currentMillis; // sets the time we wait "from"
  }
 } else {
  digitalWrite((ledmovimento), LOW); // spegnimento led rosso
 }
 int reading = digitalRead(finecorsa);
  //delay (50);// delay 50
 
 if (reading==LOW) // condizione a finecorsa non premuto
  blinking=true; // start blinking
 else
  blinking=false; // stop blinking
   //fine codice lampeggio

    
  if (digitalRead(startcentrale)==1 and stato==0) //funzione per effetto relè
  {
    Serial.print("stato=1");
    stato=1;
  }
  else if (digitalRead(riarmo)==1 and stato==1)
  {
    Serial.print("stato=0");
    stato=0;
  }
if ((stato != statoprec) && stato == 1) //avviamento motore
{
  Serial.print("avviamento motore");
  digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (-2000);
delay (5);
stepper.move (2000);
stepper.stop ();
statoprec = 1;
digitalWrite (cicalino, HIGH);
}
  if (stato==1) //accensione
  {
   Serial.print("accensione");
     if ((digitalRead(finecorsa) ==HIGH) && (stato == 1)) 
     {
  
     digitalWrite(ledstato, HIGH); //accensione led notifica
     
     }
    if (t<val) //temperatura di mantenimento
    {
      digitalWrite (rele, LOW); //accensione relè
    }
    else
    {
      digitalWrite (rele, HIGH); //spegnimento relè
    }
  } 
  if (stato==0) //riarmo sistema
   {
   // Serial.print("riarmo sistema");
     if ((digitalRead(finecorsa) == HIGH) && (stato == 0))
     {
    digitalWrite(ledstato, LOW); //spegnimento led notifica
     }
        digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
        statoprec = 0;
  }
  
   delay (10);// Delay a little bit to improve simulation performance
  }

ho ripulito il codice migliorandolo ancora e risolvendo alcuni bug.
ora il mio unico problema rimane solo la non simultaneità tra il lampeggio dei due led e il motore passopasso in movimento.
se non cè una "scappatoia" pensavo di sostituire il lampeggio con un cicalino PASSIVO.
funziona o torno allo stesso punto dato che ha bisogno di un'uscita PWM?

#include <DHT.h>
#include <StepperMotor.h>

#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE);

int stato; //per funzione relè
int val=24; // temperatura da mantenere
int temp; //variabile temperatura
int ledstato = 2;
int ledmovimento = 3;
int rele = 4;
int startcentrale = 5;
int finecorsa = 6;
int riarmo = 7;
int _PIN1 = 8; //pin motore
int _PIN2 = 9; //pin motore
int _PIN3 = 10; //pin motore
int _PIN4 = 11; //pin motore
int cicalino = 12; //cicalino
volatile boolean riposo = false;
int punto0 = 0; //variabile per reset motore
int statoprec = 0; //variabile stato precedente

StepperMotor stepper(_PIN1, _PIN2, _PIN3, _PIN4);

//impostazioni per lampeggio
bool blinking = false; //defines when blinking should occur
unsigned long blinkInterval = 150; // number of milliseconds for blink
unsigned long currentMillis; // variables to track millis()
unsigned long previousMillis;
unsigned long tempinterval; //intervallo tra 2 letture di temperatura

void setup()
{
  pinMode(startcentrale, INPUT); //pulsante avvio sistema
  pinMode(finecorsa, INPUT); //pulsante lampeggio movimento/reset motore
  pinMode(riarmo, INPUT); //pulsante riarmo
  pinMode(ledstato, OUTPUT); // led stato sistema prenotato
  pinMode(rele, OUTPUT); //relè riscaldamento
  pinMode(ledmovimento, OUTPUT); //led lampeggio movimento
  pinMode(cicalino, OUTPUT); //cicalino
  stato=0; //per funzione relè
  pinMode(DHTPIN, INPUT); // sensore temperatura
  stepper.setPeriod(1);
  digitalWrite (rele, HIGH); //stato relè spento ad accensione
  digitalWrite (cicalino, HIGH); //stato cicalino spento 
  pinMode(_PIN1, OUTPUT); //pin motore
  pinMode(_PIN2, OUTPUT); //pin motore
  pinMode(_PIN3, OUTPUT); //pin motore
  pinMode(_PIN4, OUTPUT); //pin motore
  tempinterval=millis();
  
Serial.begin(9600); // inizializzo la comunicazione seriale
dht.begin(); // inizializzo la comunicazione del sensore
  digitalRead (finecorsa); 
  punto0 = digitalRead(finecorsa); //variabile per reset iniziale
  while (punto0 ==LOW)
  {
   Serial.println(" azzeramento in corso ");
  digitalWrite (cicalino, LOW); //accensione cicalino)
  stepper.move (200);
  delay (1);
  punto0 = digitalRead(finecorsa);
  }
 stepper.stop ();
 digitalWrite (cicalino, HIGH); //spegnimento cicalino
     Serial.println(" azzeramento eseguito ");  
}

void loop()
{
  currentMillis = millis();
 if ((unsigned long)(currentMillis) > tempinterval+5000) {
//float h = dht.readHumidity();  //lettura umidita
 temp = dht.readTemperature(); //lettura temperatura
 Serial.print("Temperatura: "); 
     Serial.print(temp); 
    Serial.println(" *C"); 
    tempinterval=millis();
 }
  // codice per lampeggio
 if (blinking) {
  if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
   digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // led rosso
   digitalWrite((ledstato), !digitalRead((ledmovimento))); //intermittenza led giallo
   previousMillis = currentMillis; // sets the time we wait "from"
  }
 } else {
  digitalWrite((ledmovimento), LOW); // spegnimento led rosso
 }
 int reading = digitalRead(finecorsa);
 
 if (reading==LOW) // condizione a finecorsa non premuto
  blinking=true; // start blinking
 else
  blinking=false; // stop blinking
   //fine codice lampeggio

  if (digitalRead(startcentrale)==1 and stato==0) //funzione per effetto relè
  {
    Serial.print("stato=1");
    stato=1;
  }
  else if (digitalRead(riarmo)==1 and stato==1)
  {
    Serial.print("stato=0");
    stato=0;
  }
if ((stato != statoprec) && stato == 1)
{
  Serial.print("avviamento motore");
  digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (-2000);
delay (5); 
  punto0 = digitalRead(finecorsa); //variabile per battuta finecorsa
  while (punto0 ==LOW) // ritorno fino a pressione finecorsa
  {
   Serial.println(" ritorno in posizione di riposo ");
  digitalWrite (cicalino, LOW); //accensione cicalino)
  stepper.move (200);
  delay (1);
  punto0 = digitalRead(finecorsa);
  }
 stepper.stop ();
 digitalWrite (cicalino, HIGH); //spegnimento cicalino
     Serial.println(" riposizionamento eseguito "); 
statoprec = 1;
}
  if (stato==1) //accensione
  {
     if ((digitalRead(finecorsa) ==HIGH) && (stato == 1)) 
     {
  
     digitalWrite(ledstato, HIGH); //accensione led notifica
     
     }
    if (temp<val) //temperatura di mantenimento
    {
      digitalWrite (rele, LOW); //accensione relè
    }
    else
    {
      digitalWrite (rele, HIGH); //spegnimento relè
    }
  } 
  if (stato==0) //riarmo sistema
   {
     if ((digitalRead(finecorsa) == HIGH) && (stato == 0))
     {
    digitalWrite(ledstato, LOW); //spegnimento led notifica
     }
        digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
        statoprec = 0;
  }
  
   delay (10);// Delay a little bit to improve simulation performance
  }

Sono sul cell e faccio un po' fatica col codice, però mi sembra di vedere che il motore lo mandi tutto indietro con -2000 e poi avanti un po' per volta con 200 dentro il while... Durante il movimento non piloti i led... Quel pezzo di codice "blocca" il programma fino a quando non hai finito col motore...

ho provato a rimettere tutto il blocco del lampeggio dentro a quel while ma non è cambiato nulla

if ((stato != statoprec) && stato == 1)
{
  //
// codice per lampeggio
 if (blinking) {
  if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
   digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // led rosso
   digitalWrite((ledstato), !digitalRead((ledmovimento))); //intermittenza led giallo
   previousMillis = currentMillis; // sets the time we wait "from"
  }
 } else {
  digitalWrite((ledmovimento), LOW); // spegnimento led rosso
 }
 int reading = digitalRead(finecorsa);
 
 if (reading==LOW) // condizione a finecorsa non premuto
  blinking=true; // start blinking
 else
  blinking=false; // stop blinking
   //fine codice lampeggio
  //
  Serial.print("avviamento motore");
  digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (-2000);
delay (5); 
  punto0 = digitalRead(finecorsa); //variabile per battuta finecorsa
  while (punto0 ==LOW) // ritorno fino a pressione finecorsa
  {
   Serial.println(" ritorno in posizione di riposo ");
  digitalWrite (cicalino, LOW); //accensione cicalino)
  stepper.move (200);
  delay (1);
  punto0 = digitalRead(finecorsa);
  }
 stepper.stop ();
 digitalWrite (cicalino, HIGH); //spegnimento cicalino
     Serial.println(" riposizionamento eseguito "); 
statoprec = 1;
}