timer bromografo logica di funzionamento

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 ??

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

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?

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

GINGARDU:
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 :slight_smile:

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

paolo_fiorini3:
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

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??

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

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

paolo_fiorini3:
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