eridano bertini
Timer con due potenziometri
Tutorials -
Sabato 11 Dicembre 2010 11:13
Scritto da eridano bertini

Avendo avuto la necessità di realizzare un Timer per il mio bromografo, e senza "scomodare" un PIC ho risolto utilizzando un ATMEGA 328 acquistato su Robot Italy e pronto per essere programmato utilizzando la scheda di ARDUINO.

Il Timer impiega due potenziometri 10giri da 10K per impostare i tempi ed un pulsante di START/STOP. L'ATMEGA per funzionare necessita di un quarzo e due condensatori da 22pF

Materiale impiegato:

n.2 potenziometri 10giri da 10 Khom

n.1Triac 400V.

n.1 Separatore ottico MOC3020

n.1 Quarzo 16Mhz

n.2 Condensatori da 22 pF.

n.1 ATMEGA 328

n.1 Condensatore poliestere 100.000 pF

Le resistenze sono da 1/4 di Watt.

Il tempo è visualizzato su display a cristalli liquidi, il classico 16 ,2.

Confrontare il codice con quello in formato .doc (ritenuto OK) allegato, ed eventualmente correggere le differenze

Il codice:

 

/* il pulsante start/stop quando premuto accende il LED ed avvia il conteggio  
   Premendo di nuovo start/stop il conteggio si interrompe ed il led si spegne
   Premendo di nuovo start/stop il conteggio riprende da zero ed il led si accende
   Con l'ausilio di due potenziometri da 10K è possibile impostare il tempo in modo
   continuo dei minuti e secondi che il timer eseguirà fino al completamento.
   I potenziometri usati sono a 10 giri per rendere piu agevole l'impostazione del tempo.

                   Realizzato da Eridano B. Ottobre 2010                    */

#include  
LiquidCrystal lcd(2, 3, 4,  5, 6, 7);//indichiamo i pin digitali  collegati
                                     // al LCD,è importante seguire l'ordine

#define LED  13      // il pin del LED
#define set_sec 0    // Pin del cursore del potenziometro dei secondi
#define set_min 1    // Pin del cursore del potenziometro dei minuti
#define start_stop 9 // il pin dove è collegato il pulsante button_start_stop

int RIF = 0;      // variabile in cui vengono salvati i secondi di riferimento
int RIF2 = 0;     // variabile in cui vengono salvati i minuti di riferimento
int sec = 0;      //variabile per il conteggio dei sec 
int min = 0;      //variabile per il conteggio dei minuti
int val = 0;      // variabile per conservare lo stato del  pin di input
int old_val = 0;  // questa variabile conserva il valore precedente di "val" 
int state = 0;    // variabile di stato 0 = LED spento e 1 = LED acceso

void setup() 
{ 
  Serial.begin(9600);
  lcd.begin(16, 2);                 //Indichiamo il tipo di LCD 16 colonne ,2 righe  
  pinMode(LED, OUTPUT);             // indico ad  Arduino che LED è un output 
  pinMode(start_stop,INPUT);        // e che start_stop è un input 
} 
void loop(){ 
  val = digitalRead(start_stop);               //legge il valore dell'input e lo conserva su val
  RIF = map(analogRead(set_sec),0,1023,0,60);  //mappo la variabile per portare la lettura a (0-60) sec.
  RIF2 = map(analogRead(set_min),0,1023,0,30); //mappo la variabile per portare la lettura a (0-30) minuti.
                                               //NOTA:per aumentare o diminuire il tempo massimo del timer,basta modificare il numero 30
    
  // controlla se è avvenuta una transizione 
  if ((val == HIGH) && (old_val == LOW)){ 
    state = 1 - state;
    delay(30);
  } 
  old_val = val; // memorizza il valore precedente di val 
  if (state == 1) 
  {      
    digitalWrite(LED, HIGH); // accende il LED ed il carico
    
 // Conteggio che incrementa i min e i secondi   
    delay(930);  //da questo valore dipende la precisione del timer
    sec = sec + 1 ;
       if (sec > 59){
       sec = 0;
       min = min + 1;}
       
      if((sec >= RIF)&&(min >= RIF2)){  //verifica il raggiungimnto del tempo impostato
      state = 0;                        //se raggiunto spegne il led e resetta min e sec
      sec = 0;
      min = 0;
      delay(20);
  }
       lcd.clear();         //ripulisce il display LCD
       lcd.setCursor(1,0);  //Posiziona il cursore sulla prima casella della prima riga
       lcd.print("Tempo Trascorso ");  //qui si puo scrivere quello che si vuole
       lcd.setCursor(0,1); //sposta il cursore sulla seconda riga
       lcd.print("     ");
       lcd.print(min);
       lcd.print(" : ");
       lcd.print(sec);
       Serial.print("            Tempo Trascorso  "); //qui si puo scrivere quello che si vuole
       Serial.print(min);
       Serial.print(" : ");
       Serial.println(sec);
       delay(20); 
  } else {    
    digitalWrite(LED, LOW);   
    sec = 0;
    min = 0;
    lcd.clear();//ripulisce il display LCD  
    lcd.setCursor(1,0);
    lcd.print("Tempo impostato  ");//qui si puo scrivere quello che si vuole
    lcd.setCursor(0,1);
    lcd.print("     ");
    lcd.print(RIF2);
    lcd.print(" : ");
    lcd.print(RIF);
    Serial.print("            Tempo impostato  ");//qui si puo scrivere quello che si vuole
    Serial.print(RIF2);
    Serial.print(" : ");
    Serial.println(RIF);
    delay(100);
 }
}
 

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