Alarm Waktu dengan microcontroller AVR

Di website Om Wichit Sirichote saya nemukan contoh aplikasi Realtime Controller. Iseng2 saya porting ke AVR dengan AVRGCC sebagai compilernya.Enaknya pake bahasa C gak banyak yg musti dirubah dan bisa diporting dengan sedikit penambahan.Aplikasi ini bisa diterapkan semisal nih rumah ditinggal, trus kita pengen menyalakan lampu rumah tiap sore hari trus off lagi pagi hari.Sayangnya aplikasi ini juga belum saya wujudkan dalam hardware jadi, masih software aja heheh.Maklum nich ge miskin qiqiqi

// Mini Realtime Controller 1.0
// Using AVR ATMega 8
// based on F84 Realtime Controller by Wichit Sirichote
// ported to AVR Microcontroller by median m3di4n@gmail.com
// September 2008
// The Controller will be turn on and off at the time by user

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <inttypes.h>

#define		LAMP_ON		PORTC&=~(_BV(0))
#define              LAMP_OFF          PORTC|=_BV(0)
#define		KEY		        PD6
#define 	       LED_ON		PORTC&=~(_BV(5))
#define		LED_OFF		PORTC|=_BV(5)

char detik, menit, jam, hari;
char flag, flag1, status;
// set waktu untuk output ,
// misal utk lampu akan dihidupkan mulai dari jam 18.00 -- 05.30

char time_on []={18,00};
char time_off[]={05,30};

void scan_time (void) {
	detik++;
	if (detik >= 60) {
		detik = 0;
		menit++;
	if (menit >= 60) {
		menit = 0;
		jam++;
	if (jam >= 24) {
		jam = 0;
		hari++;
	if (hari >=8) {
		hari  = 1;
	}
	}
	}
	}
}

void set_time() {
	if ((flag & 0x001) !=0){ 	//jika button ditekan?
	status = 0;
	jam = 18;
	menit = 0;
	detik = 0;
	flag&=~0x001;	//clear kembali flag utk cek tombol
	}
}

void cek_time() {
	if (jam == time_on[0] && menit == time_on[1])
		status = 1;
	if (jam == time_off[0] && menit == time_off[1])
		status =0;
}

void led_blinking() {
	LED_ON;
	_delay_ms(200);
	LED_OFF;
}

void flashing_led() {
	flag= 0;
	char i;
	for (i=1;i>=5;i++){
		led_blinking();
	}
	flag=1;
} 

void cek_button() {
	if (KEY == 0) {
		flag1|=0x01;		//set bit 0 sebagai flag bahwa button ditekan
		flag1|=0x10;		//disable flashing led
	set_time();
	}
}

void update_output() {
	if (status)
		{
			LAMP_ON;
		} else {
			LAMP_OFF;
		}
}
ISR(TIMER0_OVF_vect) {
	scan_time();
	cek_time();
	cek_button();
	flashing_led();
	update_output();
}

int main(void) {
	DDRC = 0xFF;		//Set Port C sebagai output
	DDRD = 0x00;		//Set Port D sebagai input

//menggunakan CLOCK/64 prescaler value
TCCR0 =(_BV(CS01)|_BV(CS00));

TIMSK =_BV(TOIE0);		//enable interrupt in TIMSK Register
//TCNT0L = 0X96;
//TCNT0H = 0XE7;
TCNT0 = 0x96e7;

sei();
for(;;) {}
}

One Response

  1. wah makin mantap aja ilmu microcontrollernya….. chayooo…

Leave a Reply