Go Down

Topic: Parere su sketch con temporizzazioni (Read 1 time) previous topic - next topic

tonid

Ciao a tutti. Mi è stato chiesto di fare un circuitino che tramite un pulsante comandasse due relè.....Spiego il funzionamento....appena do tensione al circuito il relè_5 deve partire subito ed appena premo il pulsante si deve diseccitare e trascorso un certo tempo variabile (es, da 1 a 10 secondi) e sempre tenendo premuto il pulsante si deve eccitare rele_6. A questo punto appena rilascio il pulsante il rele_6 si deve diseccitare e trascorso un certo tempo variabile(diverso dal primo caso) riecciterà nuovamente il rele_5 ed il ciclo si ripete...
Altra precisazione....Se premo il pulsante e diseccito il rele_5 e non trascorre tutto il tempo impostato come ritardo per eccitare il rele_6, al rilascio del pulsante si dovrà eccitare di nuovo il rele_5..
Lo sketch l'ho fatto,montato il circuito e provato.....tutto funziona a dovere....vi chiedo se secondo voi si poteva fare in modo diverso . Per quanto sia complicato da capire il funzionamento son riuscito a far tutto con meno di 1700 byte ma se si può migliorare ben venga....ciao e grazie
Code: [Select]
void loop(){
 
  rit_1=analogRead(A0);    //attribuisco a rit_1/2 il valore letto dai trimmer applicati sugli ingressi
  rit_2=analogRead(A2);    //analogici A0,A2 che mi servono per variare i ritardi
 
      while(digitalRead(pulsante)==HIGH){     //mentre è premuto disattivo il rele_5 ed 
      digitalWrite(rele_5,LOW);             //applico a tempo il valore di millis
      tempo=millis();
      while(millis()<(tempo+(rit_1*2))){    //mentre millis è minore di......
        if(digitalRead(pulsante)==LOW){     //controllo lo stato del pulsante,se è stato rilasciato
          digitalWrite(rele_5,HIGH);        //esco dal ciclo while senza aspettare il tempo previsto
          break;                            //e riattivo il rele_5
        }
      }
      if(digitalRead(pulsante)==HIGH){      //se invece uscendo dal ciclo il pulsante è ancora premuto
        digitalWrite(rele_6,HIGH);          //attivo il rele_6 ed assegno alla variabile stato il valore di uno
        stato = 1;                          //che uso per capire lo stato del rele_6..1=eccitato,0=diseccitato
      }
        while(stato==1){                    //mentre il rele_6 è eccitato 
          if(digitalRead(pulsante)==LOW){   //se rilascio il pulsante
            digitalWrite(rele_6,LOW);       //lo diseccito
            tempo=millis();
            while(millis()<(tempo+(rit_2*2))){}  //trascorso tale tempo
            digitalWrite(rele_5,HIGH);            //riattivo il rele_5 e porto a "0" lo stato del rele_6
            stato=0;
          }
        }
    }
  }

uwefed

Non vedo potenzialitá di semplificazione.

Non so se definisci una funzione

Code: [Select]

