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