While working on the code and improving it I encountered another problem. When scan2 completes and starts scan1, scan1 doesn't complete and scan2 starts again. Here is the new code
#include <Servo.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#define len 10
Adafruit_MLX90614 mlx;
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
int flame_sensor = 8;
int flame = 0;
int motor1pin1 = 2;
int motor1pin2 = 3;
int motor2pin1 = 4;
int motor2pin2 = 5;
float d1 = 3.4;
float temp = 0;
float fire_temp = 39.0;
int motorspeed = 100;
int motor1speedpin = 11;
int motor2speedpin = 6;
float scan_temp = 0;
float max_temp = 0;
float scan_temp_array[len];
int degree = 0;
int pos1 = 0;
int pos2 = 0;
int equal = 0;
int i = 0;
long sum = 0;
int pump = 7;
void setup() {
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo.write(90);
pinMode(motor1pin1, OUTPUT);
pinMode(motor1pin2, OUTPUT);
pinMode(motor2pin1, OUTPUT);
pinMode(motor2pin2, OUTPUT);
pinMode(motor1speedpin, OUTPUT);
pinMode(motor2speedpin, OUTPUT);
pinMode(flame_sensor, INPUT);
mlx.begin();
}
void put_of_fire(){
digitalWrite(pump, HIGH);
for (pos = 45; pos <= 135; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(30);
}
digitalWrite(pump, LOW);
}
void scan1() {
Serial.println("scan1");
for (pos = 45; pos <= 135; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
sum = 0;
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(5);
Serial.println(len);
for (i = 0; i<=len; i+=1) {
scan_temp_array[i]=mlx.readObjectTempC();
delay(1);
}
Serial.println("read");
for (i = 0; i<=len; i+=1) {
sum += scan_temp_array[i];
}
Serial.println("added");
scan_temp = roundf(sum/len);
Serial.println(scan_temp);
if (scan_temp >= max_temp){
if (scan_temp != max_temp){
max_temp = scan_temp;
degree = pos;
}
else {
equal=1;
if (pos<90) {
pos1 = pos;
}
else {
pos2 = pos;
}
}
}
}
if (equal == 1) {
degree = (pos1+pos2)/2;
}
if (degree<90){
digitalWrite(motor1speedpin, HIGH);
digitalWrite(motor1pin1, HIGH);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2speedpin, HIGH);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, HIGH);
delay(d1*(90-degree));
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
myservo.write(90);
return;
} else if(degree>90){
digitalWrite(motor1speedpin, HIGH);
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, HIGH);
digitalWrite(motor2speedpin, HIGH);
digitalWrite(motor2pin1, HIGH);
digitalWrite(motor2pin2, LOW);
delay(d1*(degree-90));
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
myservo.write(90);
return;
}
}
void scan2() {
while(true){
Serial.println("scan2");
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(30); // waits 15 ms for the servo to reach the position
if(Serial.available()>0){ // read value from serial monitor
flame = Serial.readString().toInt();
}
if (digitalRead(flame_sensor)==0||flame==1){
if (pos<90){
digitalWrite(motor1speedpin, HIGH);
digitalWrite(motor1pin1, HIGH);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2speedpin, HIGH);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, HIGH);
delay(d1*(90-pos));
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
myservo.write(90);
Serial.println("scan2 break1");
break;
} else if(pos>90){
digitalWrite(motor1speedpin, HIGH);
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, HIGH);
digitalWrite(motor2speedpin, HIGH);
digitalWrite(motor2pin1, HIGH);
digitalWrite(motor2pin2, LOW);
delay(d1*(pos-90));
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
myservo.write(90);
Serial.println("scan2 break1");
break;
}
}
}
if(pos != 181){
Serial.println("scan2 to scan1");
scan1();
break;
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(30); // waits 15 ms for the servo to reach the position
if(Serial.available()>0){ // read value from serial monitor
flame = Serial.readString().toInt();
}
if (digitalRead(flame_sensor)==0||flame==1){
if (pos<90){
digitalWrite(motor1speedpin, HIGH);
digitalWrite(motor1pin1, HIGH);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2speedpin, HIGH);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, HIGH);
delay(d1*(90-pos));
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
myservo.write(90);
Serial.println("scan2 break1");
break;
} else if(pos>90){
digitalWrite(motor1speedpin, HIGH);
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, HIGH);
digitalWrite(motor2speedpin, HIGH);
digitalWrite(motor2pin1, HIGH);
digitalWrite(motor2pin2, LOW);
delay(d1*(pos-90));
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
myservo.write(90);
Serial.println("scan2 break1");
break;
}
}
}
if(pos != -1){
Serial.println("scan2 to scan1");
scan1();
break;
}
analogWrite(motor1speedpin, motorspeed);
analogWrite(motor2speedpin, -motorspeed);
digitalWrite(motor1pin1, HIGH);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, HIGH);
digitalWrite(motor2pin2, LOW);
delay(500);
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
}
}
void loop(){
scan2();
Serial.println("main loop");
while(true){
temp = mlx.readObjectTempC();
Serial.println(mlx.readObjectTempC());
if (temp > fire_temp) {
digitalWrite(motor1pin1, LOW);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, LOW);
digitalWrite(motor2pin2, LOW);
delay(99999999);
put_of_fire();
break;
} else {
analogWrite(motor1speedpin, motorspeed);
analogWrite(motor2speedpin, -motorspeed);
digitalWrite(motor1pin1, HIGH);
digitalWrite(motor1pin2, LOW);
digitalWrite(motor2pin1, HIGH);
digitalWrite(motor2pin2, LOW);
}
}
}
Here is the serial logs
20:57:28.507 -> scan2 break1
20:57:28.507 -> scan2 to scan1
20:57:28.540 -> scan1
20:57:28.540 -> 10
20:57:29.002 -> scan2
20:57:40.374 -> scan2