#include "stm32c0xx.h"
#define BUTTON_PIN (1<<10) // PA10 -> D2
#define VEHICLE_LED (1<<3) // PB3 -> D3
#define BUZZER_PIN (1<<5) // PB5 -> D4
#define WARNING_LED (1<<4) // PB4 -> D5
volatile uint32_t systemTime = 0;
uint32_t pressStart = 0;
void delay_ms(uint32_t ms){
for(uint32_t i=0;i<ms*4000;i++);
}
void showMessage(char *msg){
Serial.println(msg);
}
uint32_t getTime(){
return systemTime;
}
void setup() {
Serial.begin(9600);
// Enable GPIOA and GPIOB clock
RCC->IOPENR |= (1<<0); // GPIOA
RCC->IOPENR |= (1<<1); // GPIOB
// PA10 input
GPIOA->MODER &= ~(3<<(10*2));
// PB3 PB4 PB5 output
GPIOB->MODER &= ~((3<<(3*2)) | (3<<(4*2)) | (3<<(5*2)));
GPIOB->MODER |= ((1<<(3*2)) | (1<<(4*2)) | (1<<(5*2)));
// Initial state
GPIOB->ODR |= VEHICLE_LED;
GPIOB->ODR &= ~WARNING_LED;
GPIOB->ODR &= ~BUZZER_PIN;
showMessage("DRIVER SAFE - Vehicle Running");
}
void loop() {
delay_ms(1);
systemTime++;
// Button pressed
if(!(GPIOA->IDR & BUTTON_PIN)) {
if(pressStart == 0){
pressStart = getTime();
}
uint32_t elapsed = getTime() - pressStart;
if(elapsed >= 1000){
GPIOB->ODR &= ~VEHICLE_LED;
showMessage("WARNING - Eyes Closed");
}
if(elapsed >= 2000){
GPIOB->ODR |= WARNING_LED;
showMessage("DROWSINESS DETECTED");
}
if(elapsed >= 3000){
GPIOB->ODR |= BUZZER_PIN;
showMessage("ALERT ACTIVE - STOP VEHICLE");
}
}
else {
pressStart = 0;
GPIOB->ODR |= VEHICLE_LED;
GPIOB->ODR &= ~WARNING_LED;
GPIOB->ODR &= ~BUZZER_PIN;
showMessage("DRIVER SAFE - Vehicle Running");
}
}