Programmazione apertura elettrovalvole

Buongiorno a tutti, sono nuovo nel forum e nell'utilizzo di arduino. Con il mio nuovo arduino ho intenzione di controllare il funzionamento di una macchina che si utilizza per produrre talee in agricoltura. Di fatto la macchina è a funzionamento p eumatico pertanto Arduino dovrebbe controllare l'apertura di 4 elettrovalvole in cicli di 1 minuto. Ho seri problemi nella programmazione in quanto non ho dimestichezza con il codice...

Di fatto dovrei gestire i pin come segue: il numero 1 lo devo configurare come input, tutti gli altri come output

il programma è molto semplice e deve eseguire poche operazioni:

se il pin 1 è ON deve:

  • mettere il 12 e il 13 ON per tutto il ciclo
  • mettere il 5, il 6, il 7 e l'8 ON per 500 millisecondi
  • trascorsi il 500 millisecondi deve mettere il 5, il 6, il 7 e l'8 OFF per 500 millisecondi
  • sempre dopo i 500 millisecondi deve (contemporaneamente a quando mette OFF i pin 5, 6, 7e 8) deve mettere ON i pin 9, 10, 11 per 300 millisecondi Il tutto in loop di 1000 millisecondi all'infinito

se il pin 1 è OFF deve mettere tutto OFF

Qualcuno ha voglia di darmi una mano?

Ringrazio in anticipo tutti quelli che mi daranno un aiuto...

Ciao,

praticamente (nella tua testa) hai già fatto il programma :D Sei in grado di postare qualcosa?

Chiedo conferma ai più esperti (lo uso da un mese...): ma i pin 0 ed 1 non è meglio se è possibile lasciarli liberi? Non vanno in conflitto con il collegamento Arduino - PC quando si usa l'USB?

paulus1969: Chiedo conferma ai più esperti (lo uso da un mese...): ma i pin 0 ed 1 non è meglio se è possibile lasciarli liberi? Non vanno in conflitto con il collegamento Arduino - PC quando si usa l'USB?

