Dubbio funzione millis

ciao a tutti ho ripreso in mano arduino dopo un paio d'anni e ho bisogno di togliermi un dubbio per un progetto che sto realizzando.

in pratica ho necessità di far aprire in sequenza una serie di elettrovalvole comandando il tempo di apertura tramite la funzione millis, per una regolazione più lineare, col delay ci sono riuscito ma non mi soddisfa mi potreste dare una mano per realizzare il progetto ? posto parte del codice

[code]
int sel1 = A0;
int sel2 = A1;
int selv1;
int selv2;
const int cp1a = 2;
const int cp1b = 3;
const int cp2a = 4;
const int cp2b = 5;
const int cp3a = 6;
const int cp3b = 7;
const int cp4a = 8;
const int cp4b = 9;
const int cp5a = 10;
const int cp5b = 11;
const int cp6a = 12;
const int cp6b = 13;
int ST1a = LOW;
int ST1b = LOW;
int ST2a = LOW;
int ST2b = LOW;
int ST3a = LOW;
int ST3b = LOW;
int ST4a = LOW;
int ST4b = LOW;
int ST5a = LOW;
int ST5b = LOW;
int ST6a = LOW;
int ST6b = LOW;
unsigned long prmi = 0;
int fl = 5000;    //valore minimo frequenza apertura ev sequenziale in ms   
int fh = 10000;  //valore massimo frequenza apertura ev sequenziale in ms 
void setup() {
  Serial.begin(9600);
  pinMode(cp1a, OUTPUT);
  pinMode(cp1b, OUTPUT);
  pinMode(cp2a, OUTPUT);
  pinMode(cp2b, OUTPUT);
  pinMode(cp3a, OUTPUT);
  pinMode(cp3b, OUTPUT);
  pinMode(cp4a, OUTPUT);
  pinMode(cp4b, OUTPUT);
  pinMode(cp5a, OUTPUT);
  pinMode(cp5b, OUTPUT);
  pinMode(cp6a, OUTPUT);
  pinMode(cp6b, OUTPUT);
}
void loop() {
  selv1 = analogRead(sel1);
  selv1 = map(selv1, 0, 1023, fl, fh);
  selv2 = analogRead(sel2);
  selv2 = map(selv2, 0, 1023, 0, 400);
  unsigned long cumi = millis();

  if (cumi - prmi >= selv1) {
    prmi = cumi;
    if (ST1a == LOW) {
      ST1a = HIGH;
    } else {
      ST1a = LOW;
    }
    digitalWrite(cp1a, ST1a);
  }
  Serial.println(selv2);
}

beh l'intervallo va dichiarato: quel int selv1; non significa niente per quello che vuoi fare. Dichiaralo così:

const long selv1 = tempo che vuoi espresso in ms;

Ciao!

As_Needed:
beh l'intervallo va dichiarato: quel int selv1; non significa niente per quello che vuoi fare. Dichiaralo così:

const long selv1 = tempo che vuoi espresso in ms;

Ciao!

selv1 = analogRead(sel1);
selv1 = map(selv1, 0, 1023, fl, fh);

ho dichiarato la variabile selv1 in quel modo perchè ho bisogno di variare la frequenza della sequenza di attivazione delle ev, le ev sono 12 e le devo attivare in sequenza con tempo regolato dal potenzometro sel1

Philomix:
selv1 = analogRead(sel1);
selv1 = map(selv1, 0, 1023, fl, fh);

ho dichiarato la variabile selv1 in quel modo perchè ho bisogno di variare la frequenza della sequenza di attivazione delle ev, le ev sono 12 e le devo attivare in sequenza con tempo regolato dal potenzometro sel1

A come hai scritto praticamente l'intervallo varia da 35 a 1000 ms, e lo regoli con il potenziometro, ma è un intervallo molto piccolo, difficile rendersi conto

As_Needed:
A come hai scritto praticamente l'intervallo varia da 35 a 1000 ms, e lo regoli con il potenziometro, ma è un intervallo molto piccolo, difficile rendersi conto

Il problema non è quello i tempi li ho accorciati io per provare. Il mio problema nasce quando cerco di abilitare in sequenza gli attuatori.

Nessuno che mi dia un piccolo consiglio su come svilupparlo ?

Intanto posso dirti che questo:

if (cumi - prmi >= selv1) {
   prmi = cumi;

lo puoi scrivere, risparmiando una variabile, così:

 if (millis() - prmi >= selv1) {
    prmi = millis();

che poi è la forma corretta per farlo.

Guglielmo

Ho riscritto tutto il codice secondo le mie esigenze ora mi piacerebbe capire come eliminare il delay e inserire la funzione millis nel ciclo for mi sto facendo il nodo da solo :wink: :wink: :wink:

non ne esco

int sel1 = A0;
int sel2 = A1;
int selv1;        //selettore programma
int selv2;        //frequenza avvio attuatori
int fl = 50 ;     //frequenza limite inferiore
int fh = 1000 ;   //frequenza limite superiore
void setup() {
  Serial.begin(9600);
  for (int CP = 2; CP < 14; CP++)
  {
    pinMode(CP, OUTPUT);
  }
}
void loop() {
  selv1 = analogRead(sel1);
  selv1 = map(selv1, 0, 1023, 1, 6);
  selv2 = analogRead(sel2);
  selv2 = map(selv2, 0, 1023, fl, fh);
  switch (selv1) {
    case 1:
      for (int CP = 2; CP < 4; CP++) {
        digitalWrite(CP, HIGH);
        delay(selv2);
        digitalWrite(CP, LOW);
      }
      break;
    case 2:
      for (int CP = 2; CP < 6; CP++) {
        digitalWrite(CP, HIGH);
        delay(selv2);
        digitalWrite(CP, LOW);
      }
      break;
    case 3:
      for (int CP = 2; CP < 8; CP++) {
        digitalWrite(CP, HIGH);
        delay(selv2);
        digitalWrite(CP, LOW);
      }
      break;
    case 4:
      for (int CP = 2; CP < 10; CP++) {
        digitalWrite(CP, HIGH);
        delay(selv2);
        digitalWrite(CP, LOW);
      }
      break;
    case 5:
      for (int CP = 2; CP < 12; CP++) {
        digitalWrite(CP, HIGH);
        delay(selv2);
        digitalWrite(CP, LOW);
      }
      break;
    case 6:
      for (int CP = 2; CP < 14; CP++) {
        digitalWrite(CP, HIGH);
        delay(selv2);
        digitalWrite(CP, LOW);
      }
      break;
  }
}