Pages: [1]   Go Down
Author Topic: timer bromografo logica di funzionamento  (Read 1299 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


ho realizzato  (si far per dire  ) 
un timer per bromografo  volevo sapere se sbaglio qualcosa (o mi sono dimenticato qualcosa di importante)
nella logica di funzionamento,

il timer è composto oltre al'atmega con quarzo (arduino uno)  con 2 display a 7 segmenti (da 3 cifre l'uno)
ad anodi comune,  pilotati direttamente dall'arduino senza resistenze,
2 pulsantini    e un potenziometro multigiro per impostare il tempo,  2 relè

allora,

1) alla  pressione di un pulsante (normalmente  aperto) si da tensione arduino che  parte  e porta a livello alto un pin (0) che aziona un minirele che da tensione ad arduino in modo che anche rilasciando il pulsante
arduino rimane acceso  (l'altro pulsante  normalmente chiuso interrompe l'alimentazione  se viene premuto e il tutto si spegne)

una volta acceso c'e un tempo di attesa che serve per selezionare i secondi  (0-999)  tramite il potenziometro   tutti e due i display segnano la stessa cifra   (i secondi possono diventare minuti mettendo a massa o a +  il pin (A4)  se interessa si puo mettere un deviatore a levetta)

appena il tempo di attesa e trascorso (nel codice è impostato a 9 secondi ma modificabile)
un display  (composto dalle cifre C1-C2-C3) porta a livello alto il pin 17 che accende le lampade tramite relè
e inizia il conto alla rovescia
appena il display arriva a zero (mentre l'altro display rimane sul valore che  impostato) il pin 17 passa a livello  basso spegnendo il rele lampade,
e dopo qualche secondo  tutti i display vengono spenti compreso il pin A0  che pilota il rele dell'alimentazione  spegnendo proprio tutto, 
(quest'ultima funzione è attivabile/disattivabile  portando a massa o al +  il pin A3  )

la cifra max visualizzabile viene stabilita tramite la funzione map (impostata nel codice a 199)
anche il tempo di attesa e il tempo  e l'attesa dell'autospegnimento  è modificabile  (impostata nel codice a 9 e 20 secondi )

HO DIMENTICATO QUALCOSA DI NECESSARIO ??

Code:
float spegnimento;
float  ritardominuti;

float ritardo;
float ritardo2;
float ritardoautospegnimento;
int C1;
int C2;
int C3;

int ktempo;
int tempo;
int sfarfallio;

int CFR1;
int CFR2;
int CFR3;
float secondi;
int K;


int a;
int b;   
int c;
int d;

int E;
int F;               
int G;                             
int H;                                 

 void setup () { 
   

     
  //Serial.begin(9600);
pinMode (0, OUTPUT);   
pinMode (1, OUTPUT);   
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT); 
pinMode (5, OUTPUT); 
pinMode (6, OUTPUT); 
pinMode (7, OUTPUT);
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT); 
pinMode (11, OUTPUT);
pinMode (12, OUTPUT); 
pinMode (13, OUTPUT);
pinMode (17, OUTPUT);
pinMode (18, OUTPUT);
pinMode (19, OUTPUT);

digitalWrite (0, HIGH); //pin rele autoaccensione/autospegnimento
digitalWrite (1, HIGH); //punto decomale
digitalWrite (3, HIGH);  //seconda cifra
digitalWrite (4, HIGH);  //prima cifra
digitalWrite (2, HIGH);  //segmento  f  sinistra,alto
digitalWrite (5, HIGH);  //segmento  e  sinistra,basso
digitalWrite (6, HIGH);  //segmento  d  basso
digitalWrite (7, HIGH);  //segmento  c  destra,basso
digitalWrite (8, HIGH);  //segmento  b  destra,alto
digitalWrite (9, HIGH);  //segmento  a  alto
digitalWrite (10, HIGH); //segmento  g centrale
digitalWrite (11, HIGH); //terza cifra
digitalWrite (12, HIGH); //quarta cifra
digitalWrite (18, HIGH); // quinta cifra
digitalWrite (19, HIGH); // quinta cifra

digitalWrite (17, LOW); //USCITA RELE'
digitalWrite (13, HIGH); //USCITA RELE'



}

