Edoardo Vignali
Timer Bromografo
Tutorials -
Mercoledì 19 Maggio 2010 09:58
Scritto da Edoardo Vignali

Schema elettrico e codice di un Timer per Bromografo

Timer Arduino

Il Timer per il bromografo è un dispositivo molto semplice che vi permetterà gestire la tempistica di esposizione delle vostre basette. Il timer che ho progettato si gestisce tramite una tastiera di 5 bottoni ed un'interfaccia a display 16x2. Il tempo massimo settabile è 600secondi ovvero 10 minuti, però cambiando una variabile nel codice potrete settare il tempo massimo che vorrete, in generale però un bromografo UVA ha un tempo di esposizione che varia dai 10 ai 300 secondi. Il relee servirà da interruttore per le lampade a neon. Gli interruttori sono collegati a resistenze di pulldown.

La prima schermata che vedrete è quella del timer in standby, premendo + entrerete nella schermata di settaggio del tempo. Per impostare il tempo dovrete premere SET e con + o - incrementerete il tempo di esposizione. Premendo shift potrete scegliere di quanto incrementare la variabile in modo da risparmiare tempo per impostare tempi lunghi. Sempre per risparmiare tempo il debounce quando si setta il timer è diminuito.

La terza schermata è quella del timer vero e proprio, premete set e se avrete settato il tempo inizierà il countdown.

In foto vedete i tasti che ho rimosso dal bromografo, al tastierino originale ho aggiunto le resistenze di pull down.

Arduino Bromo timer

Eccovi il video, come potete vedere nella parte finale appena inizia il conteggio il led si accende, quando finisce il led si spenge. Al posto del led basterà metterci un relee collegato ai neon e il gioco è fatto.

Questo è il PCB del circuito che gestirà il mio bromografo:

PCB timer

In alto c'è un connettore a 12 poli per LCD 16x2, a sinistra c'è un connettore 5 poli per la tastierina.

Eccovi il codice (includete LyquidCrystal.h)

#define ENTER  0  //Pin a cui e' collegato il tasto enter
#define ESC  1  //Pin a cui e' collegato il tasto esc
#define PIU  2  //Pin a cui e' collegato il tasto piu
#define MENO 4  //Pin a cui e' collegato il tasto meno
#define SHIFT 3 // Pin a cui e' collegato il tasto shifta

//Variabili associate ai quattro pulsanti nella modalita' scorrimento pagine
boolean piu = LOW, meno = LOW, enter, esc;  
//Variabili associate ai quattro pulsanti nella modalita' settaggio
boolean piu_set = LOW, meno_set = LOW, shift_set = LOW; 
//Entra nella modalita' settaggio
boolean set = LOW;  
//Conta quante volte vengono premuti i tasti piu e meno
unsigned int n_piu, n_meno, n_shift; 
//Identificativo della pagina da visualizzare
unsigned int cont_pag = 0, cont_shift =1;  
int variabile = 0;
//Tempo tra due letture successive di un bottone (300 ms)
long tempo_btn = 0, debounce = 500, debounce_settings = 175;  
long tempo_scroll = 0;
//Trascorsi 5 minuti (300000 secondi) si torna alla schermata principale
long tempo_home = 0, back_home = 300000;  
long tempo_backlight = 0, delay_backlight = 120000;  
int a =0,b=0,c=0;
long actualTime = 0;
long previousMillis =1000;


byte smiley[8] = {
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
};

byte sigla[8] = {
  B00100,
  B01100,
  B11000,
  B10010,
  B00100,
  B00110,
  B00010,
  B00000,
};

byte arduino[8] = {
  B00000,
  B11100,
  B10100,
  B11101,
  B10101,
  B00000,
  B01010,
  B10101,
};



byte i = 0;

// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2
LiquidCrystal lcd(6,7,8,9,10,11);



//Funzione che attiva la retroilluminzazione per 120 secondi se vengono premuti dei pulsanti, oppure se dopo 10 secondi non viene
//premuto nessun pulsante spegne e torna alla prima schermata
/*void backlight()
 {
 boolean b1, b2, b3, b4;

 b1 = analogRead(PIU);
 b2 = analogRead(MENO);
 b3 = analogRead(ENTER);
 b4 = analogRead(ESC);


 if( b1 == HIGH || b2 == HIGH || b3 == HIGH || b4 == HIGH )
 {
 digitalWrite(BACKLIGHT, HIGH);
 }
 if( millis() - tempo_home > back_home )
 {
 tempo_home = millis();
 digitalWrite(BACKLIGHT, LOW);
 }
 if( millis() - tempo_backlight > delay_backlight )
 {
 tempo_backlight = millis();
 set = LOW;
 cont_pag = 0;
 }
 }  // backlight()...
 */



void setup()
{
  lcd.begin(16, 2);
  lcd.createChar(0, smiley);
  lcd.createChar(1, arduino);
  lcd.createChar(2, sigla);
  lcd.clear();
  pinMode(ENTER, INPUT);
  pinMode(ESC, INPUT);
  pinMode(PIU, INPUT);
  pinMode(MENO, INPUT);
  //pinMode(BACKLIGHT, OUTPUT);

}  // setup()...


