Проблема при подключении 3 датчиков пламени и сервопривода к пожарному устройству Arduino

Я пытался создать робота-пожарного Arduino, но столкнулся с несколькими проблемами при совместном подключении 3 датчиков пламени и сервопривода. Когда я загружаю следующий код( который я опубликовал в конце моего письма), мой робот идет назад и обнаруживает пламя на переднем датчике и отображает "Пламя спереди" на ЖК-дисплее 16x2, насос 5 В откачивает воду, и красный светодиод мигает. Но я хочу, чтобы мой робот работал следующим образом - изначально мой робот будет находиться в состоянии покоя. В передней части робота установлены 3 датчика. И есть сервопривод SG90 для вращения резервуара для воды( в этом резервуаре есть двигатель насоса 5 В, и двигатель насоса будет откачивать воду из этого резервуара). Когда любой из трех датчиков пламени обнаружит пламя , сервопривод будет вращаться в этом направлении, а когда передний датчик пламени обнаружит возгорание, сервопривод будет находиться под углом 90 градусов, и вода будет откачана. На ЖК - дисплее отобразится состояние датчиков пламени. Но робот работает неправильно. Я не могу соединить 3 датчика пламени и сервопривод вместе. Мой робот работает не в соответствии с моими ожиданиями, как я уже говорил ранее.

int pos = 0;    
boolean fire = false;

#include <LiquidCrystal.h>  
int Contrast=20;// for adjusting the brightness of the LCD , 20 is selected for the contrast of LCD
LiquidCrystal lcd(30,31,32,33,34,35);   
int buzz= 38; //for led or buzzer
#define Left_S 9 // left sensor
#define Right_S 8     // right sensor
#define Forward_S 23  //forward sensor
#define LM1 52 //for pump motor     
#define LM2 53 //for pump motor
#define IN1 5   //for motor  
#define IN2 4  // for motor    
#define IN3 3      //for motor
#define IN4 22     // for motor
//int flame_pin1 = HIGH ; 
int LEDR= 36; // for danger signal
int LEDB=37;// for safe signal

void setup ( )  {
   analogWrite(6,Contrast);
     lcd.begin(16, 2);
      pinMode(Left_S, INPUT);
  pinMode(Left_S, INPUT);
  pinMode(Right_S, INPUT);
     pinMode (Forward_S,OUTPUT);
     pinMode (LEDB,OUTPUT);
 pinMode(LM1, OUTPUT);
 pinMode(LM2, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode( buzz,OUTPUT );
  pinMode(LEDR,OUTPUT);
  pinMode(LEDB, OUTPUT);
 // pinMode ( flame_sensor_pinM , INPUT ); 
  //Serial.begin ( 9600 );
   myservo.attach(25);
  myservo.write(90);
}
 void put_off_fire()
{
    delay (500);
 
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, HIGH);
    
   digitalWrite(LM1, HIGH); 
   digitalWrite(LM2, LOW);
   delay(500);
    
    for (pos = 50; pos <= 130; pos += 1) { 
    myservo.write(pos); 
    delay(10);  
  }
  for (pos = 130; pos >= 50; pos -= 1) { 
    myservo.write(pos); 
    delay(10);
  }
  
  digitalWrite(LM1,LOW);
  digitalWrite(LM2,LOW);
  myservo.write(90);
  
  fire=false;
}
 

