/* -----------------------------------------------------------------------
 * Title:    Module tracking humain (use PIR sensor for detection)
 * Author:   Samuel St-Aubin (samuel.st-aubin@sympatico.ca)
 * Date:     03.12.2008
 * Hardware: ATtiny13
 * Software: WinAVR 20060421
 -----------------------------------------------------------------------*/
 
#define F_CPU 9600000UL           // Define software reference clock for delay duration
                                  // Must be write before call delay.h
#include <avr/io.h>
#include <util/delay.h>
 
#define PirS PB3                  // Define PIR sensor input
#define LedRouge PB1              // Define Red Led
#define LedVert PB0               // Define Green Led
#define Piezo PB4                 // Define Pizo buzzer



void Pause (int time)             // Time fonction
{
int x;

	for ( x = 0 ; x < time ; x++)
	{
	_delay_ms(10);
	}
 
}
 
int main(void) {
 
DDRB &= ~(1<<PirS);                // Set input direction on SWT (PB2) 
DDRB |= (1 << LedRouge);           // Set output direction on LED (PB0) 
DDRB |= (1 << LedVert);            // Set output direction on LED (PB0) 
DDRB |= (1 << Piezo);              // Set output direction on LED (PB0) 

PORTB |= (1 << PirS);              // Set 1 for pull 
PORTB |= (1 << LedVert);           // Set 1 on LED pin (led turn off)
PORTB |= (1 << LedRouge);          // Set 1 on LED pin (led turn off)
PORTB &= ~(1 << Piezo);            // Set 0 on Buzzer pin (buzzer turn off)

int z;
 
	for (;;)                              // Endless loop
	{
    	if (bit_is_clear(PINB, PirS))     // Read PIR sens pin if active (0 v ) do...
     	{

    	PORTB &= ~(1 << LedRouge);        // High red led

 			for ( z = 0 ; z < 600 ; z++)  // Osc for buzzer
			{

   			PORTB |= (1 << Piezo);      
			_delay_us (200);

    		PORTB &= ~(1 << Piezo);     
			_delay_us (200);
    		}

			for ( z = 0 ; z < 4 ; z++)    // Flash red led until Noaction on PIR sensor
			{
    		PORTB &= ~(1 << LedRouge);        
			Pause (20);
    		PORTB |= (1 << LedRouge);         
			Pause (20);

			if (bit_is_clear(PINB, PirS)) z = 0;
			}

 	    PORTB |= (1 << LedVert);           // Open green LED       

 			for ( z = 0 ; z < 300 ; z++)   // osc for buzzer
			{

    		PORTB |= (1 << Piezo);          
			_delay_us (200);
			_delay_us (200);
    		PORTB &= ~(1 << Piezo);        
			_delay_us (200);

		    }

			for ( z = 0 ; z < 2 ; z++)     // final green led flash
    		PORTB &= ~(1 << LedVert);         
			Pause (20);
    		PORTB |= (1 << LedVert);          
			Pause (20);
		}
	Pause(100);                            // do break
	}
 
return 0;
}
 

