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.
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.
3 pulsanti collegati ai pin 2, 3, 4 di arduino e un led collegato al pin 13 di arduino per simulare il motore
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
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
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