Esegui funzione per x secondi

Ciao a tutti,

in questi giorni sto facendo un piccolo esperimento con l'Arduino ma sto avendo problemi ad implementare il software.

Il mio progetto è molto semplice , in cui un Arduino nano avvia un motore (12v 6A) ed attraverso un potenziometro monitora la sua velocità.

In più ,alla funzione velocità, vorrei aggiungere il tempo di lavoro e il tempo di pausa ,monitorata attraverso dei commutatori.

Purtroppo mi sono fermato , non riesco a capire come posso implementare la funzione lavoro e pausa cioè se io leggo un valore dai commutatori, a seconda se sono per pausa o lavoro, devo riuscire a fermare o far girare il motore per i secondi equivalenti ai valori letti.

Inoltre se qualcuno mi può dare una dritta sul mio circuito sarei molto felice.

IMPORTANTE : nel circuito , al momento, sto utilizzando dei potenziometri al posto dei commutatori ma poi li cambierò.

#define POT_SPEED_PIN 1
#define POT_LAVORO_PIN 2
#define POT_PAUSA_PIN 3
#define GATE 3

int v_speed = 0;
int v_lavoro = 0;
int v_pausa = 0;
int pwm_speed;
int pwm_lavoro;
int pwm_pausa;
bool isOn = false;

void setup() {
  
   Serial.begin(9600);
    pinMode(GATE, OUTPUT);
    analogWrite(GATE,0);
}


void loop() {

        //leggo il valore dal potenziometro Lavoro
    v_lavoro=analogRead(POT_LAVORO_PIN);
    pwm_lavoro=map(v_lavoro,0,1023,0,255);
        //leggo il valore dal potenziometro Pausa
    v_pausa=analogRead(POT_PAUSA_PIN);
    pwm_pausa=map(v_pausa,0,1023,0,255);

    //leggo il valore dal potenziometro e scrivo sul pin 3 
    v_speed=analogRead(POT_SPEED_PIN);
    pwm_speed=map(v_speed,0,1023,0,255);
    analogWrite(GATE,pwm_speed);
    Serial.println(pwm_speed);

}

Invece il circuito è riportato su questo link: Il circuito

spero di esserci riuscito a descrivervi bene la mia problematica grazie in anticipo

Lo schema così com'è ha alcuni errori e non sono indicati i valori.

Il MOSFET deve essere di tipo logic level (ad esempio IRL520) ed il resistore sul gate meglio sia da 220 ohm.

Inoltre, lavorando in PWM, potrebbe scaldare, quindi meglio prevedere un buon dissipatore.

Sullo schema il resistore è connesso ai +12V, mentre dovrebbe essere connesso alla porta di Arduino.

Meglio mettere un diodo di protezione in antiparallelo sul motore, anche se è già contenuto nel MOSFET.

Nello sketch devi usare A1, A2 ed A2 al posto di 1, 2 e 3 che potrebbero essere confusi con i pin D1, D2 e D3.

Devi usare millis per confrontare il tempo di pausa e lavoro impostati con i potenziometri con quello trascorso.

Grazie per la risposta,

Seguirò il tuo consiglio per quanto riguarda il mosfet , la resistenza a 220 ohm,il dissipatore ed il diodo , ma non ho capito qual è il resistore che è connesso a +12V? l'unico resistore presente nel circuito è quello da 220 ohm ma è connesso da un lato al pin 3 Arduino e dall'altro a massa.

In fine un amico mi ha consigliato la libreria simpleTimer che si basa sulla funzione millis() per la gestione del tempo di lavoro e tempo di pausa ma non riesco a capire come posso usarlo nel mio sketch . Potrebbe qualcuno darmi un semplice esempio adatto a quello che devo fare io non so se vi chiedo tanto?

viringrazio

Prova questo e fammi sapere se funziona (l’ho modificato al volo, va verificato):

#define POT_SPEED_PIN 1
#define POT_LAVORO_PIN 2
#define POT_PAUSA_PIN 3
#define GATE 3

// Definizione tempi minimi e massimi (in millisecondi) per
// i potenziometri
#define LAVORO_MIN 1000
#define LAVORO_MAX 60000
#define PAUSA_MIN 1000
#define PAUSA_MAX 60000

// Istante inizio evento corrente
unsigned long time0;

int v_speed;
int pwm_speed;
int v_lavoro;
int intLavoro;
int v_pausa;
int intPausa;

// Flag per indicare lo stato corrente
bool isOn;

