#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#include <avr/interrupt.h>
#define RS PC0
#define E PC1
#define D4 PC2
#define D5 PC3
#define D6 PC4
#define D7 PC5
#define DHT_PIN PD2
#define BUZZER PD7
#define SD_CS PB2
#define SERVO PD6
#define ROW1 PA0
#define ROW2 PA1
#define ROW3 PA2
#define ROW4 PA3
#define COL1 PA4
#define COL2 PA5
#define COL3 PA6
#define COL4 PA7
#define F_CPU 16000000UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
volatile char username[16];
volatile char password[16];
const char correctUsername[] = "AAA";
const char correctPassword[] = "AAA";
volatile uint8_t authenticated = 0;
void USART_Init(unsigned int ubrr);
void USART_Transmit(unsigned char data);
unsigned char USART_Receive(void);
void USART_SendString(const char *str);
void LCD_Init(void);
void LCD_Command(unsigned char cmnd);
void LCD_Char(unsigned char data);
void LCD_String(const char *str);
void DHT_Read(float *temperature, float *humidity);
void SD_Init(void);
void Servo_Init(void);
void Servo_Write(uint8_t angle);
void MPU6050_Init(void);
void MPU6050_Read(void);
void Keypad_Init(void);
char Keypad_GetKey(void);
void AuthenticateUser(void);
void BuzzNotification(void);
void RecommendClothes(const char *clothing1, const char *clothing2);
void GetInput(char *input, uint8_t isPassword);
int main(void) {
USART_Init(MYUBRR);
LCD_Init();
DHT_Read(NULL, NULL);
SD_Init();
Servo_Init();
MPU6050_Init();
Keypad_Init();
AuthenticateUser();
while (1) {
if (!authenticated) {
continue;
}
float temp = 0, humidity = 0;
DHT_Read(&temp, &humidity);
if (temp == -1 || humidity == -1) {
LCD_Command(0x01);
LCD_String("DHT sensor error");
continue;
}
char buffer[16];
sprintf(buffer, "Temp: %.1f C", temp);
LCD_Command(0x01);
LCD_String(buffer);
if (temp < 25) {
RecommendClothes("trousers", "sweater");
} else {
RecommendClothes("t-shirt", "shorts");
}
_delay_ms(2000);
}
return 0;
}
void USART_Init(unsigned int ubrr) {
UBRR0H = (unsigned char)(ubrr >> 8);
UBRR0L = (unsigned char)ubrr;
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
UCSR0C = (1 << USBS0) | (3 << UCSZ00);
}
void USART_Transmit(unsigned char data) {
while (!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
}
unsigned char USART_Receive(void) {
while (!(UCSR0A & (1 << RXC0)));
return UDR0;
}
void USART_SendString(const char *str) {
while (*str) {
USART_Transmit(*str++);
}
}
void LCD_Init(void) {
DDRC = 0xFF;
_delay_ms(20);
LCD_Command(0x33);
LCD_Command(0x32);
LCD_Command(0x28);
LCD_Command(0x0C);
LCD_Command(0x06);
LCD_Command(0x01);
_delay_ms(2);
}
void LCD_Command(unsigned char cmnd) {
PORTC = (PORTC & 0x0F) | (cmnd & 0xF0);
PORTC &= ~ (1<<RS);
PORTC |= (1<<E);
_delay_us(1);
PORTC &= ~ (1<<E);
_delay_us(200);
PORTC = (PORTC & 0x0F) | ((cmnd << 4) & 0xF0);
PORTC |= (1<<E);
_delay_us(1);
PORTC &= ~ (1<<E);
_delay_ms(2);
}
void LCD_Char(unsigned char data) {
PORTC = (PORTC & 0x0F) | (data & 0xF0);
PORTC |= (1<<RS);
PORTC |= (1<<E);
_delay_us(1);
PORTC &= ~ (1<<E);
_delay_us(200);
PORTC = (PORTC & 0x0F) | ((data << 4) & 0xF0);
PORTC |= (1<<E);
_delay_us(1);
PORTC &= ~ (1<<E);
_delay_ms(2);
}
void LCD_String(const char *str) {
while (*str) {
LCD_Char(*str++);
}
}
void DHT_Read(float *temperature, float *humidity) {
}
void SD_Init(void) {
}
void Servo_Init(void) {
}
void Servo_Write(uint8_t angle) {
}
void MPU6050_Init(void) {
}
void MPU6050_Read(void) {
}
void Keypad_Init(void) {
DDRA = 0x0F;
PORTA = 0xF0;
}
char Keypad_GetKey(void) {
return '\0';
}
void AuthenticateUser(void) {
while (!authenticated) {
LCD_Command(0x01);
LCD_String("Enter Username:");
GetInput(username, 0);
LCD_Command(0x01);
LCD_String("Enter Password:");
GetInput(password, 1);
if (strcmp(username, correctUsername) == 0 && strcmp(password, correctPassword) == 0) {
authenticated = 1;
LCD_Command(0x01);
LCD_String("Access Granted");
_delay_ms(2000);
LCD_Command(0x01);
} else {
LCD_Command(0x01);
LCD_String("Access Denied");
_delay_ms(2000);
}
}
}
void BuzzNotification(void) {
PORTD |= (1 << BUZZER);
_delay_ms(500);
PORTD &= ~(1 << BUZZER);
}
void RecommendClothes(const char *clothing1, const char *clothing2) {
LCD_Command(0xC0);
char buffer[16];
snprintf(buffer, sizeof(buffer), "Wear: %s & %s", clothing1, clothing2);
LCD_String(buffer);
BuzzNotification();
}
void GetInput(char *input, uint8_t isPassword) {
char key;
uint8_t pos = 0;
while (1) {
key = Keypad_GetKey();
if (key) {
if (key == '#') {
input[pos] = '\0';
break;
} else if (key == '*') {
if (pos > 0) {
pos--;
input[pos] = '\0';
LCD_Command(0x10);
LCD_Char(' ');
LCD_Command(0x10);
}
} else {
input[pos++] = key;
LCD_Char(isPassword ? '*' : key);
}
}
}
}