Fetch Data From Database

Nel seguente esempio si prende in considerazione il timer1 per gestire tre eventi:

  1. Azionamento motore ogni 10 secondi (questa scelta è puramente arbitraria per la simulazione con Proteus).
  2. Lampeggio led per 5 volte (ogni lampeggio dura 500 millisecondi).
  3. 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

No comments

Leave your comment

In reply to Some User