void setup() {
	Serial.begin(9600);
	
	pinMode(GATE, OUTPUT);
	
	analogWrite(GATE,0);
	isOn = false;
	time0 = millis();
}


void loop() {
	int oldVal;
	//leggo il valore dal potenziometro Lavoro
	v_lavoro=analogRead(POT_LAVORO_PIN);
	oldVal = intLavoro;
 	intLavoro=map(v_lavoro,0,1023,LAVORO_MIN,LAVORO_MAX);
	if ( intLavoro<>oldVal) {
	    Serial.print("Lavoro=");
		Serial.println(intLavoro);
	}
	//leggo il valore dal potenziometro Pausa
	v_pausa=analogRead(POT_PAUSA_PIN);
	oldVal = intPausa;
 	intPausa=map(v_pausa,0,1023,PAUSA_MIN,PAUSA_MAX);
	if ( intLavoro<>oldVal) {
	    Serial.print("Pausa=");
		Serial.println(intPausa);
	}
	 
	if ( isOn )
		if ( millis()-time0 >= intLavoro ) {
			// Fine ciclo lavoro, spegni tutto e aspetta
			analogWrite(GATE,0);
			time0 = millis();
			isOn = false;
			Serial.println("OFF");
		} else {
			//leggo il valore dal potenziometro speed e scrivo sul pin 3 
			v_speed=analogRead(POT_SPEED_PIN);
			pwm_speed=map(v_speed,0,1023,0,255);
			analogWrite(GATE,pwm_speed);
			//Serial.println(pwm_speed);
		}
	else
		if ( millis()-time0 >= intPausa ) {
			// Fine ciclo attesa, passa a "ON"
			time0 = millis();
			isOn = true;
			Serial.println("ON");
		} else {
			// Spengo il motore
			analogWrite(GATE,0);
			//Serial.println(0);
		}
}

Grazie mille, sta sera proverò il tuo codice grazie ancora!

Ragazzi ho finito la funzione grazie all'esempio di 'doc doc', togliendo dei piccoli bug. Ora la parte software è completa ed è:

#define POT_SPEED_PIN 1
#define POT_LAVORO_PIN 2
#define POT_PAUSA_PIN 3
#define GATE 3

// Definizione tempi minimi e massimi (in millisecondi) per
// i potenziometri
#define LAVORO_MIN 0
#define LAVORO_MAX 600
#define PAUSA_MIN 0
#define PAUSA_MAX 600

// Istante inizio evento corrente
unsigned long time0;

int v_speed;
int pwm_speed;
int v_lavoro;
int intLavoro;
int v_pausa;
int intPausa;

// Flag per indicare lo stato corrente
bool isOn;

void setup() {
    Serial.begin(9600);

    pinMode(GATE, OUTPUT);

    analogWrite(GATE,0);
    isOn = false;
    time0 = millis();
}


void loop() {
   
    int oldVal;
    //leggo il valore dal potenziometro Lavoro
    v_lavoro=analogRead(POT_LAVORO_PIN);
    oldVal = intLavoro;
    intLavoro=map(v_lavoro,0,1023,LAVORO_MIN,LAVORO_MAX);
    if ( intLavoro != oldVal) {
        Serial.print("Lavoro=");
        Serial.println(intLavoro);
    }
    //leggo il valore dal potenziometro Pausa
    v_pausa=analogRead(POT_PAUSA_PIN);
    oldVal = intPausa;
    intPausa=map(v_pausa,0,1023,PAUSA_MIN,PAUSA_MAX);
    if ( intPausa != oldVal) {
        Serial.print("Pausa=");
        Serial.println(intPausa);
    }
    if ( isOn ){
        if ( millis()-time0 >= intLavoro &&  intLavoro > 0) {
            // Fine ciclo lavoro, spegni tutto e aspetta
            analogWrite(GATE,0);
            time0 = millis();
            isOn = false;
            Serial.println("OFF");
        } else {
            //leggo il valore dal potenziometro speed e scrivo sul pin 3 
            v_speed=analogRead(POT_SPEED_PIN);
            pwm_speed=map(v_speed,0,1023,0,255);
            analogWrite(GATE,pwm_speed);
            //Serial.println(pwm_speed);
        }
    }else{
        if ( millis()-time0 >= intPausa &&  intPausa > 0 ) {
            // Fine ciclo attesa, passa a "ON"
            time0 = millis();
            isOn = true;
            Serial.println("ON");
        } else {
            // Spengo il motore
            analogWrite(GATE,0);
            //Serial.println(0);
        }
}
}