interrompere ciclo millis? - RISOLTO

Ciao, Di seguito il pezzo di programma
Leggo il valore di 1 termocoppia, e se maggiore di 48, gestisco 1 elettrovalvola. Io vorrei che l'elettrovalvola esegua solo 1 ciclo millis. Quindi accensione per tot secondi e spegnimento.
Io sono riuscito solamente a far eseguire il ciclo all' infinito finche la funzione è verificata(tempc>48).

Non ho ancora ben capito come funziona arduino, quindi vi chiedo gentilmente se potete scrivermi 2 righe di programma, e brevemente spiegarle.

Grazie per le risposte.

if(tempc>48){
if (millis() - previousMillis4 > interval4) {
previousMillis4 = millis();
pumpState ^= 1;
}
if(pumpState==1) {
digitalWrite(pumpPin, HIGH);
}
else
digitalWrite(pumpPin, LOW);

RISOLTO. Fa il ciclo 1 sola volta.

if (millis() - previousMillis3 > interval3) {
previousMillis3 = millis();
pumpState ^= 1;
}
if(pumpState==0) {
digitalWrite(pumpPin, HIGH);
}
else
digitalWrite(pumpPin, LOW);
while(pumpState==1);

Programma completo, per regolamento.

int tempf=0;
int tempc=0;
int buttonstate=0; //Variabile per leggere stato pulsante accensione
int buttonstatev=0; //Variabile per lettura stato pulsante vapore
//Ciclo primo avvio Pompa
unsigned long contatore;
unsigned long contaimpulsi;
int controlpump=0;
//
#define swa A3
#define swv A2
#define ledon 7
#define ledf 5
#define ledc 6
#define ledoff 11
#define rf 3  
#define rc 4 
#define ev 10
#define pumpPin 2
//millis1
unsigned long previousMillis1 = 0; // memorizza l'ultimo stato
unsigned long interval1=1000; //intervallo di lettura NTC ferro
//millis2
unsigned long previousMillis2=0;
unsigned long interval2=1000; //intervallo di lettura NTC caldaia
//millis3 POMPA
byte pumpState = 0; // pumpState usato per temporizzare pompa
unsigned long previousMillis4 = 0; 
unsigned long interval4 = 2000;  //intervallo carico acqua
                    
;
void setup()
{
  Serial.begin(9600);
  pinMode(rc, OUTPUT);
  pinMode(rf, OUTPUT);
  pinMode(ledon, OUTPUT);
  pinMode(ledf, OUTPUT);
  pinMode(ledc, OUTPUT);
  pinMode(swa, INPUT);
  pinMode(swv, INPUT);
  pinMode(ledoff, OUTPUT);
  pinMode(ev, OUTPUT);
  pinMode(pumpPin, OUTPUT);
        
}
void loop()

{

//ACCENSIONE
buttonstate=digitalRead(swa);
if(buttonstate==1){
digitalWrite(ledoff, LOW);
digitalWrite(ledon, HIGH);  
 
 //GESTIONE FERRO
  
   if(millis()-previousMillis2 >interval2){
      previousMillis2=millis();
       tempf = analogRead (A1);
     //  Serial.print("ntcFERRO: ");
 // Serial.println(tempf, DEC); 
   }
       if(tempf>100) {                 
  digitalWrite(rf, HIGH);
  digitalWrite(ledf, LOW);
    } else {
  digitalWrite(rf, LOW);
  digitalWrite(ledf, HIGH);
    }
 
 
  //GESTIONE CALDAIA  

  if(millis()-previousMillis1>interval1){
    previousMillis1=millis();
     tempc = analogRead (A0);
     Serial.print("NTC: ");
  Serial.println(tempc, DEC);
  }     
    if(tempc>30){
        digitalWrite(ledc, LOW);
  digitalWrite(rc, HIGH);
  } else {
  digitalWrite(rc, LOW);
  digitalWrite(ledc, HIGH);
  } 
   
//GESTIONE EV VAPORE 
buttonstatev=digitalRead(A2);
digitalWrite(ev, buttonstatev);

//Ciclo POMPA

//TEMPORIZZATORE PRIMO AVVIO

if (contatore!=millis()) { //è tempo di un controllo
    contatore=millis();
    if (digitalRead(swa)==1) {
      contaimpulsi++;
 //Serial.print("tempoPompa: ");
 //Serial.println(contaimpulsi, DEC); 
    } else {
    contaimpulsi=0;
  }
  if (contaimpulsi>1500) {
        contaimpulsi=0;
        controlpump=1; // parametro da utilizzare per abilitare ciclo pompa
        
  }}

 if (controlpump==1){
if(tempc>48){
 if (millis() - previousMillis4 > interval4) {
    previousMillis4 = millis(); 
        pumpState ^= 1;
 }      
if(pumpState==1) {
digitalWrite(pumpPin, HIGH);
}
else
digitalWrite(pumpPin, LOW);


}}
} else {
digitalWrite(ledoff, HIGH);
digitalWrite(ledon, LOW);
digitalWrite(ledf, LOW);
digitalWrite(ledc, LOW);
digitalWrite(rf, LOW);
digitalWrite(rc, LOW);
digitalWrite(ev, LOW);
digitalWrite(pumpPin, LOW);
controlpump=0;
}


}

>duck313: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice (... anche fosse una sola riga) all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

Indenta come si deve quel codice

Così com'è è difficile da seguire. Vedi il REGOLAMENTO al punto 17.2

Potresti cavartela con una variabile che usi come flag.
La dichiari come bool e assegi il valore true

 bool PrimaVolta = true;

Poi aggiungi una condizione all'if

 if ((tempc > 48) && PrimaVolta) {

Poi dentro l'if devi mettere la variabile a false.

Standardoil:
Indenta come si deve quel codice

Così com'è è difficile da seguire. Vedi il REGOLAMENTO al punto 17.2

lo so che è una merda è per quello che non volevo mostrarlo....l'avete voluto vedere voi il codice, per regolamento bisogna mostrarlo !!!!!!

Si

Però il codice bene indentato è più facile da capire

E siccome alcuni di noi leggono da furbofono non riescono a seguirti
E quindi non ti aiutano

Come vedi a indentare il codice ci guadagni
Anche perché viene più facile per te anche scriverlo

Senza contare che sarebbe una forma di rispetto verso gli altri utenti

Adesso che sai perché conviene, lo farai?

fratt:
Potresti cavartela con una variabile che usi come flag.
La dichiari come bool e assegi il valore true

 bool PrimaVolta = true;

Poi aggiungi una condizione all'if

 if ((tempc > 48) && PrimaVolta) {

Poi dentro l'if devi mettere la variabile a false.

Grazie per l'aiuto. Ho provato.
Non funziona, come ha sempre fatto a me. Si accende uscita e rimane accesa.

Dovresti postare il nuovo codice così vediamo cosa hai fatto.
Nell'ide premi crtl+T così te lo indenta bene e diventa più leggibile per tutti.

fratt:
Dovresti postare il nuovo codice così vediamo cosa hai fatto.
Nell'ide premi crtl+T così te lo indenta bene e diventa più leggibile per tutti

Grazie!! Per ora ho risolto.
Interessante il crtl+T .. grazie! ciao

duck313:
Grazie!! Per ora ho risolto.

Bene. Ma nel primo post, dovresti mettere il tag "code" a tutti gli spezzoni di codice...

duck313:
RISOLTO. Fa il ciclo 1 sola volta.

if (millis() - previousMillis3 > interval3) {

previousMillis3 = millis();
       pumpState ^= 1;
}      
if(pumpState==0) {
digitalWrite(pumpPin, HIGH);
}
else
digitalWrite(pumpPin, LOW);
while(pumpState==1);

Eh, no, lo fa una sola volta perché poi inchiodi il programma con quel while e si blocca tutto... beh, se la necessità è di bloccare tutto, allora si, ok, è risolto :slight_smile:

Altrimenti bisogna solo abilitare/disabilitare l'esecuzione di qualcosa con una variabile.

if (abilitato  &&  ...condizione...)
{
    fai qualcosa
    abilitato = 0;
}

Bravo claudio, ho risolto 1 tubo !! Ero tutto contento, poi spengo l'impianto, o premo 1 pulsante dell'impianto, non andava nulla!!!!!!! Sto creando una nuova richiesta di aiuto. Grazie intanto

>duck313: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso. :slight_smile:

Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia :wink:

Guglielmo

P.S.: Ho eliminato io il "quote" dal tuo post qui sopra :wink: