Challenge

Project 2 - Measuring distance of an object using ultrasonic sensor (HC-SR04)

Project 2 - Measuring distance of an object using ultrasonic sensor (HC-SR04)

Aim:

To get experienced with Ultrasonic sensor (HC-SR04) usage by measuring the distance travelled by wave to the object and also to implement the hardware connection of Atmega328p and HC-SR04 interfaces by using input capture mode of Timer1 and hence to display the results in LCD.

Tools used:

PC with Microchip studio & SimulIDE

Program:

/*
 * project2.c
 *
 * Created: 04-11-2022 16:52:11
 * Author : Kavitha
 */ 

#include <avr/io.h>
#define F_CPU 16000000L
#include <util/delay.h>
#include "avr/interrupt.h"
#define lcdport PORTB
#define rs_high PORTD|=(1<<0);
#define rs_low PORTD&=~(1<<0);
#define en_high PORTD|=(1<<1);
#define en_low PORTD&=~(1<<1);
unsigned int tov=0,count, distance;
void lcd_command(unsigned char cmd);
void lcd_data(unsigned char data);
void lcd_init();
void cursorpos(char x, char y);
void lcd_out(char x, char y, char *str);
void lcd_print(char row, char coloumn, unsigned int value, int digits);

int main(void)
{
	DDRB=0xff;		//Port B as output
	DDRD |=(0<<6);	//PortD pin 6 as input from echo pin of sensor
	DDRC |=(1<<0);	//PortC.0 as output
	sei();			//Enable global interrupt
	lcd_init();
	TCCR1A=0x00;	//Normal Mode
	TIMSK|=(1<<2);
	
	while(1)
	{
		PORTC|=(1<<0);//Trigger Sensor
		_delay_us(10);
		PORTC&=~(1<<0);
		
		TCCR1B=0x41;	//ICF Enable
		TCNT1=0;
		TIFR=(1<<ICF1);
		TIFR=(1<<TOV1);
		tov=0;
		while((TIFR&(1<<ICF1))==0);  //chech timer overflow condition
		TCNT1=0;
		TCCR1B=0x01;
		TIFR=(1<<ICF1);
		TIFR=(1<<TOV1);
		tov=0;
		while((TIFR&(1<<ICF1))==0);
		count = ICR1 + (65535 * tov); //calculate the count for time taken
		distance = (unsigned int)count /932.87;  //sensor datasheet formula
		lcd_print(1,1,distance,4);
		lcd_out(1,6,"cm");
	}
}
ISR(TIMER1_OVF_vect)
{
	tov++;
}

void lcd_cmd(unsigned char cmd)
{
	lcdport=cmd;
	rs_low;
	en_low;
	_delay_ms(1);
	en_high;
}

void lcd_data(unsigned char data)
{
	lcdport=data;
	rs_high;
	en_low;
	_delay_ms(1);
	en_high;
}

void lcd_init()
{
	lcd_cmd(0x38);_delay_ms(5);
	lcd_cmd(0x02);_delay_ms(5);
	lcd_cmd(0x01);_delay_ms(5);
	lcd_cmd(0x0c);_delay_ms(5);
	lcd_cmd(0x06);_delay_ms(5);
	lcd_cmd(0x80);_delay_ms(5);
	lcd_cmd(0xC0);_delay_ms(5);
}

void cursorpos(char x, char y)
{
	if((x<1||x>2)||(y<1||y>16))
	{
		x=1;
		y=1;
	}
	if(x==1)
	lcd_cmd(0x7F+y);
	else
	lcd_cmd(0xbf+y);
}

void lcd_out(char x,char y, char *str)
{
	cursorpos(x,y);
	while(*str)
	{
		lcd_data(*str);
		str++;
	}
}
void lcd_print(char row, char coloumn, unsigned int value, int digits)
{
	unsigned int temp,unit,tens,hundred,thousand,million;
	unsigned char flag=0;
	if(row==0||coloumn==0)
	{
		cursorpos(1,1);
	}
	else
	{
		cursorpos(row,coloumn);
	}
	if(digits==5|| flag==1)
	{
		million=value/10000+48;
		lcd_data(million);
		flag=1;
	}
	if(digits==4 || flag==1)
	{
		temp = value/1000;
		thousand = temp%10 +48;
		lcd_data(thousand);
		flag=1;
	}
	if(digits==3 || flag==1)
	{
		temp = value/100;
		hundred = temp%10 +48;
		lcd_data(hundred);
		flag=1;
	}
	if(digits==2 || flag==1)
	{
		temp = value/10;
		tens= temp%10 +48;
		lcd_data(tens);
		flag=1;
	}
	if(digits==1 || flag==1)
	{
		unit = value%10 + 48;
		lcd_data(unit);
	}
	if(digits>5)
	{
		lcd_data('e');
	}
}



Output:

Simulation Result:

Conclusion:

Thus using MIcrochip & simulIDE tools Ultrasonic sensor (HC-SR04) was successfully connected with Atmega328p for measuring the distance of the object, using input capture mode of Timer1 and hence results were displayed in LCD.

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.