Si, il pin 0 ed 1 su Arduino Uno sono la seriale di base che usi quando comunichi attraverso la USB (... es. in fase di Debug dell'applicazione). Se occorre parlare con la USB bisogna ovviamente lasciarli liberi ;)

Guglielmo

Bene, chiarito il discorso del pin 1 - faresti meglio ad usarne un altro - veniamo ad un altro dubbio che mi è sorto:

marcodamino: Di fatto la macchina è a funzionamento p eumatico pertanto Arduino dovrebbe controllare l'apertura di 4 elettrovalvole in cicli di 1 minuto. ...

se il pin 1 è ON deve:

  • mettere il 12 e il 13 ON per tutto il ciclo
  • mettere il 5, il 6, il 7 e l'8 ON per 500 millisecondi
  • trascorsi il 500 millisecondi deve mettere il 5, il 6, il 7 e l'8 OFF per 500 millisecondi
  • sempre dopo i 500 millisecondi deve (contemporaneamente a quando mette OFF i pin 5, 6, 7e 8) deve mettere ON i pin 9, 10, 11 per 300 millisecondi Il tutto in loop di 1000 millisecondi all'infinito

se il pin 1 è OFF deve mettere tutto OFF

I cicli di un minuto dove sono?

Mettere tutto OFF se il pin1 (o quello che userai) è LOW è una specie di spegnimento di emergenza o simile? Oppure può essere verificato all'inizio del loop? L'implementazione del codice può essere diversa, nei due casi. Se deve agire in qualsiasi momento, anche durante i vari azionamenti dentro il loop, occorre programmare un interrupt altrimenti basta un semplice if o un case.

Ok, apprendo la funzione del pin 1 e visto che userò sicuramente l'USB lo lascierò libero.

Effettivamente nella mia testa il programma lo ho ben chiaro, in quanto conosco bene il funzionamento della macchina, ma purtroppo non so tradurlo in codice.

Per quanto riguarda lo stato LOW del pin dedicato al pulsante che fa iniziare il programma (ex pin 1) direi che non é il caso di utilizzare un interrupt, ma di fatto è sufficiente controllare che a inizio ciclo sia HIGHT, in quel caso si ripeterá un nuovo ciclo altrimenti il processo si fermerá li.

Caricati l'esempio dall'ide di Arduino Digital/Button. E' un buon punto di partenza per te. ;) Un delay si fa con l'istruzione delay(x); dove x sono i millisecondi.

marcodamino: Per quanto riguarda lo stato LOW del pin dedicato al pulsante che fa iniziare il programma (ex pin 1) direi che non é il caso di utilizzare un interrupt, ma di fatto è sufficiente controllare che a inizio ciclo sia HIGHT, in quel caso si ripeterá un nuovo ciclo altrimenti il processo si fermerá li.

Per quanto riguarda i pin chiamali ad esempio pinStart, pinV1, pinV2, pinV3 e pinV4 poi a quali pin fisici li associ sta a te. Poi nel codice ad inizio potrai scrivere:

const byte pinStart=3;    // associo per esempio a pin 3
const byte pinV1=6;        // associo per esempio EV1 a pin 6

Altro consiglio. Io fossi in te inizierei a fare solo una parte del programma, quella più semplice, ovvero la parte riguardo il 12 e il 13 in quanto devono essere a ON se premi il pulsante start e li metti a OFF se lo disattivi. In seguito potrai pensare a come fare le altre cose in base al tempo trascorso.

Il consiglio di @paulus non è da prendere alla leggera. Se il pulsante deve disattivare il ciclo in qualsiasi momento, vuol dire che il programma non può essere impegnato a fare i vari conteggi senza sentire quel pulsante.

Domande: 1.Ma se le valvole sono 4 e 1 pulsante perchè nell'analisi sopra citi i pin 12,13,5,6,7,8,9,10 e 11 ? 2.Il pulsante di avvio/spegnimento è un pulsante che mantiene la posizione? Cioè è un interruttore o un pulsantino pushbutton che da solo un impulso quando lo premi ma poi ritorna alla posizione iniziale?

Grazie nuovamente a tutti per l'interessamento.

Allora, andiamo con ordine nelle risposte...

...ok ho fatto diverse prove con l'esempio consigliato da pighixxx e qualcosa (pochissimo :-( ) comincio forse a capire...

Ho aggiunto il codice suggerito da nid69ita all'inizio per definire i pin e piano piano miglioriamo...

Per quando riguarda le sue domande 1) effettivamente nella descrizione le elettrovalvole sono solo quattro per semplificazione, in realtá ad ogni elettrovalvola devo abbinare un motorino... Quindi in pratica raddoppio... 2) il pulsante di avvio/spegnimento é costituito da un interruttore e non solamente da un pushbutton

Grazie ancora a tutti

Suggerirei di procedere passo-passo, pensando inizialmente a vedere come va non interruttore e pin 12/13:

const byte pinStart=3;    // associo per esempio a pin 3
const byte pinV1=6;        // associo per esempio EV1 a pin 6
const byte pinV2=7;        
const byte pinV3=8;        
const byte pinV4=9; 
       
const byte pinX=12;  // pulsante attivo=ON pusalte disattivo=OFF
const byte pinY=13; // pulsante attivo=ON pusalte disattivo=OFF

void setup()
{ delay(1000);           // attesa iniziale, consigliato dagli esperti del forum, fidarsi
  Serial.begin(9600);  // per comunicare con monitor seriale del IDE arduino
  pinMode(pinStart,INPUT);
  ... vari settaggi di tutti pin
}

void loop()
{ int pb=digitalRead(pinStart);
  if(pb==HIGH)
  { digitalWrite(pinX,HIGH);   // mettere il 12 e il 13 ON per tutto il ciclo
    digitalWrite(pinY,HIGH);
    // mettere il 5, il 6, il 7 e l'8 ON per 500 millisecondi
    // trascorsi i 500 ms deve mettere il 5,6,7,8 a OFF per 500ms e 9,10,11 a ON per 300 ms
  }
  else
  { digitalWrite(pinX,LOW);
    digitalWrite(pinY,LOW);
    digitalWrite(5,LOW);
    ...
    digitalWrite(11,LOW);
  }
}

Non mi è chiaro una cosa ancora. Quando il pulsante è HIGH, devi fare una certa sequenza, di continuo. Ma non capisco finita 1 sequenza cosa devi fare, mettere tutto a OFF?

