Проблема при подключении 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();
}
}
@NUSRATRAHMAN, 👍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
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Какой тип разъема использует система GROVE?
- Улавливают ли ультразвуковые датчики прозрачные материалы?
- Как подключить более 10 датчиков к Arduino uno r3
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?
ваш код имеет плохой отступ, поэтому трудно следить за потоком программы без переформатирования, @jsotola