Challenge

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

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

#define F_CPU 16000000UL

#define TRIGGER_PIN PD1

#define ECHO_PIN PD3

#define lcdport PORTB

#define rs_high() PORTD |= (1 << PD0)

#define rs_low() PORTD &= ~(1 << PD0)

#define en_high() PORTD |= (1 << PD2)

#define en_low() PORTD &= ~(1 << PD2)

static volatile int pulse = 0;

static volatile int i = 0;

void lcd_cmd(unsigned char cmd) {

lcdport = cmd;

rs_low();

en_high();

_delay_ms(1);

en_low();

}

void lcd_data (unsigned char data) {

lcdport = data;

rs_high();

en_high();

_delay_ms(1);

en_low();

}

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);

}

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++;

}

}

int main(void) {

DDRD |= (1 << TRIGGER_PIN);

DDRD &= ~(1 << ECHO_PIN);

_delay_ms(50);

lcd_init(); // Initialize the LCD

while (1) {

// Trigger ultrasonic sensor

PORTD |= (1 << TRIGGER_PIN); // Sensor trigger HIGH

_delay_us(15); // Trigger the sensor for 15 microseconds

PORTD &= ~(1 << TRIGGER_PIN); // Sensor trigger LOW

// Measure distance using ultrasonic sensor

// (Assuming speed of sound is approximately 58 microseconds per centimeter)

int16_t distance = pulse / 58;

// Display distance on LCD

lcd_out(1, 1, "Distance: ");

lcd_out(1, 11, itoa(distance, 10));

char distance_str[10];

itoa(distance, distance_str, 10);

lcd_out(2, 1, distance_str); // Display distance on LCD

}

}

ISR(INT0_vect) {

if (i == 1) {

TCCR1B = 0; // Disable counter

pulse = TCNT1; // Store count in 'pulse'

TCNT1 = 0; // Reset counter memory

i = 0;

}

if (i == 0) {

TCCR1B |= (1 << CS10);

i = 1;

}

}

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.