Se attivo pulsante (sintetizzo): // mettere il 12 e il 13 ON // mettere il 5, il 6, il 7 e l'8 ON per 500 millisecondi // trascorsi i 500 ms deve mettere il 5,6,7,8 a OFF per 500ms e 9,10,11 a ON per 300 ms finito ripeto questo ciclo, ci saranno 200ms finali dove 5,6,7,8 9,10,11 sono OFF giusto?

Purtroppo sono in giro e fino a domattina non ho modo di provare. A me servirebbe che fin quando il pulsante è on la sequenza deve susseguirsi in loop Quando è off deve terminare tutto.

Ok finalmente ho fatto un po' di prove...

ho coniato questo:

const byte pulsante=3   //imposto il pin 3 come pulsante
const byte ev1=4    //imposto il pin 4 come uscita per elettrovalvola 1
const byte ev2=5    //imposto il pin 5 come uscita per elettrovalvola 2 
const byte ev3=6    //imposto il pin 6 come uscita per elettrovalvola 3
const byte ev4=7    //imposto il pin 7 come uscita per elettrovalvola 4
const byte ev5=8    //imposto il pin 8 come uscita per elettrovalvola 5

void setup (){
delay(1000);                   //attesa iniziale, consigliato dagli esperti del forum, fidarsi
pinMode(pulsante,INPUT)     //imposto il pulsante come output
pinmode (ev1, OUTPUT)       //imposto l'ev1 come input
pinmode (ev2, OUTPUT)       //imposto l'ev1 come input
pinmode (ev3, OUTPUT)       //imposto l'ev1 come input
pinmode (ev4, OUTPUT)       //imposto l'ev1 come input
pinmode (ev5, OUTPUT)       //imposto l'ev1 come input
}

void loop(){ 
int pb=digitalRead(pulsante);
if(pb==HIGH)
digitalWrite(ev1, HIGH);    // metti il pin 4 allo stato ON
digitalWrite(ev2, HIGH);    // metti il pin 5 allo stato ON
delay(500);             // mantieni questo stato per 500 millisecondi
digitalWrite(ev3, HIGH);    // metti il pin 6 allo stato ON
digitalWrite(ev4, HIGH);    // metti il pin 7 allo stato ON
digitalWrite(ev5, HIGH);    // metti il pin 8 allo stato ON
delay(300);             // mantieni questo stato per 300 millisecondi
}

uffa!!!!

ma non funziona...

nel controllo di arduino.exe mi da questi errori...

sketch_jun03a:2: error: expected unqualified-id before numeric constant
sketch_jun03a:2: error: expected ',' or ';' before 'const'
sketch_jun03a.ino: In function 'void loop()':
sketch_jun03a:21: error: 'ev1' was not declared in this scope
sketch_jun03a:22: error: 'ev2' was not declared in this scope
sketch_jun03a:24: error: 'ev3' was not declared in this scope
sketch_jun03a:25: error: 'ev4' was not declared in this scope
sketch_jun03a:26: error: 'ev5' was not declared in this scope

edit by mod: includere il codice usando l'apposito tag code.

Semplicemente in tutte le istruzioni iniziali non hai messo il fine comandi, ovvero il ;

const byte ev1=4 → const byte ev1=4;

Nella loop io metterei anche la parte else dove spegni tutti.