void loop ()
 {


////////////////////////////////////////////////
////////////////////////////////////////////////
                         ritardo = 9 ;      //////   tempo attesa in secondi primma del count down  12
////////////////////////////////////////////////
////////////////////////////////////////////////
                          c = -1;         //////        valori              c = -1;   
                          d = 199;        //////        iniziali            d = 199 ;   
////////////////////////////////////////////////
////////////////////////////////////////////////
                                          //////   ritardo in secondi prima di spegnbere i spegnere del tutto il timer
       ritardoautospegnimento = 20;       //////   dopo che il count down e finito
////////////////////////////////////////////////
////////////////////////////////////////////////

////////////////////////////////////////////////
////////////////////////////////////////////////
                                          //////   da modificare leggermenre se i display presentano sfarfallio
sfarfallio = 3900;                        //////   provare ad abbassare/alzare di 100 per volta
////////////////////////////////////////////////
////////////////////////////////////////////////

  if (d > 999)  d=999 ;
 a = 0 ;         //fanno farte del map
 b = 1023 ;      //fanno farte del map
 
  E = a ; 
  F = b;   
  G = c;
  H = d;


ritardo2=ritardo*1000;//

C1 = map(analogRead(A0), a, b, c, d);
C2 = map(analogRead(A0), a, b, c, d);
C3 = map(analogRead(A0), a, b, c, d);


secondi = millis()/1000;

  if (analogRead  (A1) > 15) secondi = millis()/1000; ;  //
   if (analogRead  (A1) <= 15)secondi = millis()/60000 + ritardo; 
                                                                   //                                                                   //
 
 if (millis() > ritardo2)(K = secondi - ritardo);  timer è in attesa all'inizio


if (digitalRead  (13) ==HIGH) C1 = C1 - K;
if (digitalRead  (13) ==HIGH) C2 = C2-  K;
if (digitalRead  (13) ==HIGH) C3 = C3 - K;

  if (millis() > ritardo2 &&  digitalRead  (13) ==HIGH) digitalWrite (17, HIGH); /
  if (C1 <= 0) digitalWrite (17, LOW); // spegne il rele  quando C1=0

   if (C1 <= 0) digitalWrite (13, LOW); // spegne il led 13 quando C1=0


spegnimento=map(analogRead(A0), a, b, c, d)*1000;  // trasforma la lettura del display in millisecondi moltiplicandola per 1000
ritardoautospegnimento = ritardoautospegnimento*1000 + ritardo*1000  ;/                                                               
  if (analogRead  (A3) < 15 &&  millis() > (spegnimento +ritardoautospegnimento))   //A3 e il consenso per l'autospegnimento
{digitalWrite (0, LOW); //pin rele autospegnimento
digitalWrite (1, HIGH);  //punto decimale
digitalWrite (3, HIGH);  //seconda cifra
digitalWrite (4, HIGH);  //prima cifra
digitalWrite (2, HIGH);  //segmento  f  sinistra,alto
digitalWrite (5, HIGH);  //segmento  e  sinistra,basso
digitalWrite (6, HIGH);  //segmento  d  basso
digitalWrite (7, HIGH);  //segmento  c  destra,basso
digitalWrite (8, HIGH);  //segmento  b  destra,alto
digitalWrite (9, HIGH);  //segmento  a  alto
digitalWrite (10, HIGH); //segmento  g centrale
digitalWrite (11, HIGH); //terza cifra
digitalWrite (12, HIGH); //quarta cifra
digitalWrite (18, HIGH); // quinta cifra
digitalWrite (19, HIGH); // sesta cifra
digitalWrite (17, LOW); // red rele   
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Varese
Offline Offline
God Member
*****
Karma: 8
Posts: 585
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perchè non parti con "00" e lasci un loop che legga la pressione per modificare il tempo dopo di che azionato il tasto start parte il timer? mi sembra più logico, cmq è una cosa che interessa anche me quindi se lo fai ne sono contento, un altra cosa perchè non hai usato un lcd?
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se tu hai gia qualche idea (sketc)  su come impostare un valore tenendo premuto un tasto  postalo pure che potrebbe essere utile,
per quanto riguarda tutto il resto volevo fare le cose in "semplicita"   il potenziometro 10 giri c'e l'avevo in casa pure qualche 7 segmenti,
 il potenziometro 10 giri è molto comodo e veloce per impostare un valore,  Che tra l'altro all'accensione riappare sempre il valore lasciato,   e secondo me i display 7 segmenti sono l'ideale per visualizzare i numeri rispetto a un  lcd piccolo
magari se riesco provo a eliminare il pulsante si spegnimento usando il pulsante si accensione anche come spegnimento
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Varese
Offline Offline
God Member
*****
Karma: 8
Posts: 585
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se tu hai gia qualche idea (sketc)  su come impostare un valore tenendo premuto un tasto  postalo pure che potrebbe essere utile,
per quanto riguarda tutto il resto volevo fare le cose in "semplicita"   il potenziometro 10 giri c'e l'avevo in casa pure qualche 7 segmenti,
 il potenziometro 10 giri è molto comodo e veloce per impostare un valore,  Che tra l'altro all'accensione riappare sempre il valore lasciato,   e secondo me i display 7 segmenti sono l'ideale per visualizzare i numeri rispetto a un  lcd piccolo
magari se riesco provo a eliminare il pulsante si spegnimento usando il pulsante si accensione anche come spegnimento

si effettivamente la tua idea e migliore la voglio provare smiley
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

anche io ho realizzato un timer...utilizza:
- 4 pulsanti
- 2 rele
- lcd
- buzzer
- fotoresistenza

Se vi interessa e mi spiegate come inserire allegati vi posto il codice lo schema fatto con eagle e il pcb gia disegnato..e magari qualche foto del circuito su breadboard...
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

anche io ho realizzato un timer...utilizza:
- 4 pulsanti
- 2 rele
- lcd
- buzzer
- fotoresistenza

Se vi interessa e mi spiegate come inserire allegati vi posto il codice lo schema fatto con eagle e il pcb gia disegnato..e magari qualche foto del circuito su breadboard...
spiega la logica di funzionamento e a che cosa serve la fotoresistenza e come vengono adoperati i pulsanti
e se e un progetto vero e proprio che è stato gia costruito (foto) o no,

per inserire il codice c'è il tasto cancelletto lo schiacci quando scrivi il post e incolli il codice dove lampeggia il cursore

per inserire allegati sotto la finestra di scrittura c'e la scritta arancione
Additional Options...   clicci sopra  fai sfoglia e metti uno o piu allegati
« Last Edit: July 26, 2012, 01:21:31 am by GINGARDU » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora ho fatto la modifica e ho tolto un pulsante

quindi ha solo un pulsante che se se preme accende
e se si preme di nuovo si spegne (a condizione che il timer sia acceso da almeno un secondo)


quindi
si preme il pulsante e si accende,
si regola il tempo col potenziomentro  i 2 display a 3 cifre   segnano tutti e due lo stesso tempo,

si accende la lampada/led e un display inizia il conto alla rovescia 

appena arriva a zero la lampada /led si spegne  e dopo 20 secondi si spegne del tutto

e se necessario si preme il pulsantino e si spegne tutto

che dite potrebbe bastare??

Code:
float spegnimento;
float  ritardominuti;
//float xminuti; 
float ritardo;
float ritardo2;
float ritardoautospegnimento;
int C1;
int C2;
int C3;

int ktempo;
int tempo;
int sfarfallio;

int CFR1;
int CFR2;
int CFR3;
float secondi;
int K;


int a;
int b;   
int c;
int d;

int E;
int F;               
int G;                             
int H;                                 

 void setup () { 
   

     
  //Serial.begin(9600);
pinMode (0, OUTPUT);   
pinMode (1, INPUT);   
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT); 
pinMode (5, OUTPUT); 
pinMode (6, OUTPUT); 
pinMode (7, OUTPUT);
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT); 
pinMode (11, OUTPUT);
pinMode (12, OUTPUT); 
pinMode (13, OUTPUT);
pinMode (17, OUTPUT);
pinMode (18, OUTPUT);
pinMode (19, OUTPUT);

digitalWrite (0, HIGH); //pin rele autoaccensione/autospegnimento

digitalWrite (3, HIGH);  //seconda cifra
digitalWrite (4, HIGH);  //prima cifra
digitalWrite (2, HIGH);  //segmento  f  sinistra,alto
digitalWrite (5, HIGH);  //segmento  e  sinistra,basso
digitalWrite (6, HIGH);  //segmento  d  basso
digitalWrite (7, HIGH);  //segmento  c  destra,basso
digitalWrite (8, HIGH);  //segmento  b  destra,alto
digitalWrite (9, HIGH);  //segmento  a  alto
digitalWrite (10, HIGH); //segmento  g centrale
digitalWrite (11, HIGH); //terza cifra
digitalWrite (12, HIGH); //quarta cifra
digitalWrite (18, HIGH); // quinta cifra
digitalWrite (19, HIGH); // quinta cifra

digitalWrite (17, LOW); //USCITA RELE'
digitalWrite (13, HIGH); //USCITA RELE'



}

