programma arduino non funziona correttamente

salve ho scritto un programma per pilotare un motore, il motore deve ruotare per 10 secondi per poi fare una pausa di 30, 60, 90 secondi impostata tramite 3 pulsanti (uno imposta 30, uno 60 e un altro 90). Non funziona correttamente, potreste vedere cosa ho sbagliato?

int MOTORE = 13;
int PULSANTE = 2;
int PULSANTE2 = 3;
int PULSANTE3 = 4;
int STATO_PULSANTE = 0;
int STATO_PULSANTE2 = 0;
int STATO_PULSANTE3 = 0;
byte  MotorOnOff;
unsigned long Ton     = 10000; // 10 secondi acceso
long Toff    = 0;  
unsigned long lastOn  = 0;
unsigned long lastOff = 0;

void setup() {
  Serial.begin (9600);
  MotorOnOff = HIGH;          
  pinMode(MOTORE, OUTPUT);
  pinMode(PULSANTE, INPUT);
  pinMode(PULSANTE2, INPUT);
  pinMode(PULSANTE3, INPUT);
  digitalWrite(MOTORE, MotorOnOff);
  lastOn = millis();
}

long VERIFICA_Toff (){
  STATO_PULSANTE = digitalRead(PULSANTE);
  STATO_PULSANTE2 = digitalRead(PULSANTE2);
  STATO_PULSANTE3 = digitalRead(PULSANTE3);
  if (STATO_PULSANTE == HIGH) 
      Toff = 30000;
      else if (STATO_PULSANTE2 == HIGH)
              Toff = 60000;
              else if (STATO_PULSANTE3 == HIGH) 
                      Toff = 90000;
  return Toff;
}
    
void loop() {
     if ( MotorOnOff == HIGH) 
        if (millis() - lastOn > Ton) {
            MotorOnOff = LOW;
            digitalWrite(MOTORE, MotorOnOff);
            lastOff = millis();      
        }    
  else {
    if ( millis() - lastOff > VERIFICA_Toff ()) {
      MotorOnOff = HIGH;
      digitalWrite(MOTORE, MotorOnOff);
      lastOn = millis();      
    }    
  }
  Serial.println (Toff);
}

Non funziona correttamente... visto poi che NON abbiamo il tuo hardware, come possiamo fare delle prove ?
Devi dire cosa non funziona. Mettiti sempre nei panni di chi deve risponderti e non essendo li con te deve capire/supporre in base alle info che tu dai. Poche info... poche risposte. :wink:

nid69ita:
Non funziona correttamente... visto poi che NON abbiamo il tuo hardware, come possiamo fare delle prove ?
Devi dire cosa non funziona. Mettiti sempre nei panni di chi deve risponderti e non essendo li con te deve capire/supporre in base alle info che tu dai. Poche info... poche risposte. :wink:

3 pulsanti collegati ai pin 2, 3, 4 di arduino e un led collegato al pin 13 di arduino per simulare il motore

cosmo96:
3 pulsanti collegati ai pin 2, 3, 4 di arduino...

Senza resistenze pullup/pulldown?
Ciao Uwe

uwefed:
Senza resistenze pullup/pulldown?
Ciao Uwe

resistenza di pulldown da 10kohm (come in questo tutorial: https://www.arduino.cc/en/Tutorial/Button )

Spiegati meglio.
Il motore dopo 10 secondi di funzionamento se non premi nessun tasto deve fare la pausa da 30 secondi e riattivarsi per 10 secondi, fino a che non premi uno dei tre pulsanti che farà cambiare la durata della pausa in funzione del tasto premuto?

microsoul:
Spiegati meglio.
Il motore dopo 10 secondi di funzionamento se non premi nessun tasto deve fare la pausa da 30 secondi e riattivarsi per 10 secondi, fino a che non premi uno dei tre pulsanti che farà cambiare la durata della pausa in funzione del tasto premuto?

no la pausa la fa sempre dopo i 10 secondi di rotazione, con i 3 pulsanti la si può impostare a 30, 60 o 90 secondi

Io userei gli interrupt.

prova a spostare VERIFICA_Toff() all'inizio del loop() memorizzando il valore in una variabile.
inoltre, inizializzando Toff a zero il motore non fa nessuna pausa finché non premi un pulsante.

fratt:
prova a spostare VERIFICA_Toff() all'inizio del loop() memorizzando il valore in una variabile.
inoltre, inizializzando Toff a zero il motore non fa nessuna pausa finché non premi un pulsante.

ho provato cosi:

int MOTORE = 13;
int PULSANTE = 2;
int PULSANTE2 = 3;
int STATO_PULSANTE = 0;
int STATO_PULSANTE2 = 0;
byte  MotorOnOff;
unsigned long Ton     = 10000; // 10 secondi acceso
long Toff    = 30000;  
unsigned long lastOn  = 0;
unsigned long lastOff = 0;

void setup() {
  Serial.begin (9600);
  MotorOnOff = HIGH;          
  pinMode(MOTORE, OUTPUT);
  pinMode(PULSANTE, INPUT);
  pinMode(PULSANTE2, INPUT);
  digitalWrite(MOTORE, MotorOnOff);
  lastOn = millis();
}

long VERIFICA_Toff (){
  STATO_PULSANTE = digitalRead(PULSANTE);
  STATO_PULSANTE2 = digitalRead(PULSANTE2);
  if (STATO_PULSANTE == HIGH) 
      Toff = 60000;
      else if (STATO_PULSANTE2 == HIGH)
              Toff = 90000;
  return Toff;
}
    
void loop() {
     if ( MotorOnOff == HIGH) 
        if (millis() - lastOn > Ton) {
            MotorOnOff = LOW;
            digitalWrite(MOTORE, MotorOnOff);
            lastOff = millis();      
        }    
  else {
    if ( millis() - lastOff > VERIFICA_Toff ()) {
      MotorOnOff = HIGH;
      digitalWrite(MOTORE, MotorOnOff);
      lastOn = millis();      
    }    
  }
  Serial.println (Toff);
}

ma il motore si accende per 10 secondi (fin a qua ci siamo) ma poi non si riaccende piu

Qualcuno può aiutarmi? Grazie in anticipo.

Vedi cosa ti scrive come Toff sul monitor seriale.

Visto che usi una variabile globale, trasforma la funzione verificatoff da long a void, eliminando ovviamente quel return Toff, richiama questa funzione all'inizio di ogni loop

Per i millis(), usa tutte le variabili come unsigned long, ne hai alcune unsigned ed alcune long

Nel secondo if metti > Toff invece di > VERIFICA_Toff()

Vedi cosa ti scrive come Toff sul monitor seriale.

paulus1969:
Vedi cosa ti scrive come Toff sul monitor seriale.

Visto che usi una variabile globale, trasforma la funzione verificatoff da long a void, eliminando ovviamente quel return Toff, richiama questa funzione all'inizio di ogni loop

Per i millis(), usa tutte le variabili come unsigned long, ne hai alcune unsigned ed alcune long

Nel secondo if metti > Toff invece di > VERIFICA_Toff()

Vedi cosa ti scrive come Toff sul monitor seriale.

ho fatto le correzioni che hai detto:

int MOTORE = 13;
int PULSANTE = 2;
int PULSANTE2 = 3;
int STATO_PULSANTE = 0;
int STATO_PULSANTE2 = 0;
byte  MotorOnOff;
unsigned long Ton     = 10000; // 10 secondi acceso
unsigned long Toff    = 30000;  
unsigned long lastOn  = 0;
unsigned long lastOff = 0;

void setup() {
  Serial.begin (9600);
  MotorOnOff = HIGH;          
  pinMode(MOTORE, OUTPUT);
  pinMode(PULSANTE, INPUT);
  pinMode(PULSANTE2, INPUT);
  digitalWrite(MOTORE, MotorOnOff);
  lastOn = millis();
}

void VERIFICA_Toff (){
  STATO_PULSANTE = digitalRead(PULSANTE);
  STATO_PULSANTE2 = digitalRead(PULSANTE2);
  if (STATO_PULSANTE == HIGH) 
      Toff = 60000;
      else if (STATO_PULSANTE2 == HIGH)
              Toff = 90000;
}
    
void loop() {
  VERIFICA_Toff ();
     if ( MotorOnOff == HIGH) 
        if (millis() - lastOn > Ton) {
            MotorOnOff = LOW;
            digitalWrite(MOTORE, MotorOnOff);
            lastOff = millis();      
        }    
  else {
    if ( millis() - lastOff > Toff ) {
      MotorOnOff = HIGH;
      digitalWrite(MOTORE, MotorOnOff);
      lastOn = millis();      
    }    
  }
  Serial.println (Toff);
}

i tempi segnati dal monitor seriale sono giusti (anche prima lo erano) ma per il resto continua a non funzionare, ovvero fa i dieci secondi acceso e poi si spegne al infinito

Usa correttamente le graffe nel IF e vedrai che funziona

if ( MotorOnOff == HIGH) {
.....
.....

... e mentre ci sei, formattalo meglio, in modo che i vari blocchi siano più evidenti!