Un favore, quando posti il codice racchiudilo mettendolo negli appositi tag (usa il pulsantino #)

...sono un idiota!!! ...non avevo messo i ";" !!!!

li ho messi ma il messaggio di errore è solo cambiato... :-(

sketch_jun03a.ino: In function 'void setup()': sketch_jun03a:11: error: 'pinmode' was not declared in this scope

...banali errori di sintassi... pinmode si scrive con la "M" maiuscola !!!

...secondo voi così funziona???

const byte pulsante=3;  //imposto il pin 3 come pulsante
const byte ev1=4;   //imposto il pin 4 come uscita per elettrovalvola 1
const byte ev2=5;   //imposto il pin 5 come uscita per elettrovalvola 2 
const byte ev3=6;   //imposto il pin 6 come uscita per elettrovalvola 3
const byte ev4=7;   //imposto il pin 7 come uscita per elettrovalvola 4
const byte ev5=8;   //imposto il pin 8 come uscita per elettrovalvola 5

void setup (){
delay(1000);                   //attesa iniziale, consigliato dagli esperti del forum, fidarsi
pinMode (pulsante,INPUT);   //imposto il pulsante come output
pinMode (ev1,OUTPUT);       //imposto l'ev1 come input
pinMode (ev2,OUTPUT);       //imposto l'ev2 come input
pinMode (ev3,OUTPUT);       //imposto l'ev3 come input
pinMode (ev4,OUTPUT);       //imposto l'ev4 come input
pinMode (ev5,OUTPUT);       //imposto l'ev5 come input
}

void loop(){ 
int pb=digitalRead(pulsante);
if(pb==HIGH)
digitalWrite(ev1, HIGH);    // metti il pin 4 allo stato ON
digitalWrite(ev2, HIGH);    // metti il pin 5 allo stato ON
delay(500);             // mantieni questo stato per 500 millisecondi
digitalWrite(ev3, HIGH);    // metti il pin 6 allo stato ON
digitalWrite(ev4, HIGH);    // metti il pin 7 allo stato ON
digitalWrite(ev5, HIGH);    // metti il pin 8 allo stato ON
delay(300);             // mantieni questo stato per 300 millisecondi
}

edit by mod: includere il codice usando gli appositi tag code

Ma se non metti mai da nessuna parte uno spegnimento delle valvole esempio digitalWrite(ev3, LOW); non potrai vedere qualcosa cambiare dal secondo loop in poi (perchè partono LOW, poi le metti HIGH e dal quel momento sono HIGH) Cioè dopo quel delay a 300, non dovresti spegnere qualche ev come avevi analizzato?

Io metterei anche la parte else dell'if sul putante, dove metti tutte le valvole a LOW

Rispetto all'analisi che avevi fatto: // mettere il 12 e il 13 ON // mettere il 5, il 6, il 7 e l'8 ON per 500 millisecondi // trascorsi i 500 ms deve mettere il 5,6,7,8 a OFF per 500ms e 9,10,11 a ON per 300 ms Ora come sono da interpretare v1-v5 rispetto ai pin 12/13,5,6,7---etc. ?

Ok, nuove prove e ovviamente nuovi errori... :~

const byte pulsante=3;  //imposto il pin 3 come pulsante
const byte ev1=4;   //imposto il pin 4 come uscita per elettrovalvola 1
const byte ev2=5;   //imposto il pin 5 come uscita per elettrovalvola 2 
const byte ev3=6;   //imposto il pin 6 come uscita per elettrovalvola 3
const byte ev4=7;   //imposto il pin 7 come uscita per elettrovalvola 4
const byte ev5=8;   //imposto il pin 8 come uscita per elettrovalvola 5

void setup ()
{
delay(1000);                   //attesa iniziale, consigliato dagli esperti del forum, fidarsi
pinMode(pulsante,INPUT);    //imposto il pulsante come output
pinMode (ev1, OUTPUT);      //imposto l'ev1 come input
pinMode (ev2, OUTPUT);      //imposto l'ev1 come input
pinMode (ev3, OUTPUT);      //imposto l'ev1 come input
pinMode (ev4, OUTPUT);      //imposto l'ev1 come input
pinMode (ev5, OUTPUT);      //imposto l'ev1 come input
}

void loop()
{ 
int pb=digitalRead(pulsante);

if(pb==HIGH);
digitalWrite(ev1, HIGH);    // metti il pin 4 allo stato ON
digitalWrite(ev2, HIGH);    // metti il pin 5 allo stato ON
delay(500);         // mantieni questo stato per 500 millisecondi

digitalWrite(ev1, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev2, LOW);     // metti il pin 5 allo stato OFF
delay(300);         // mantieni questo stato per 300 millisecondi

digitalWrite(ev3, HIGH);    // metti il pin 6 allo stato ON
digitalWrite(ev4, HIGH);    // metti il pin 7 allo stato ON
digitalWrite(ev5, HIGH);    // metti il pin 8 allo stato ON
delay(300);             // mantieni questo stato per 300 millisecondi

digitalWrite(ev3, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev4, LOW);     // metti il pin 5 allo stato OFF
digitalWrite(ev5, LOW);     // metti il pin 8 allo stato OFF
delay(500);         // mantieni questo stato per 500 millisecondi

else(pb==LOW);
digitalWrite(ev1, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev2, LOW);     // metti il pin 5 allo stato OFF
digitalWrite(ev3, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev4, LOW);     // metti il pin 5 allo stato OFF
digitalWrite(ev5, LOW);     // metti il pin 8 allo stato OFF
}

ERRORE: 'else' wiehout a previous 'if'

mannaggia, ma io l'if l'ho messo!!!! edit by mod: per favore includere il codice usando gli appositi tag

Usa i tag per il codice (pulsante con il #) Mancano le graffe

int pb=digitalRead(pulsante);
if(pb==HIGH)
{ digitalWrite(ev1, HIGH);    // metti il pin 4 allo stato ON
  digitalWrite(ev2, HIGH);    // metti il pin 5 allo stato ON
  delay(500);         // mantieni questo stato per 500 millisecondi
  digitalWrite(ev1, LOW);      // metti il pin 4 allo stato OFF
  digitalWrite(ev2, LOW);      // metti il pin 5 allo stato OFF
  delay(300);         // mantieni questo stato per 300 millisecondi       
  digitalWrite(ev3, HIGH);    // metti il pin 6 allo stato ON
  digitalWrite(ev4, HIGH);    // metti il pin 7 allo stato ON 
  digitalWrite(ev5, HIGH);    // metti il pin 8 allo stato ON
  delay(300);          // mantieni questo stato per 300 millisecondi
  digitalWrite(ev3, LOW);      // metti il pin 4 allo stato OFF
  digitalWrite(ev4, LOW);      // metti il pin 5 allo stato OFF
  digitalWrite(ev5, LOW);    // metti il pin 8 allo stato OFF
  delay(500);         // mantieni questo stato per 500 millisecondi
}
else  // pb==LOW
{ digitalWrite(ev1, LOW);      // metti il pin 4 allo stato OFF
  digitalWrite(ev2, LOW);      // metti il pin 5 allo stato OFF
  digitalWrite(ev3, LOW);      // metti il pin 4 allo stato OFF
  digitalWrite(ev4, LOW);      // metti il pin 5 allo stato OFF
  digitalWrite(ev5, LOW);      // metti il pin 8 allo stato OFF
}
int pb=digitalRead(pulsante);
if(pb==HIGH)

{
digitalWrite(ev1, HIGH);    // metti il pin 4 allo stato ON
digitalWrite(ev2, HIGH);    // metti il pin 5 allo stato ON
delay(500);         // mantieni questo stato per 500 millisecondi

digitalWrite(ev1, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev2, LOW);     // metti il pin 5 allo stato OFF
delay(300);         // mantieni questo stato per 300 millisecondi

digitalWrite(ev3, HIGH);    // metti il pin 6 allo stato ON
digitalWrite(ev4, HIGH);    // metti il pin 7 allo stato ON
digitalWrite(ev5, HIGH);    // metti il pin 8 allo stato ON
delay(300);             // mantieni questo stato per 300 millisecondi

digitalWrite(ev3, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev4, LOW);     // metti il pin 5 allo stato OFF
digitalWrite(ev5, LOW);     // metti il pin 8 allo stato OFF
delay(500);         // mantieni questo stato per 500 millisecondi
}

else(pb==LOW);
{
digitalWrite(ev1, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev2, LOW);     // metti il pin 5 allo stato OFF
digitalWrite(ev3, LOW);     // metti il pin 4 allo stato OFF
digitalWrite(ev4, LOW);     // metti il pin 5 allo stato OFF
digitalWrite(ev5, LOW);     // metti il pin 8 allo stato OFF
}
sketch_jun04a:21: error: expected initializer before 'int'
sketch_jun04a:44: error: expected unqualified-id before 'else'
sketch_jun04a:45: error: expected unqualified-id before '{' token

edit by mod: per favore includere il codice usando gli appositi tag

1.Questa linea: else(pb==LOW);

deve essere senza ; e senza test else // pb=LOW

2.ma hai tolto la parte iniziale? Io ti ho postato solo un pezzo (quello che va nella loop) 3.per il tag, devi scrivere [ code] e finire con / code. Invece di scriverli tu, premi il pulsante con il #