Pages: [1] 2   Go Down
Author Topic: Parere su sketch con temporizzazioni  (Read 978 times)
0 Members and 1 Guest are viewing this topic.
Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
          }
        }
    }
  }
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 234
Posts: 20180
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non vedo potenzialitá di semplificazione.

Non so se definisci una funzione

Code:
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
Logged

Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 )
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21607
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Resta comunque il fatto che se deciderò di usare un tiny dovrò documentarmi perchè non ne ho mai usati.
Non hai che da chiedere  smiley-wink
Logged


Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Non hai che da chiedere 
Grazie della disponibilità  smiley
Ora sistemo il discorso alimentazione e poi valuto il chip in base anche ai pin in/out....vi farò sapere !
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21607
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
Logged


Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora un ATtiny84 ti dovrebbe andare bene.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora un ATtiny84 ti dovrebbe andare bene.

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21607
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Pages: [1] 2   Go Up
Jump to: