Как преобразовать этот эскиз, чтобы сохранить только один оператор if-else?
int ldrPin = A0;
int rainPin = A1;
int smokePin = A2;
int greenLED = 6;
int redLED = 7;
// вы можете настроить пороговое значение
int thresholdValue = 500;
int LightSensorThreshold = 500;
int RainSensorThreshold = 500;
void setup() {
pinMode(ldrPin, INPUT);
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
Serial.begin(9600);
pinMode(rainPin, INPUT);
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
Serial.begin(9600);
pinMode(smokePin, INPUT);
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
Serial.begin(9600);
}
void loop() {
int lightSensorValue = analogRead(ldrPin);
Serial.print(lightSensorValue);
if(lightSensorValue < LightSensorThreshold){
Serial.println(" - light");
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
}
else {
Serial.println(" - dark");
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
}
delay(500);
int rainSensorValue = analogRead(rainPin);
Serial.print(rainSensorValue);
if(rainSensorValue < RainSensorThreshold){
Serial.println(" - It's wet");
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
}
else {
Serial.println(" - It's dry");
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
}
delay(500);
int smokeSensorValue = analogRead(smokePin);
Serial.print(smokeSensorValue);
if (smokeSensorValue < thresholdValue) {
Serial.println(" - Smoke");
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
}
else
{
Serial.println(" - No Smoke");
digitalWrite(redLED, HIGH);
digitalWrite(greenLED, LOW);
}
delay(100);
}
@R E, 👍1
2 ответа
Лучший ответ:
Конечно:
Измените эти целые числа на байтовые, ни одно из них не имеет значений больше 255:
int ldrPin = A0;
int rainPin = A1;
int smokePin = A2;
int greenLED = 6;
int redLED = 7;
Уберите их из setup(), аналоговым входам это не нужно:
pinMode(ldrPin, INPUT);
pinMode(rainPin, INPUT);
pinMode(smokePin, INPUT);
Удалить дубликаты этих строк, pinMode() и отключить их (если LOW выключен) нужно вызывать только один раз для каждой
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
Избавьтесь от двух строк Serial.begin(9600), достаточно вызвать его один раз.
В цикле() избавьтесь от целых чисел. Эти переменные уже были объявлены глобально, вам не нужно повторно объявлять их как тип int.
Сначала найдите дублированный код.
Например, фрагмент
int lightSensorValue = analogRead(ldrPin);
Serial.print(lightSensorValue);
if(lightSensorValue < LightSensorThreshold){
Serial.println(" - light");
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
}
else {
Serial.println(" - dark");
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
}
delay(500);
повторяется три раза.
Затем найдите внутри повторяющиеся фрагменты кода, а именно:
- номер PIN-кода
- значение для проверки.
- два текста
Затем создайте новую функцию, содержащую один дублированный фрагмент кода, и замените различия переменными, которые вы передаете в функцию в качестве аргументов:
void checkSensor(int pin, int sensorLimitValue, char* okText, char* warningText)
{
int sensorValue = analogRead(pin);
Serial.print(sensorValue);
if(sensorValue < sensorLimitValue) {
Serial.println(okText);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
}
else {
Serial.println(warningText);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
}
delay(500);
}
И вызовем соответственно:
checkSensor(ldrPin , LightSensorThreshold, " - light" , " - dark");
checkSensor(rainSensorPin, RainSensorThreshold , " - it's wet", " - it's dry");
checkSensor(smokePin , thresholdValue , " - Smoke" , " - No Smoke");
Я поменял значения зеленого и красного цвета, поскольку предполагаю, что когда значение ниже предельного, должен гореть зеленый светодиод, а в противном случае — красный светодиод.
Кстати, почему бы не использовать smokeSensorThreshold
вместо thresholdValue
, чтобы обеспечить согласованность с другими дублированными фрагментами кода?
У меня проблема с этими эскизами. Зеленый светодиод включен, и когда датчик что-то почувствует, он просто загорится красным. На выходе эскиза светодиод горит поочередно. Можете ли вы помочь мне отредактировать мой эскиз?, @R E
Я не понимаю, что именно вы имеете в виду, но теперь я вижу, что красный свет горит, когда значение датчика слишком велико, может быть, вы хотите переключить зеленый и красный, я сделаю это в своем ответе, @Michel Keijzers
Пожалуйста!, @Michel Keijzers
Я предложил smokeSensorThreshold
[вчера](https://arduinoprosto.ru/q/57137/can-you-help-me-combining-these-sensor-sketches-as-one-in-arduino/ 57138#57138), не знаю, почему ОП его не использовал..., @Greenonline
- Использование YS-IRTM с Arduino Uno
- Онлайн-проблема подключения Arduino к базе данных MySQL
- Как устранить сообщение об ошибке "assignment of function 'void digitalWrite (uint8_t, uint_8)"?
- Как преобразовать значения RGB в интенсивность
- Как считать показания датчика звука и включить датчик с датчиком воды, если показания выше порогового значения и при обнаружении воды в течение 2 минут?
- Как запрограммировать 2 ультразвуковых датчика, один на серводвигателе и один прикрепленный на передней стороне автомобиля?
- Датчики TFmini с Arduino
- Как отправить сообщение на мой телефон, что моя система Arduino включена при включении моего Arduino
как редактировать эти операторы if else как один., @R E