|
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);
}
}