void loop ( ){
   myservo.write(90); //Sweep_Servo();  
 
    if (digitalRead(Left_S) ==1 && digitalRead(Right_S)==1 && digitalRead(Forward_S) ==1) //If Fire not detected all sensors are zero
    {
    //Do not move the robot
    lcd.setCursor(0, 1);
      lcd.print("No flame");
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, HIGH);
    digitalWrite(LEDR,LOW);
    digitalWrite(LEDB,HIGH);
    digitalWrite(buzz,LOW);
    }
    
    else if (digitalRead(Left_S) ==0) //If Fire is straight ahead
    {
    //Move the robot forward
    lcd.setCursor(0, 1);
      lcd.print("Flame on Left");
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(LEDR,HIGH);
    digitalWrite(LEDB,LOW);
    digitalWrite(buzz,HIGH);
    fire = true;
    
    }
    else if (digitalRead(Forward_S) ==0) //If Fire is straight ahead
    {
    //Move the robot forward
    lcd.setCursor(0, 1);
      lcd.print("Flame on front");
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(LEDR,HIGH);
    digitalWrite(LEDB,LOW);
    digitalWrite(buzz,HIGH);
    fire = true;
    
    }
    
    
    
    else if (digitalRead(Right_S) ==0) //If Fire is to the right
    {
    //Move the robot right
    lcd.setCursor(0, 1);
      lcd.print("Flame on Right");
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    digitalWrite(LEDR,HIGH);
    digitalWrite(LEDB,LOW);
    digitalWrite(buzz,HIGH);
    fire= true;
    }
    
     delay(300); //Slow down the speed of robot
 
     while (fire == true)
     {
      put_off_fire();
     }
}

, 👍1

Обсуждение

ваш код имеет плохой отступ, поэтому трудно следить за потоком программы без переформатирования, @jsotola


1 ответ


1

Если вы правильно отформатируете свой код, он станет менее загроможденным, а проблема станет более заметной.

Кроме того, если вы подумаете об операторах if, нет необходимости проверять отсутствие пожара для всех трех датчиков одновременно. Если ни один из трех датчиков не видит огня, то единственная оставшаяся возможность-это отсутствие огня.

Другое дело, что в вашем коде нет цифровой записи(IN1, НИЗКИЙ); и нет цифровой записи(IN3, НИЗКИЙ); в вашем коде. Вы можете поместить digitalWrite(IN1, ВЫСОКИЙ); и digitalWrite(IN3, ВЫСОКИЙ); в setup()

Вот ваш код, переписанный и отформатированный.

Помечена пара ненужных дубликатов.

Нет причин использовать while (fire == true) , потому что функция put_off_fire() удаляет флаг огня

Кроме того, для будущих программ while (fire == true) является избыточной формой, потому что она такая же, как while (fire)

Внимательно посмотрите на блоки операторов if.

Вы использовали функцию копирования и вставки при написании кода, но забыли внести изменения.

#include <LiquidCrystal.h>  

LiquidCrystal lcd(30, 31, 32, 33, 34, 35);   

#define Left_S       9                       // left    sensor
#define Right_S      8                       // right   sensor
#define Forward_S   23                       // forward sensor

#define LM1         52                       // for pump motor     
#define LM2         53                       // for pump motor

#define IN1          5                       // for motor  
#define IN2          4                       // for motor    
#define IN3          3                       // for motor
#define IN4         22                       // for motor

//int flame_pin1 = HIGH ;

int LEDR     = 36;                           // for danger signal
int LEDB     = 37;                           // for safe signal
int buzz     = 38;                           // for led or buzzer
int pos      =  0;    
int Contrast = 20;                           // for adjusting the brightness of the LCD , 20 is selected for the contrast of LCD

boolean fire = false;

void setup() {

    analogWrite(6, Contrast);

    lcd.begin(16, 2);

    pinMode( Left_S            , INPUT  );
    pinMode( Left_S            , INPUT  );
    pinMode( Right_S           , INPUT  );
    
    pinMode( Forward_S         , OUTPUT );
    pinMode( LEDB              , OUTPUT );   // xxxxxxxxxxxxx        duplicate

    pinMode( LM1               , OUTPUT );
    pinMode( LM2               , OUTPUT );

    pinMode( IN1               , OUTPUT );
    pinMode( IN2               , OUTPUT );
    pinMode( IN3               , OUTPUT );
    pinMode( IN4               , OUTPUT );

    pinMode( buzz              , OUTPUT );

    pinMode( LEDR              , OUTPUT );
    pinMode( LEDB              , OUTPUT );   // xxxxxxxxxxxxx        duplicate
    
//  pinMode( flame_sensor_pinM , INPUT  );
 
//  Serial.begin ( 9600 );

    myservo.attach(25);
    myservo.write(90);
}