attesa(int pinrele, int ritardo){
while(stato==1){                    //mentre il rele_6 è eccitato 
          if(digitalRead(pulsante)==LOW){   //se rilascio il pulsante
            digitalWrite(pinrele,LOW);       //lo diseccito
            tempo=millis();
            while(millis()<(tempo+(ritardo))){}  //trascorso tale tempo
            digitalWrite(rele_5,HIGH);            //riattivo il rele_5 e porto a "0" lo stato del rele_6
            stato=0;}
          }


guadagni spazio.
Ciao Uwe

tonid

Grazie della risposta uwefed...La domanda mi sorgeva non tanto per risparmiare spazio ma visto che non sono una cima in programmazione mi chiedevo se si poteva fare in un modo più semplice,più che altro per capire se ho usato una strada troppo lunga o sbagliata..
Ciao 

lesto

visto che i while sono cilci bloccanto, in almeno un caso li pui sostituire con i delay ( while(millis()<(tempo+(rit_2*2))){}  //trascorso tale tempo )
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

tuxduino

Più semplice di così la vedo dura... Si potrebbe riscrivere il tutto in modo un po' più elegante come macchina a stati, eliminando contemporaneamente l'uso delle attese bloccanti. Ciò avrebbe senso caso in cui fosse richiesta qualche altra operazione aggiuntiva, magari con temporizzazioni diverse da quelle attuali.

PaoloP

Forse potresti usare un Attiny85 per risparmiare spazio sulla board e i consumi del circuito.
Inoltre col core tiny, forse il programma potrebbe venire più piccolo.

tonid

Ciao e grazie a tutti delle risposte.

@lesto  Hai pienamente ragione ma ho preferito usare un while solo perchè qual'ora si decidesse di interrompere il conteggio basta solo creare l'uscita dal cilclo ed aggiungerlo...

@tuxduino  come imposteresti tu la cosa? Il concetto mi interessa ma per ignoranza non saprei come impostare la cosa.

@ PaoloP   Pensavo anche io di non usare un 328 ma qualcosa di più piccolo...Per quanto riguarda il consumo non ho problemi in quanto la scheda la alimenterò direttamente dalla rete con trasfo o switching.....probabilmente userò un trasformatore per un problema di incompatibilità (nel caso switching) con troppi valori di tensione in ingresso es. 12-24-48-60-ed avanti fino a 230 mi conviene farmi un trasfo con un primario a diversi ingressi ed una sola uscita e poi usare un 7805 e via..Resta comunque il fatto che se deciderò di usare un tiny dovrò documentarmi perchè non ne ho mai usati.

Ciao

leo72


Resta comunque il fatto che se deciderò di usare un tiny dovrò documentarmi perchè non ne ho mai usati.

Non hai che da chiedere  ;)

tonid

Quote
Non hai che da chiedere 

Grazie della disponibilità  :)
Ora sistemo il discorso alimentazione e poi valuto il chip in base anche ai pin in/out....vi farò sapere !

leo72


poi valuto il chip in base anche ai pin in/out....vi farò sapere !

Ecco, questo punto tienilo bene a mente, perché ci sono diversi Tiny (usabili con l'IDE di Arduino) ed ogni ha un numero diverso di linee I/O. Tieni anche a mente il fatto che i Tiny non hanno alcune periferiche presenti invece sui fratelli maggiori (manca la seriale HW, l'I2C non c'è ma può essere emulavo via SW ecc).

tonid

Quote
Ecco, questo punto tienilo bene a mente, perché ci sono diversi Tiny (usabili con l'IDE di Arduino) ed ogni ha un numero diverso di linee I/O. Tieni anche a mente il fatto che i Tiny non hanno alcune periferiche presenti invece sui fratelli maggiori (manca la seriale HW, l'I2C non c'è ma può essere emulavo via SW ecc).


Si ,infatti ho dato un occhio in rete ed ho visto delle versioni in dip8 che hanno 2kbyte su cui scrivere il sw e nel mio caso ci starei(penso) perchè arrivo a +/- 1670 ,devo vedere pero se c'è qualcosa con due ingressi analogici e 4 1/0 altrimenti dovrò passare ad una versione con più pin.   Per le periferiche a cui fai riferimento è buono a sapersi ma in questo caso specifico non le utilizzerei.


PaoloP


Allora un ATtiny84 ti dovrebbe andare bene.


Datasheet --> http://www.atmel.com/Images/doc8006.pdf

tonid

Quote
Allora un ATtiny84 ti dovrebbe andare bene.

Hai ragione penso possa fare proprio al caso mio...
Ho visto che ha le porte che possono essere configurate come ingressi analogici o 1/0 digitali,togliendone due per il quarzo faccio tutto.

leo72

Su questi micro il quarzo normalmente non lo metti. Sono fatti per piccoli circuiti, e possono lavorare a 1 o 8 MHz con l'oscillatore interno, quindi basse tensioni e basse frequenze = bassi consumi e pochi componenti. Certo, puoi aggiungercelo il quarzo, ma solo se effettivamente ti serve una velocità elevata.

Go Up