Πέμπτη, 14 Μαΐου 2020

Έλεγχος φωτεινών σηματοδοτώνκαι προστασία σε περίπτωση δασικής πυρκαγιάς



Η λύση που προτείνουμε στοχεύει στον έλεγχο λειτουργίας των φωτεινών σηματοδοτών σε περίπτωση δασικής πυρκαγιάς, ώστε να απεγκλωβιστούν όσοι είναι σε οδό που διέρχεται από δάσος (οδός 1) και καταλήγει σε αστικό ιστό (οδός 2). Στη διασταύρωση όπου καταλήγει η οδός που διέρχεται από δάσος υπάρχουν φανάρια. Προτεραιότητα έχουν όσοι κινούνται στην οδό που είναι σε αστικό ιστό.
                Κοντά στο φανάρι της οδού 1 τοποθετείται αισθητήρας υπερήχων, με στόχο την ανίχνευση ύπαρξης αυτοκινήτου. Σε επιλεγμένα σημεία της ίδιας οδού τοποθετείται αισθητήρας θερμοκρασίας (LM 35 - arduino) και αισθητήρας ανίχνευσης φλόγας (Chip με LED υπερύθρων - Arduino). Ο έλεγχος γίνεται με το Arduino UNO.
1) Σενάριο μη ύπαρξης πυρκαγιάς:
- Αν ο αισθητήρας υπερήχων ανιχνεύσει αυτοκίνητο στο φανάρι της οδού που διέρχεται από το δάσος, μετά από λογικό χρονικό διάστημα, θα μεταβεί το φανάρι της οδού του αστικού ιστού σε κίτρινο και κόκκινο, ενώ εκείνο της οδού 1 σε πράσινο και μετά κίτρινο, κόκκινο. Κατόπιν, θα δοθεί πράσινο στην οδό 2.
2)Σενάριο ύπαρξης φωτιάς στο δάσος:
Αν ο αισθητήρας ανίχνευσης φλόγας ή της θερμοκρασίας εντοπίσουν πυρκαγιά, τότε:
α) Αυτόματα θα ενεργοποιηθεί ο κρουνός και θα αρχίσει να ρίχνει νερό. Με προσαρμογή περιστρεφόμενου ποτιστηριού στον κρουνό, είναι δυνατό να δημιουργηθεί ζώνη προστασίας από φωτιά για το  δρόμο 1.
β) Αν ο αισθητήρας υπερήχων έχει εντοπίσει αυτοκίνητο, σε σύντομο χρονικό διάστημα (συντομότερο από το σενάριο 1) θα ανάψει πράσινο στην οδό που διέρχεται από το δάσος. Ο αισθητήρας υπερήχων θα ελέγξει σε λίγο και πάλι για ύπαρξη αυτοκινήτου και αν δεν υπάρχει, θα δώσει εντολή τελικά για πράσινο στην οδό του αστικού ιστού. Και συνεχίζεται ο κύκλος του σεναρίου β.

γ) Αν ο αισθητήρας υπερήχων εξακολουθεί να εντοπίζει αυτοκίνητα, τότε:
Παρατείνεται το πράσινο στο δασικό δρόμο για αρκετό χρονικό διάστημα, όμως όχι μόνιμα (δεν έχει νόημα να αποκλειστούν τα αυτοκίνητα του αστικού ιστού). Μετά από ικανό χρονικό διάστημα, ο σηματοδότης της αστικής οδού θα σβήσει και εκείνος της δασικής θα αναβοσβήνει συνεχώς κίτρινο (τα αυτοκίνητα της οδού 1 περνάνε παραχωρώντας προτεραιότητα). Επίσης στα φανάρια θα υπάρχουν και κατάλληλα σήματα προτεραιότητας.


Ο κρουνός , αν έχει ενεργοποιηθεί, θα σταματάει μόνο χειροκίνητα. Αυτό διότι αν καούν οι  αισθητήρες, δε θα δίνουν ένδειξη, οπότε το σύστημα ελέγχου θα θεωρεί ότι η φωτιά έσβησε .

Υπάρχει και ανεξάρτητος διακόπτης ενεργοποίησης του κρουνού, σε περίπτωση αποτυχίας του συστήματος αυτομάτου ελέγχου.

Το πρόγραμμα δίνεται παρακάτω:

//trsffic lights
int citygreen = 7;
int cityyellow = 2;
int cityred = 3;
int forestgreen = 4;
int forestyellow = 5;
int forestred = 6;
int flamepin = 8;
int flameval;

int carcount = 0;
//ultrasonic
int trig = 9;
int echo = 10;
long duration;
int distance;
int dist;
int distold;
//temperature
int val;
int temp = 1; //Analog input 1
float mv;
float c;
float celcius;
//fire
int fireflag = 0;
//water
int water = 11;
//reset button
int button = 12;
int buttonval = 0;
// manual button
int manual=13;
int manualval=0;

void setup() {
  // initialisation of I/Os
  pinMode(citygreen, OUTPUT);
  pinMode(cityyellow, OUTPUT);
  pinMode(cityred, OUTPUT);
  pinMode(forestgreen, OUTPUT);
  pinMode(forestyellow, OUTPUT);
  pinMode(forestred, OUTPUT);
  pinMode(trig, OUTPUT);
  pinMode (echo, INPUT);
  pinMode (flamepin, INPUT);
  pinMode(water, OUTPUT);
  pinMode (button, INPUT);
  pinMode (manual, INPUT);
  Serial.begin(9600);
}