void put_off_fire() {

    delay (500);

    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, HIGH);

    digitalWrite(LM1, HIGH); 
    digitalWrite(LM2, LOW );
    delay(500);

    for (pos = 50; pos <= 130; pos += 1) { 
        myservo.write(pos); 
        delay(10);  
    }

    for (pos = 130; pos >= 50; pos -= 1) { 
        myservo.write(pos); 
        delay(10);
    }

    digitalWrite(LM1, LOW);
    digitalWrite(LM2, LOW);

    myservo.write(90);                       // xxxxxxxxxxxxx        duplicate

    fire = false;                            // xxxxxxxxxxxxx        not needed
}


void loop() {

    myservo.write(90);                       // xxxxxxxxxxxxx        duplicate
//  Sweep_Servo();    

    lcd.setCursor(0, 1);

    fire = true;                             // preset the state (gets cleared when no fire is detected

    if (digitalRead(Left_S) == 0) {          // If Fire is straight ahead

        lcd.print("Flame on Left");

        digitalWrite(IN1 , HIGH);            // Move the robot forward
        digitalWrite(IN2 , LOW );
        digitalWrite(IN3 , HIGH);
        digitalWrite(IN2 , LOW );
    }

    else if (digitalRead(Forward_S) == 0) {  // If Fire is straight ahead

        lcd.print("Flame on front");

        digitalWrite(IN1 , HIGH);            // Move the robot forward
        digitalWrite(IN2 , LOW );
        digitalWrite(IN3 , HIGH);
        digitalWrite(IN2 , LOW );
    }

    else if (digitalRead(Right_S) == 0) {    // If Fire is to the right

        lcd.print("Flame on Right");

        digitalWrite(IN1 , HIGH);            // Move the robot right
        digitalWrite(IN2 , HIGH);
        digitalWrite(IN3 , HIGH);
        digitalWrite(IN4 , LOW );
    }

    else {                                   // fire was not detected by any of the sensors

        fire = false;

        lcd.print("No flame");

        digitalWrite(IN1 , HIGH);            // Do not move the robot
        digitalWrite(IN2 , HIGH);
        digitalWrite(IN3 , HIGH);
        digitalWrite(IN4 , HIGH);
    }

    delay(300);                              // Slow down the speed of robot

    if (fire) {
        
        digitalWrite(LEDR, HIGH);            // do fire lights
        digitalWrite(LEDB, LOW);
        digitalWrite(buzz, HIGH);

        put_off_fire();
    }

    else {
        
        digitalWrite(LEDR, LOW );            // do nofire lights
        digitalWrite(LEDB, HIGH);
        digitalWrite(buzz, LOW );

    }
}
,

Спасибо за ваше предложение. Но правый мотор начинает двигаться, когда я загружаю код на Arduino. И сервопривод тоже не вращается. Предположим, сервопривод находится под углом 90 градусов. Когда левый датчик обнаружит пожар, сервопривод должен вращаться с левой стороны. Положение сервопривода остается в положении 90 градусов. Почему?, @NUSRATRAHMAN

Придется ли мне стереть myservo.write(90) и fire= false; from Void put off fire()? Рядом с этими двумя строчками вы написали дубликат и не нужно, @NUSRATRAHMAN

нет, вам не нужно удалять повторяющиеся строки ... я просто указал, что у вас есть дубликат кода, который указывает на то, что вы хотите просмотреть свой код, чтобы убедиться, что вы не упустили что-то еще, @jsotola

Большое тебе спасибо. Но правый мотор начинает вращаться автоматически, когда я загружаю код почему? Ваше предложение будет высоко оценено., @NUSRATRAHMAN

проверьте свои моторы ... напишите скетч, который запускает один двигатель в течение одной секунды, затем переворачивает его, затем другой двигатель, @jsotola

ОК. Я проверю свои моторы., @NUSRATRAHMAN

Если я хочу добавить датчик MQ-5 ( для обнаружения утечки газа) в свой робот, то как его добавить?, @NUSRATRAHMAN