void loop()
{
  //backlight();

  //Lettura dello stato di tutti i pulsanti
 buttonstate();

  switch (cont_pag)
  {
  case 0:    //Schermata HOME
    // codice per pagina nr. 0 (HOME)
    lcd.setCursor(0,0);
    lcd.print("   ARDUTIMER");
    if ( millis() > tempo_scroll + 150 )
    {
        buttonstate();
	tempo_scroll = millis();
	lcd.setCursor(i-1,1);
	lcd.print(" ");
	lcd.setCursor(i,1);
	lcd.write(1);
	i++;
	if ( i == 17 )
	  i = 0;
    digitalWrite(13,LOW);
    }

    break;

  case 1:   // Schermata Impostazione Timer
     buttonstate();
    lcd.setCursor(0,0);
    lcd.print("Imposta Timer");
  //Premendo "enter" si entra nella sotto-modalita'
    if(enter == HIGH && millis() - tempo_btn > debounce)  
    {   lcd.clear();
	tempo_btn = millis();
	set = !set;
    }

    if(set == HIGH)
    {
	//Abilita l'ingresso in modalita' configurazione
	n_piu = 0;
	n_meno = 0;
	//Abilita i tasti "piu" e "meno" in modalita' incremento/decremento
      if(analogRead(PIU)>1000) piu_set =HIGH;
      else  piu_set = LOW;
      if(analogRead(MENO)>1000) meno_set =HIGH;
      else  meno_set = LOW;
      
        //Incremento "variabile" se premo tasto "piu"
	if(piu_set == HIGH && millis() - tempo_btn > debounce_settings)  
	{
	  tempo_btn = millis();
	  n_piu++;
	  piu_set = !piu_set;
	  if( variabile  debounce_settings)  
	{
	  tempo_btn = millis();
	  n_meno++;
	  meno_set = !meno_set;
	  if( variabile > incremento() )
	    variabile-=incremento();
          else variabile = (600+variabile-incremento());
          lcd.clear();
	}
    lcd.setCursor(6,1);  
    lcd.print(variabile);
    }
    lcd.setCursor(0,1);  
    if(set == LOW)
	lcd.print("Premi SET");
    lcd.setCursor(14,1);
    lcd.print(incremento());

    break;
  
  case 2:
       buttonstate();
      // codice Timer
    lcd.setCursor(0,0);
    lcd.print("Timing");
    if(set == LOW){
    lcd.setCursor(0,1);
    lcd.print("Premi SET");
    }//Premendo "enter" si entra nella sotto-modalita'
  if(enter == HIGH && millis() - tempo_btn > debounce)  
    {   lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Timing");
	tempo_btn = millis();
	set = !set;
    }
    if(set == HIGH)
    {      
   digitalWrite(13,HIGH);
   if(variabile > 0){
    variabile--;
    lcd.setCursor(0,1);
    lcd.print(variabile);
    delay(1000);
    lcd.clear();
   }

    
    if(variabile == 0){
      //fai qualcosa
      digitalWrite(13,LOW);
      lcd.setCursor(0,1);
      lcd.print("  Tempo Scaduto");
      set =!set;
      delay(1500);
      lcd.clear();
      }
    }
    break;
  } //switch...

} //loop()... 
 void buttonstate(){
    //Lettura dello stato di tutti i pulsanti
  if(set == LOW)
  {
    if(analogRead(PIU)> 1000) 
    piu =HIGH;
    else piu = LOW;
    if(analogRead(MENO)>1000) 
    meno =HIGH;
    else meno = LOW;
  }
  if(analogRead(ENTER)>1000) 
  enter =HIGH;
    else 
    enter = LOW;
  if(analogRead(ESC)>1000) 
  esc =HIGH;
    else esc = LOW;

  //Se premo PIU incremento di uno il contatore pagine
  if(piu == HIGH && millis() - tempo_btn > debounce && cont_pag >= 0 && cont_pag  debounce && cont_pag > 0 && cont_pag  0)
    cont_pag--;
    else cont_pag = 2;
  }

  //Se premo ESC torno alla schermata Home uscendo anche da tutti i sottomenu
  //Quando premo "esc" torno alla schermata HOME
  if(esc == HIGH && millis() - tempo_btn > debounce)  
  {     lcd.clear();
    tempo_btn = millis();
    cont_pag = 0;
    set = LOW;
  }
 }
 
 int incremento(){
   if(analogRead(SHIFT)>1000) shift_set =HIGH;
      else  shift_set = LOW;
  if(shift_set == HIGH && millis() - tempo_btn > debounce && cont_pag > 0 && cont_pag < 3)
  {
    tempo_btn = millis();
    if(cont_shift <10){
    cont_shift++;
        lcd.clear();
      }
    else {cont_shift = 1;
            lcd.clear();
    }

  }
  return cont_shift;
  }

Ringrazio Federico Vanzati del forum di Arduino da cui ho ripreso la gestione del menù.

CC

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi