Controllo pompe dosometriche

salve a tutti ragazzi
allora vorrei controllare delle pompe dosometriche per somministrare dei fertilizzanti in acquario
vorrei evitare il delay per ovvi motivi e quindi usare il millis

ho scritto un programmino però non funziona bene e vorrei un vostro suggerimento

  if(dayOfWeek==myNO3[0] || dayOfWeek==myNO3[1] || dayOfWeek==myNO3[2] || dayOfWeek==myNO3[3] || dayOfWeek==myNO3[4] || dayOfWeek==myNO3[5] || dayOfWeek==myNO3[6])//CONTROLLA IL GIORNO PER SOMMINISTRARE 
  {
    if(hour==oreNitrati && minute==minutiNitrati && second==0) 
    {
      digitalWrite(NITRATI,HIGH);//ATTIVA LA SOMMINISTRAZIONE DI NITRATI
      Nitrati=true;
    }
  }
  if(Nitrati==true)
  {
    currentMillis_nitrati=millis();
    if(currentMillis_nitrati-previousMillis_nitrati>delayNITRATI)//ATTENDE IL TEMPO DI SOMMINISTRAZIONE E POI SPEGNE LA POMPA
    {
      previousMillis_nitrati=currentMillis_nitrati;
      digitalWrite(NITRATI,LOW);
      mlFlaconeNo3somministrato=mlFlaconeNo3somministrato+(mlNo3/2);//DECREMENTE LA QUANTITà SOMMINISTRATA DAL FLACONE...QUESTO NON VA BENE
      //Serial.print("mlFlaconeNo3: ");
      //Serial.print(mlFlaconeNo3);
      Nitrati=false;
    }
  }

dayOfWeek,hour,minute,second sono del real time
oreNitrati,minutiNitrati li imposto io
myNO3[] possono avere il valore o di 0 o del giorno corrispondente della settimana da 1 a 7
delayNITRATI ovviamente è il tempo che la pompa deve rimanere accesa

ringrazio tutti in anticipo :slight_smile:

Ciao, cosa non funziona? La variabile previousMillis_nitrati come la inizializzi?
ipotizzo che non ti scatta la somministrazione, forse il problema è nel second==0?

Provare a postare lo sketch completo?

fabpolli:
Ciao, cosa non funziona? La variabile previousMillis_nitrati come la inizializzi?
ipotizzo che non ti scatta la somministrazione, forse il problema è nel second==0?

ciao

allora inizializzo così

float mlNo3 = 0;
long MilliNitrati = 5800;
unsigned long delayNITRATI = (mlNo3 * MilliNitrati);
unsigned long currentMillis_nitrati;
unsigned long previousMillis_nitrati = 0;

a partire parte senza problemi

il problema è quando va nel ciclo if (nitrati==true)

perchè appena Nitrati diventa true va in quell'altro ciclo e mi spegne subito la pompa perchè
si verifica questo

if(currentMillis_nitrati-previousMillis_nitrati>delayNITRATI)

e quindi non mi rimane accesa la pompa il tempo prestabilito
ma in un secondo ovvero tra second=0 e secondo=1 mi accende la pompa poi mi verifica la condizione sopra e quindi mi spegna la pompa, visto che in un secondo rifà il ciclo di tutto il void loop mi riaccende la pompa e mi tiene accesa la pompa fin quando non si riverifica la condizione sopra

spero di essermi spiegato al meglio :slight_smile:

speedyant:
Provare a postare lo sketch completo?

postare l'intero sketch vuol dire postare almeno 15/20k righe di codice

perchè è un programmino che mi gestisce l'intero acquario con un touchscreen

e per quanto riguarda le dosometriche la parte del void loop e quella postata sopra

all'inizio ci sono le inizializzazioni come ho scritto
e nel void setup solo la parte riguardante i pinmode e la parte dell'orologio :wink:

Ciao, se il problema è solo quello credo che se inizializzi previousMillis_nitrati subito dopo al Nitrati=true ti dovrebbe risolvere il problema

Ciao,

come suggerito da fabpolli anche io eliminerei la

previousMillis_nitrati=currentMillis_nitrati;

ed aggiungerei invece una

previousMillis_nitrati=millis();

subito dopo la

Nitrati=true;

Inoltre mi pare che nella inizializzazione ci sia un problema

float mlNo3 = 0;
long MilliNitrati = 5800;
unsigned long delayNITRATI = (mlNo3 * MilliNitrati);

la variabile delayNITRATI vale sempre 0 infatti moltiplichi mlNo3 (=0) per MilliNitrati (=5800)

Questo fa si che

if(currentMillis_nitrati-previousMillis_nitrati>delayNITRATI)

sia sempre vero la prima volta che lo esegui perché previousMillis_nitrati = 0, delayNITRATI = 0 e currentMillis_nitrati sarà certamente > 0

Ciao.
Vittorio.

ok proverò come dite voi e vi farò sapere

nono mlNO3 ho scritto io qui =0 ma non è uguale a 0 è un valore impostabile da touch

però quello che mi chiedo è perchè con le altre pompe non me lo fa ?

il codice è identico anche per le altre pompe ma solo questo mi da problemi...boo