#include <Arduino.h>
#include <LiquidCrystal.h>
//////////////////////////////////////////////
// SET LED PIN
int left_LED_1 = 8;
int left_LED_2 = 11;
int right_LED_1 = 12;
int right_LED_2 = 13;
int CDL_Pin = 3;
//////////////////////////////////////////////
// GLOBAL VARIABLES
LiquidCrystal lcd(9, 10, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
int var;
int Blinkers_State = 0;
int CDL_Timer = 0;
int Counter = -1;
boolean check_status = false;
volatile int VAR_Interruption = 0;
///////////////////////////////////////////
// Function Prototypes
void INIT(void);
void INPUT_SETTINGS(void);
void PRIORITY(void);
void OUTPUT_SETTINGS(void);
void LOCKING_THE_DOORS(void);
void UNLOCKING_THE_DOORS(void);
void LOCKING_THE_DOORS_OUTPUT(void);
void UNLOCKING_THE_DOORS_OUTPUT(void);
///////////////////////////////////////
void CONFIGURE_TIMER1() {
noInterrupts();
TCCR1A = 0; // Clear all bits of TCCR1A register
TCCR1B = 0; // Clear all bits of TCCR1B register
TCNT1 = 0; // Clear all bits of TCNT1 register
// 1 Hz (16000000/((15624+1)*1024)) ; Clock / Prescaler x ( Compare Match Reg + 1))
OCR1A = 311;
// CTC mode
TCCR1B |= (1 << WGM12);
// 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
//Output Compare match an interrupt enable
TIMSK1 |= (1 << OCIE1A);
TIMSK1 |= (1 << TOIE1);
interrupts();
}
ISR(TIMER1_COMPA_vect) {
VAR_Interruption = 1;
}
void INIT(void) {
Serial.begin(115200);
CONFIGURE_TIMER1();
pinMode(CDL_Pin, INPUT_PULLUP);
pinMode(right_LED_1, OUTPUT);
pinMode(right_LED_2, OUTPUT);
pinMode(left_LED_1, OUTPUT);
pinMode(left_LED_2, OUTPUT);
Blinkers_State = 0;
Counter = -1;
check_status = false;
lcd.begin(16, 2); // Initialize the LCD with 16 columns and 2 rows
lcd.setCursor(0, 0);
lcd.print("NOTHING ");
}
int main(void) {
INIT();
while (true) {
if (VAR_Interruption == 1) {
VAR_Interruption = 0;
PRIORITY();
INPUT_SETTINGS();
OUTPUT_SETTINGS();
Serial.print(" CDL_Timer = ");
Serial.print(CDL_Timer);
Serial.print(" Counter = ");
Serial.println(Counter);
}
}
return 0;
}
void INPUT_SETTINGS(void) {
if (digitalRead(CDL_Pin) == LOW) {
CDL_Timer++;
}
else {
CDL_Timer = 0;
}
}
void PRIORITY(void) {
switch (Blinkers_State) {
case 0:
LOCKING_THE_DOORS();
break;
case 1:
UNLOCKING_THE_DOORS();
break;
}
}
void OUTPUT_SETTINGS(void) {
switch (Blinkers_State) {
case 0:
LOCKING_THE_DOORS_OUTPUT();
break;
case 1:
UNLOCKING_THE_DOORS_OUTPUT();
break;
}
}
void LOCKING_THE_DOORS(void) {
if (CDL_Timer >= 40 && digitalRead(CDL_Pin) == HIGH) {
Counter = 15;
check_status = true;
}
else if (check_status == true && Counter == 0) {
Blinkers_State = 1;
check_status = false;
}
}
void UNLOCKING_THE_DOORS(void) {
if (CDL_Timer >= 40 && digitalRead(CDL_Pin) == HIGH) {
Counter = 50;
check_status = true;
}
else if (check_status == true && Counter == 0) {
Blinkers_State = 0;
var = 0;
check_status = false;
}
}
void LOCKING_THE_DOORS_OUTPUT(void) {
if (Counter > -1) {
Counter--;
}
if (Counter > 0) {
digitalWrite(right_LED_1, HIGH);
digitalWrite(right_LED_2, HIGH);
digitalWrite(left_LED_1, HIGH);
digitalWrite(left_LED_2, HIGH);
lcd.setCursor(0, 0);
lcd.print("locked ");
lcd.setCursor(0, 0);
}
else {
digitalWrite(right_LED_1, LOW);
digitalWrite(right_LED_2, LOW);
digitalWrite(left_LED_1, LOW);
digitalWrite(left_LED_2, LOW);
}
}
void UNLOCKING_THE_DOORS_OUTPUT(void) {
if (Counter > -1 ) {
Counter--;
}
if ( Counter == 0& var < 1)
{
Counter = 50;
var++;
}
if (Counter >= 35) {
lcd.setCursor(0, 0);
lcd.print("unlocked ");
lcd.setCursor(0, 0);
digitalWrite(right_LED_1, HIGH);
digitalWrite(right_LED_2, HIGH);
digitalWrite(left_LED_1, HIGH);
digitalWrite(left_LED_2, HIGH);
}
else {
digitalWrite(right_LED_1, LOW);
digitalWrite(right_LED_2, LOW);
digitalWrite(left_LED_1, LOW);
digitalWrite(left_LED_2, LOW);
}
}