void loop ()
 {


////////////////////////////////////////////////
////////////////////////////////////////////////
                         ritardo = 9 ;    //////   tempo attesa in secondi primma del count down  12
////////////////////////////////////////////////
////////////////////////////////////////////////
                                          //////        valori         
                          d = 199;        //////        iniziali            d = 199 ;   
////////////////////////////////////////////////
////////////////////////////////////////////////
                                          //////   ritardo in secondi prima di spegnbere i spegnere del tutto il timer
       ritardoautospegnimento = 20;       //////   dopo che il count down e finito
////////////////////////////////////////////////
////////////////////////////////////////////////

////////////////////////////////////////////////
////////////////////////////////////////////////
                                          //////   da modificare leggermenre se i display presentano sfarfallio
sfarfallio = 3900;                        //////   provare ad abbassare/alzare di 100 per volta
////////////////////////////////////////////////
////////////////////////////////////////////////

  if (d > 999)  d=999 ;
 a = 0 ;         //fanno farte del map
 b = 1023 ;      //fanno farte del map
 c = 1; 
 
  E = a ; 
  F = b;   
  G = c;
  H = d;


ritardo2=ritardo*1000;


C1 = map(analogRead(A0), a, b, c, d);
C2 = map(analogRead(A0), a, b, c, d);
C3 = map(analogRead(A0), a, b, c, d);


secondi = millis()/1000;

  if (analogRead  (A1) > 15) secondi = millis()/1000; ;  //per avere i tempo in minuti mettere al + il pin A4
   if (analogRead  (A1) <= 15)secondi = millis()/60000 + ritardo; 
 
 if (millis() > ritardo2)(K = secondi - ritardo); 


if (digitalRead  (13) ==HIGH) C1 = C1 - K;
if (digitalRead  (13) ==HIGH) C2 = C2-  K;
if (digitalRead  (13) ==HIGH) C3 = C3 - K;

  if (millis() > ritardo2 &&  digitalRead  (13) ==HIGH) digitalWrite (17, HIGH); /
  if (C1 <= 0) digitalWrite (17, LOW); // spegne il rele  quando C1=0

   if (C1 <= 0) digitalWrite (13, LOW); // spegne il led 13 quando C1=0

if (millis() > 1000 &&  digitalRead  (1) ==LOW){ digitalWrite (0, LOW); delay(1000);}  // spegne il rele accensione se 1 va  alto tramite
                                                                        //il pulsante ed e passato almeno un secondo dall'accensione
                                                                       
spegnimento=map(analogRead(A0), a, b, c, d)*1000;  // trasforma la lettura del display in millisecondi moltiplicandola per 1000
ritardoautospegnimento = ritardoautospegnimento*1000 + ritardo*1000  ;//                                                               
  if (analogRead  (A3) < 15 &&  millis() > (spegnimento +ritardoautospegnimento)) 
{digitalWrite (0, LOW); //pin rele autospegnimento
digitalWrite (1, HIGH);  //ingresso segnale spegnimento
digitalWrite (3, HIGH);  //seconda cifra
digitalWrite (4, HIGH);  //prima cifra
digitalWrite (2, HIGH);  //segmento  f  sinistra,alto
digitalWrite (5, HIGH);  //segmento  e  sinistra,basso
digitalWrite (6, HIGH);  //segmento  d  basso
digitalWrite (7, HIGH);  //segmento  c  destra,basso
digitalWrite (8, HIGH);  //segmento  b  destra,alto
digitalWrite (9, HIGH);  //segmento  a  alto
digitalWrite (10, HIGH); //segmento  g centrale
digitalWrite (11, HIGH); //terza cifra
digitalWrite (12, HIGH); //quarta cifra
digitalWrite (18, HIGH); // quinta cifra
digitalWrite (19, HIGH); // sesta cifra
digitalWrite (17, LOW); // red rele
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Offline Offline
Jr. Member
**
Karma: 0
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho aperto un topic con il mio progetto di bromografo e timer che contiene tutto quello che ho fatto...sketch, schemi, foto.
Per chi è interessato ecco il link

http://arduino.cc/forum/index.php/topic,115985.0.html
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho aperto un topic con il mio progetto di bromografo e timer che contiene tutto quello che ho fatto...sketch, schemi, foto.
Per chi è interessato ecco il link

http://arduino.cc/forum/index.php/topic,115985.0.html

ok l'ho scaricato e gli ho dato un occhiata mi senbra un buon lavoro persino troppo per un bromografo,
 forse bisognerebbe che partisse sempre col tempo dell'ultimo uso perche di solito una volta trovato il tempo esatto per l'incisione non lo so sposta facilmente
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Pages: [1]   Go Up
Jump to: