Nel seguente esempio si prende in considerazione il timer1 per gestire tre eventi:
- Azionamento motore ogni 10 secondi (questa scelta è puramente arbitraria per la simulazione con Proteus).
- Lampeggio led per 5 volte (ogni lampeggio dura 500 millisecondi).
- Durata azionamento motore 2 secondi.
Ovviamente queste temporizzazioni sono state scelte per avere tempi ragionevoli in simulazione. Per variare questi tempi è sufficiente modificare i valori delle variabili usate.
Lo sketch è il seguente:
// Variabili e costanti
const int N_nlink=9;//Numero di lampeggi led
const long Time_Stanby=100;// 100 * 100 msec =10000 msec=10 sec
const unsigned long Time_Motor=20;//20 *100 msec =2sec
unsigned long Standby = Time_Stanby;//10 sec
int OUT = 9; // collego il gate del mosfet al pin 9
int LedPin = 5; // Uscita per il led al pin 5
unsigned int tempoMoto =Time_Motor;//2sec
int i,flag_Time_Stanby,enable_blink_led,Counter_Blink=0,CounterDelay=0,StartMotor=0;
long timer1_counter; //Variabile per ottenere un interrupt ogni 0.1 sec
//---------------------------------------------------------------------------
void setup() {
pinMode(OUT, OUTPUT); // imposto il pin 9 come uscita
pinMode(LedPin, OUTPUT);// imposto il pin 5 come uscita
digitalWrite(OUT,LOW);//Azzero uscita 9
digitalWrite(LedPin,LOW);//Spengo il led
//--------------------------timer setup
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
timer1_counter = 59286; // preload timer 65536-16MHz/256/2Hz=31250 (65536-31250)=34286 (34286 for 0.5sec),(59286 per 100 msec)
TCNT1 = timer1_counter; // preload timer
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
//--------------------------timer setup-------------------------------------
}
//---------------------------------------------------------------------------
ISR(TIMER1_OVF_vect) // interrupt service routine - tick every 0.1 sec
{
TCNT1 = timer1_counter; // set timer
if(--Standby==0){//Decremento ogni 100 msec
flag_Time_Stanby=1;
Standby = Time_Stanby;
}
if(StartMotor==1){//Se il motore è azionato
if(--tempoMoto==0){//Dopo TemoMotore
digitalWrite(OUT, LOW);//Spegne motore
StartMotor=0;//Azzera flag
}
}
if(enable_blink_led==1){
if(++CounterDelay==5){//dopo 500 msec
digitalWrite(LedPin,!digitalRead(LedPin));
CounterDelay=0;
Counter_Blink++;
}
if(Counter_Blink==N_nlink){//Se i blink sono 5 On e 5 Off
enable_blink_led=0;//Disabilita il lampeggio
Counter_Blink=0;//Azzera contatore lampeggi
digitalWrite(LedPin,LOW);//Spegni il led
}
}//Fine blink led
}//Fine interrupt
//---------------------------------------------------------------------------
void loop() {
if(flag_Time_Stanby==1){//Dopo Time_Stanby
flag_Time_Stanby=0;//Azzera flag
enable_blink_led=1;//Abilita lampeggio
digitalWrite(LedPin,HIGH);//Accendi led
digitalWrite(OUT, HIGH);//Accendi motore
StartMotor=1;//Setta flag start motore
tempoMoto =Time_Motor;//Carica tempo motore pari a Time_Motor
}
}
Per chiarimenti potete scrivere al mio indirizzo email.
Saluti Primok