// Setting Motor A
int enable1Pin = 14;
int motor1Pin1 = 27;
int motor1Pin2 = 26;

//Settin Motor B
int enable2Pin = 32;
int motor2Pin3 = 25;
int motor2Pin4 = 33;

// define pins for flame sensor
#define FlamePinForawrd 17
#define FlamePinForawrdAnlog 16
#define FlamePinRight 15
//#define FlamePinLeft

// pin 13 that connects to the relay to control the pump
#define RELAY_PIN   12

//pins for siren led and buzzer
//right siren
#define RightLedBlue 2
#define RightLedRed 21
#define RightBuzzer 19
//left siren
#define LeftLedBlue 22
#define LeftLedRed 18
#define LeftBuzzer 23


void setup() {
  //modding motor A
  pinMode(enable1Pin, OUTPUT);
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);

  //modding Motor B
  pinMode(enable2Pin, OUTPUT);
  pinMode(motor2Pin3, OUTPUT);
  pinMode(motor2Pin4, OUTPUT);

  //setting flame sensor
  pinMode(FlamePinForawrd, INPUT);
  pinMode(FlamePinForawrdAnlog, INPUT);
  pinMode(FlamePinRight, INPUT);
  //pinMode(FlamePinLeft, INPUT);

  //setting siren for left
  pinMode(LeftLedBlue, OUTPUT);  //defined port for left leds
  pinMode(LeftLedRed, OUTPUT);
  pinMode(LeftBuzzer, OUTPUT); // left  buzzer

  //setting siren for right
  pinMode(RightLedBlue, OUTPUT);  //defined port for right leds
  pinMode(RightLedRed, OUTPUT);
  pinMode(RightBuzzer, OUTPUT); // port front buzzer

  // initaite serial monitor
  Serial.begin(9600);

}

void loop() {

  int FlameCheckForawrd = digitalRead(FlamePinForawrd);
  int FlameCheckForawrdAnalog = analogRead(FlamePinForawrdAnlog);
  int FlameCheckRight = digitalRead(FlamePinRight);
  //int FlameCheckLeft = digitalRead(FlamePinLeft);

  ///sensorTest();


  if (FlameCheckForawrd == LOW)
  {
    Serial.println("flame dected a head");
    FlameCheckForawrdAnalog = analogRead(FlamePinForawrdAnlog);
    Serial.println(FlameCheckForawrdAnalog);
    delay(200);

    if (FlameCheckForawrdAnalog < 1000) {

      CAR_moveForwardWifi();
      // front fire indicated by both siren on
      Serial.println("left and right sirens on");
      sirenOn(RightLedBlue, RightLedRed, RightBuzzer);
      delay(200);
      sirenOn(LeftLedBlue, LeftLedRed, LeftBuzzer);
      delay(200);
      digitalWrite(RELAY_PIN, HIGH);
    }
    else
    {
      StopCar();
      Serial.println("car stopping");
      //stop both siren when in safe distance from fire
      Serial.println("left and right sirens off");
      sirenoff(RightLedBlue, RightLedRed, RightBuzzer);
      sirenoff(LeftLedBlue, LeftLedRed, LeftBuzzer);
    }

  }



  else if (FlameCheckRight == LOW)
  {
    Serial.println("flame dected on the right");
    if (FlameCheckForawrd != LOW)
    {
      FlameCheckForawrd = digitalRead(FlamePinForawrd);
      Serial.println("turning right");
      Serial.println("right siren on");
      sirenOn(RightLedBlue, RightLedRed, RightBuzzer);
      CAR_turnRightWifi();
      delay(200);
    }

    else {
      StopCar();
      Serial.println("car stopping");
      //stop siren when flame in front the front falme sensor
      Serial.println("right siren off");
      sirenoff(RightLedBlue, RightLedRed, RightBuzzer);
    }

  }
  //else if (FlameCheckLeft == LOW)
  //{
  //Serial.println("flame dected on the left");
  //while(FlameCheckForawrd != LOW)
  //{
  //FlameCheckForawrd = digitalRead(FlamePinForawrd);
  //Serial.println("turning left");
  //CAR_turnLeftWifi();
  //delay(200);
  //}
  //}

  else
  {
    StopCar();
  }


  //delay(300);//change this va

}


// stop car
void StopCar() {
  Serial.println("StopCar");
  analogWrite(enable1Pin, 0);
  analogWrite(enable2Pin, 0);

  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, LOW);
  delay(700);
}

void CAR_moveForwardWifi() {
  //Set speed motor A and B
  analogWrite(enable1Pin, 186);
  analogWrite(enable2Pin, 200);
  //move forawrd
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin3, HIGH);
  digitalWrite(motor2Pin4, LOW);
}

void CAR_moveBackwardWifi() {
  //setting speed motor A and B
  analogWrite(enable1Pin, 190);
  analogWrite(enable2Pin, 200);
  //back movement
  digitalWrite(motor1Pin1, HIGH);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, HIGH);
}

void CAR_turnLeftWifi() {
  //Set speed motor A and B

  analogWrite(enable1Pin, 255);
  analogWrite(enable2Pin, 0);
  //turn left
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
  digitalWrite(motor2Pin3, LOW);
  digitalWrite(motor2Pin4, LOW);
}

void CAR_turnRightWifi() {
  //Set speed motor A and B
  analogWrite(enable1Pin, 255);
  analogWrite(enable2Pin, 255);
  //turn right
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
  digitalWrite(motor2Pin3, HIGH);
  digitalWrite(motor2Pin4, LOW);
}

void sensorTest() {
  while (1) {
    for (int i = 0; i < 3; i++) {
      Serial.print(digitalRead(i + 15)); // read "flame" sensors
    }
    Serial.println(); // print the sensor state
    delay(250);
  }
}

//functions for siren
void sirenOn(int Led1Pin, int Led2Pin, int BuzzerPin)
{
  int i;

  for (int i = 700; i < 800; i++) // duration of the first sound 350 2 millisecond cycles.

  {
    tone(BuzzerPin, i);
    delay(15);
    digitalWrite(Led1Pin, HIGH); // turn on the leds
    digitalWrite(Led2Pin, LOW);
    delay(30);
    digitalWrite(Led1Pin, LOW); // blinking leds
    digitalWrite(Led2Pin, HIGH);
    delay(30);
    delay(15); // wait 1 millisecond and restart from the for statement (100 repetitions)
  }

  for (i = 800; i > 700; i--) {
    tone(BuzzerPin, i);
    delay(15);
    digitalWrite(Led1Pin, HIGH); // turn on the leds
    digitalWrite(Led2Pin, LOW);
    delay(30);
    digitalWrite(Led1Pin, LOW); // blinking leds
    digitalWrite(Led2Pin, HIGH);
    delay(30);
    delay(15); // wait 1 millisecond and restart from the for statement (100 repetitions)
  }
}

void sirenoff(int Led1Pin, int Led2Pin, int BuzzerPin)
{
  digitalWrite(Led1Pin, LOW); // turn off blinking leds
  digitalWrite(Led2Pin, LOW);

  tone(BuzzerPin, 0); // turn off buzzer

}
REV
FWD
REV
FWD
EN2
EN1
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
MOTORS: HIGH POWER
DEVICES: LOW POWER
COMMON GROUND
NOCOMNCVCCGNDINLED1PWRRelay Module
RELAY PIN