//#include <VarSpeedServo.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 16000000
int pinA = 8;
int pinB = 9;
int pinC = 4;
int pinD = 3;
int pinE = 2;
int pinF = 7;
int pinG = 6;
int pinP = 5;
#define buzz PB6 // BUZZER
#define ledR1 PB0 // RED LIGHT AT THE MAIN ROAD //TRAFFIC
#define ledY1 PB1 // YELLOW LIGHT AT THE MAIN ROAD //TRAFFIC
#define ledG1 PB2 // GREEN LIGHT AT THE MAIN ROAD //TRAFFIC
#define ledR2 PB3 // RED LIGHT AT U-TURN //TRAFFIC
#define ledY2 PB4 // YELLOW LIGHT AT U-TURN //TRAFFIC
#define ledG2 PB5 // GREEN LIGHT AT U-TURN //TRAFFIC
#define ledtr PF0 // PEDESTRIAN CROSS RED LED
#define ledtg PF1 // PEDESTRIAN CROSS GREEN LED
#define IR1 PD3 //IR SENSOR
#define IR2 PJ1 //IR SENSOR
#define IR3 PA0 //IR SENSOR
#define IR4 PA1 //IR SENSOR
#define ledoff PA4 //MAIN SWITCH LED RED
#define ledon PA5 //MAIN SWITCH LED GREEN
#define ledflash PA6 // WHITE LED FLASH (RADAR)
#define button1 PC3 //BUTTON 1 FOR THE PEDESTRIAN
#define button2 PK0 //BUTTON 2 (THE MAIN TRAFFIC SWITCH)
volatile unsigned char elec=0; //SOME of these volatile variables are no longer used
volatile unsigned int e=0;
volatile unsigned int ldrStatus=0;
volatile unsigned int pinchange = 0;
volatile unsigned int x = 0;
volatile unsigned int S = 0;
int o=0;
int sens1 =22;
int sens2 =23;
ISR(TIMER3_OVF_vect){ // TIMER 3 INTURREPTS ,AFTER SOME TIME , IT CHECKS IF THE LIGHT BECOME UNDER CERTAIN VALUE OR NOT TO OPEN THE LIGHT OR NOT (LDR SENSOR )
int ldrStatus = analogRead(A11); /* ASLO THAT BLOCK HAS BEEN ADDED IN ANOTHER PARTS OF THE CODE TO MAKE SURE THE STREET LIGHTS ARE ON AT NIGHT EVEN THE CODE IS IN ANOTHER INTURREPT*/
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
}
volatile unsigned int count=0;
volatile unsigned long start =0;
volatile unsigned long t1 =0;
volatile unsigned long t2 =0;
volatile float t3=0;
ISR(TIMER2_OVF_vect){ // if the uturn traffic is green and pedestrians are allowed to cross the street , and a car from the main road did not stop before the white
// line or just broke the traffic , for safety , the buzzer will alert the pedestrians and the 7-segment display will plink, also the servo(gate)
S++; // will close at the u-turn slowly(MODIFIED AFTER THE PRESENTATION) to avoid any accident ( timer check if pinchange (ir sensor at the white line (main road ))
if(S>=100){ //that come from the pinchange inturrept below
if(pinchange==1){
pinchange=0;
S=0;
int ldrStatus = analogRead(A11); //CHECK FOR THE LDR AGAIN
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
PORTF &= ~(1<<ledtg);
TCNT2=99;
OCR5A=350; // CONTROLLING THE SERVO
_delay_ms(100);
OCR5A=340;
_delay_ms(100);
OCR5A=320;
_delay_ms(100);
OCR5A=300;
_delay_ms(100);
OCR5A=280;
_delay_ms(100);
OCR5A=260;
_delay_ms(100);
OCR5A=220;
_delay_ms(100);
OCR5A=190;
_delay_ms(500);
OCR5A=150;
_delay_ms(500);
ldrStatus = analogRead(A11); //CHECK FOR THE LDR AGAIN
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
PORTB |= (1<<ledG2); // LEDS AND THE 7-SEGMENT DISPLAY
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz);
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
OCR5A=140; // SERVO
_delay_ms(500);
OCR5A=130;
_delay_ms(500);
PORTB |= (1<<ledG2);
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz);
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
PORTB |= (1<<ledG2);
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
ldrStatus = analogRead(A11); //CHECK THE LDR AGAIN
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz);
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
OCR5A=120; // CONTOLLING THE SERVO(GATE)
_delay_ms(500);
OCR5A=75;
_delay_ms(500);
PORTB |= (1<<ledG2);
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz); //BUZZER
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
ldrStatus = analogRead(A11); //CHECK THE LDR
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
OCR5A=100;
_delay_ms(500);
OCR5A=75;
_delay_ms(500);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTB &= ~(1<<ledG2);
PORTB |= (1<<ledY2);
_delay_ms(1000);
PORTB &= ~(1<<ledY2);
PORTB |= (1<<ledR2);
_delay_ms(3500);
PORTB &= ~(1<<ledR2);
PORTB |= (1<<ledG2);
PORTF |= (1<<ledtg);
OCR5A=360; //AFTER SOME TIME THE TRAFFIC RETURNS TO ITS ORGINAL SITUATION THE GATE OPENS AGAIN
_delay_ms(1500);
}
}
TCNT2=99;
pinchange=0;
}
ISR(PCINT1_vect ) // pinchange inturrept ( for the IR SENSOR AT THE MAIN ROAD WHITE LINE to detect any car passing the white line when the main road(2 lanes) is RED
{
pinchange=1;
x=0;
}
void(* resetFunc) (void) = 0; //the reset function
ISR(PCINT2_vect ){ //THIS PINCHANGE INTURREPT IS FOR THE MAIN SWITCH TO RESET THE CODE AGAIN and evey thing shutdown until the main switched has been turned on
resetFunc(); //calling the reset function
}
int main() {
pinMode(sens1 , INPUT); // configuring all outputs ,inputs ,timers and inturrepts
pinMode(sens2 , INPUT);
DDRK &= ~(1<<PK3);
DDRK &= ~(1<<PK0);
PORTK |= (1<<button2);
DDRG |= (1<<PG0);
DDRA &= ~((1<<IR3)|(1<<IR4));
DDRB=0xff;
DDRA |= (1<<ledoff) | (1<<ledon) | (1<<ledflash);
DDRC &= ~(1<<button1);
DDRD &= ~(1<<IR1);
PORTC |= (1<<button1);
DDRC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC4)|(1<<PC5);
DDRF |= (1<<ledtr)|(1<<ledtg);
PORTB &= ~(1<<ledY1);
PORTA |= (1<<ledoff);
PORTA &= ~(1<<ledon);
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinP, OUTPUT);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
DDRJ &= ~(1<<IR2);
DDRD &= ~(1<<IR1);
DDRD |= (1<<PD2)|(1<<PD1);
PORTF &= ~(1<<ledtg);
PORTF &= ~(1<<ledtr);
PORTB &= ~(1<<ledG1);
PORTB &= ~(1<<ledR2);
PORTB &= ~(1<<ledR1);
PORTB &= ~(1<<ledY1);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<ledY2);
PORTA &= ~(1<<ledflash);
int w=0;
int k=0;
int h=0;
int y=0;
int b=0;
cli();
PCICR|= ( 1<< PCIE1) ;
PCMSK1 |= ( 1<< PCINT10);
TCCR5A|=(1<<COM5A1)|(1<<COM5B1)|(1<<WGM51);
TCCR5B|=(1<<WGM53)|(1<<WGM52)|(1<<CS51)|(1<<CS50);
ICR5=4999; //fPWM=50Hz
DDRL|=(1<<PL3);
TCCR3A = 0 ;
TCCR3B = 0 ;
TCNT3 = 600 ;
TIMSK3 |= ( 1<< TOIE3) ;
TCCR3B |= ( 1<< CS31 ) | ( 1<< CS30 ) ;
TCCR1A = 0 ;
TCCR1B = 0 ;
TCNT1 = 0 ;
TCCR4A = 0 ;
TCCR4B = 0 ;
TCNT4 = 59285 ;
TIMSK4 |= ( 1<< TOIE4) ;
Serial.begin(9600);
pinMode(41, OUTPUT);
pinMode(A11, INPUT);
PCICR&= ~(1 << PCIE2);
PCMSK2 &= ~( 1<< PCINT16);
TCCR2A = 0 ;
TCCR2B = 0 ;
TCNT2 = 99 ;
TIMSK2 |= ( 1<< TOIE2) ;
sei();
OCR5A=100; //90 degree
_delay_ms(500);
while(1) {
if((PINK & (1<<button2))==0){
PORTA &= ~(1<<ledoff); //wait for the main switch to be pressed ( turn on)
PORTA |=(1<<ledon);
PORTF |= (1<<ledtr);
PORTB |= (1<<ledG1);
PORTB |= (1<<ledR2);
PORTB &= ~(1<<ledR1);
OCR5A=360;
_delay_ms(500);
_delay_ms(3000);
PCICR|= (1 << PCIE2); // set the pinchange inturrept which reset the whole code (to make sure it does not work when the button is pressed)
PCMSK2 |= ( 1<< PCINT16);
y=1;
b =1;
} // the radar is only working when the MAIN ROAD IS GREEN
if(digitalRead(sens1)==0){ //the RADAR ,once the ir sensor sense a car .Timer 1 starts
t1=TCNT1; //t1 is eqaul to tcnt1
TCCR1B |= ( 1<< CS12 ) | ( 1<< CS10 ) ;
while(digitalRead(sens2)); //ir 2 sense the car again
t2=TCNT1; // t2 equal to the next value of tcnt1 when it passes infront the next ir sensor
t3 =t2-t1; //t3 the difference between t2 and t1
if(t3<30000){ //if t3 < 30000 approx 2 seconds (flash that car)
PORTA |= (1<<ledflash);
_delay_ms(200);
PORTA &= ~(1<<ledflash);
}
else{
TCNT1=0;
}
}
if((PIND & (1<<IR1)) ==0 && w==0 && y==1){ //IR1 is the U-turn sensor the sense when a car at the u-turn is waiting
k=1;
w=1;
b=0;
}
if((PINC & (1<<button1)) ==0 && w==0 && y==1){ //button 1 is the pedestrian button at both sides of the main road
k=1;
w=1;
b=0;
}
if(k==1){ //either IR1 or one of the push button is pressed , the main road turns red and at the same time the uturn turns green and pedestrians can cross
_delay_ms(10000);
for(int i=0 ; i<=5;i++){
PORTB ^= (1<<ledG1);
_delay_ms(500);
}
PORTB &= ~(1<<ledG1);
PORTB |= (1<<ledY1);
_delay_ms(3000);
PORTB &= ~(1<<ledY1);
TCCR2B |= ( 1<< CS22) | ( 1<< CS21 ) | ( 1<< CS20 ) ;
S=0;
PORTB |= (1<<ledR1);
PORTB &= ~(1<<ledR2);
PORTB |= (1<<ledG2);
PORTF &= ~(1<<ledtr);
PORTF |= (1<<ledtg);
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
//3
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTF |= (1<<ledtg);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTF &= ~(1<<ledtg);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
PORTF |= (1<<ledtg);
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
//4
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
PORTF &= ~(1<<ledtg);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
PORTF |= (1<<ledtg);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(1000);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTF &= ~(1<<ledtg);
PORTF |= (1<<ledtr);
TCCR2B=0;
TCNT2=99;
k=0;
h=1;
}
if(k==0 && h==1){ //when the 10 seonds pass the normal situation returns back and the main road turns to be green becsuse it is the major road that
b=1; // much cars use it
for(int i=0 ; i<=5;i++){
PORTB ^= (1<<ledG2);
_delay_ms(500);
}
PORTB &= ~(1<<ledG2);
PORTB |= (1<<ledY2);
_delay_ms(3000);
PORTB &= ~(1<<ledY2);
PORTB |= (1<<ledR2);
PORTB &= ~(1<<ledR1);
PORTB |= (1<<ledG1);
PORTF |= (1<<ledtr);
h=0;
w=0;
}
}
}
Comments
Please log in or sign up to comment.