void loop() {
  // initialisation of the traffic ligts

  digitalWrite (citygreen, HIGH);
  digitalWrite (cityyellow, LOW);
  digitalWrite (cityred, LOW);
  digitalWrite (forestgreen, LOW);
  digitalWrite (forestyellow, LOW);
  digitalWrite (forestred, HIGH);


  carcount = 0;
  Serial.print ("Distance: ");
  Serial.println(dist);
  Serial.print ("carcount: ");
  Serial.println(carcount);
  Serial.print ("buttonval: ");
  Serial.println(buttonval);
  manualval = digitalRead(manual);
  if (manualval == HIGH) {
    fireflag = 1;
  }

  //checking the temperature sensor
  celcius = temp_sensor();
  if (celcius > 30) {
    delay(2000);
    celcius = temp_sensor();
    if (celcius > 30) {
      fireflag = 1;
    }

 manualval = digitalRead(manual);
  if (manualval == HIGH) {
    fireflag = 1;
  }
  }

  //checking the flame sensor
  flameval = digitalRead(flamepin); //checking for fire indication
  if (flameval == HIGH) {
    delay (3000);
    flameval = digitalRead(flamepin); //doublechecking for fire

    if (flameval == HIGH) {
      fireflag = 1;
    }

manualval = digitalRead(manual);
  if (manualval == HIGH) {
    fireflag = 1;
  }
  }
  Serial.println(fireflag);

  if (fireflag == 1) {
    digitalWrite (water, HIGH); // start throwing water, if fire alarm is on
  }
  else
  {
    digitalWrite (water, LOW);
  }

  //check if reset button is pressed.
  buttonval = digitalRead(button);
  if (buttonval == HIGH) {
    fireflag = 0;
  }

  // checking the existance of the car under the sensor


  dist =  ultrasonic();
  if (dist < 10 && fireflag == 0) {
    delay (3000);
    // double checking the exestance of the car under the sensor to avoid wrong entry
    dist =  ultrasonic();
manualval = digitalRead(manual);
  if (manualval == HIGH) {
    fireflag = 1;
  }
    if (dist < 10 && fireflag == 0) {
      delay (4000);
      digitalWrite (citygreen, LOW);
      digitalWrite (cityyellow, HIGH);
      delay (2000);
      digitalWrite (cityyellow, LOW);
      digitalWrite (cityred, HIGH);
      delay (1000);
      digitalWrite (forestgreen, HIGH);
      digitalWrite (forestred, LOW);
      delay (3000);
      digitalWrite (forestyellow, HIGH);
      digitalWrite (forestgreen, LOW);
      delay(2000);
      digitalWrite (forestyellow, LOW);
      digitalWrite (forestred, HIGH);
      delay (1000);

    }
  }
  manualval = digitalRead(manual);
  if (manualval == HIGH) {
    fireflag = 1;
  }
  // checking the existance of car under the sensor with fire alarm on.
  if (dist < 10 && fireflag != 0) {

    digitalWrite (citygreen, LOW);
    digitalWrite (cityyellow, HIGH);
    delay (2000);
    digitalWrite (cityyellow, LOW);
    digitalWrite (cityred, HIGH);
    delay (1000);
    digitalWrite (forestgreen, HIGH);
    digitalWrite (forestred, LOW);
    delay (3000);


    dist =  ultrasonic();
    buttonval = digitalRead(button);
    if (buttonval == HIGH) {
      fireflag = 0;
    }
    while ( dist < 10 && carcount <= 3 && fireflag != 0) {
      delay (4000);
      carcount++;
     
      buttonval = digitalRead(button);
      if (buttonval == HIGH) {
        fireflag = 0;
      }
      dist =  ultrasonic();
      Serial.print ("carcount: ");

      Serial.println(carcount);
      //check if reset button is pressed.
      buttonval = digitalRead(button);

    }
    if (carcount <= 3) {
      digitalWrite (forestgreen, LOW);
      digitalWrite (forestyellow, HIGH);
      delay (2000);
    }
  }

  //after adequate time, the city road cars must be released
  //and the drivers must drive without traffic lights, with the
  //drivers of the forest road giving way.
  if (carcount > 3) {
    while (fireflag != 0 ) {
      digitalWrite (citygreen, LOW);
      digitalWrite (cityyellow, LOW);
      digitalWrite (cityred, LOW);

      digitalWrite (forestgreen, LOW);
      digitalWrite (forestred, LOW);

      digitalWrite (forestyellow, HIGH);
      delay (2000);
      digitalWrite (forestyellow, LOW);
      delay (2000);
      flameval = digitalRead(flamepin); //checking for fire indication
      Serial.println(flameval);
      celcius = temp_sensor();
      //check if reset button is pressed.
      buttonval = digitalRead(button);
      if (buttonval == 1) {
        fireflag = 0;
      }
    }

  }


} //end of program


//function ultrasonic()
int ultrasonic() // function declaration
{
  digitalWrite(trig, LOW);
  delayMicroseconds (2);
  digitalWrite(trig, HIGH);
  delayMicroseconds (10);
  digitalWrite(trig, LOW);

  duration = pulseIn(echo, HIGH);
  distance = duration * 0.034 / 2;
  Serial.print ("Distance: ");
  Serial.println(distance);
  return distance;
}

// function temp_sensor
float temp_sensor()
{
  val = analogRead (temp);
  float mv = (val / 1024.0) * 5000; //conversion to Celcius Degrees
  float c = mv / 10; //conversion to Celcius Degrees
  Serial.print("Temperature= ");
  Serial.print(c);
  Serial.print("oC");
  Serial.println();
  return c;
}