Операторы If/Else на Arduino не выполняются
У меня есть небольшой код ниже, проблема в том, что при вызове будет выполняться только первый оператор if. Когда я вызываю u, q или любой другой оператор if, он сразу переходит к else и не выполняется. Попробовал переключить следующие if на else if, но получил тот же результат.
#include "Arduino.h"
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include "DHT.h"
DHT dht1(3, DHT11);
DHT dht2(2, DHT11);
void setup()
{
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(7,OUTPUT);
pinMode(6,OUTPUT);
pinMode(5,OUTPUT);
pinMode(4,OUTPUT);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
Serial.begin(9600);
dht1.begin();
dht2.begin();
}
void loop()
{
float DHT11_t = dht1.readTemperature(true);
float DHT21_t = dht2.readTemperature(true);
if(Serial.read() == 'u')
{
Serial.println();
Serial.print(DHT11_t,1);
Serial.println();
Serial.print(DHT21_t,1);
Serial.println();
}
if(Serial.read() == 'c')
{
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
Serial.print("NDX");
Serial.println();
Serial.print("u");
Serial.println();
}
if(Serial.read() == 'q')
{
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
Serial.print("STX");
Serial.println();
Serial.print("u");
delay(2000);
Serial.print("u");
delay(2000);
Serial.print("u");
delay(2000);
Serial.print("u");
delay(2000);
Serial.print("u");
delay(2000);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
Serial.print("NDX");
Serial.println();
Serial.print("u");
Serial.println();
}
if(Serial.read() == 'w')
{
digitalWrite(8,HIGH);
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
}
else if(Serial.read() == 'e')
{
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
}
if(Serial.read() == 'r')
{
digitalWrite(8,HIGH);
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
}
if(Serial.read() == 't')
{
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
delay(30000);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
delay(750);
digitalWrite(8,HIGH);
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
delay(30000);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
}
if(Serial.read() == 'y')
{
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
delay(30000);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
delay(750);
digitalWrite(8,HIGH);
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
delay(30000);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
}
else
{
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
}
}
@nuggetchris, 👍0
Обсуждение1 ответ
Лучший ответ:
Serial.read()
извлекает первый байт из последовательного буфера. После выполнения этот байт исчезает, поэтому Serial.read()
в следующем операторе if будет извлекать следующий байт (если он доступен). Что вы можете сделать, так это присвоить результат Serial.read()
некоторой переменной перед первым оператором if, а затем использовать эту переменную вместо Serial.read()
в операторы if.
Можете ли вы опубликовать исправление? Я попытался определить переменную, но получил «не объявлен в этой области», @nuggetchris
@nuggetchris Пожалуйста, взгляните на пример https://www.arduino.cc/en/Serial/Read. Это должно сработать, если вы поместите операторы if после incomingByte = Serial.read();
(внутри if (Serial.available() > 0) { }
)., @ex-punctis
И это также переключение Serial.read() == x внутри оператора if с incomingByte == x?, @nuggetchris
@nuggetchris: Да. Извините, я забыл упомянуть об этом., @ex-punctis
Хорошо, кажется, это работает, пока я определяю тип данных перед входным байтом. Поскольку это только буквы, я выбрал char. Единственная проблема теперь заключается в том, что буквы, напечатанные в сериальном формате, которые *программа* производит, например, в букве «u» в операторах if, она, похоже, не распознает. Он печатает только «u», но не выполняет то, что «u» указано в первом операторе if., @nuggetchris
Технически можно было бы вставить логику непосредственно вместо вызова, но если бы я мог упростить ее, как планировалось, было бы намного лучше., @nuggetchris
@nuggetchris: Я не понимаю, почему он не распознает символы в операторах if. Вы используете ==
внутри if()
, верно? Попробуйте следующий минимальный пример: https://pastebin.com/raw/tFrRYceK. Я протестировал его, и он работает нормально., @ex-punctis
- Servo_Pointer' was not declared in this scope
- Использование контакта RX TX
- Float печатается только 2 десятичных знака после запятой
- Команда strtok() с Serial связью
- Как получить правильный последовательный порт?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Как остановить цикл в последовательном мониторе?
- Как я могу прервать задержку() при нажатии кнопки?
Мы уже говорили вам, что это не работает: https://arduinoprosto.ru/q/56646/simple-timings-in-arduino-code, @Jot