Как преобразовать этот эскиз, чтобы сохранить только один оператор 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);



}

, 👍1


2 ответа


Лучший ответ:

-1

Конечно:

Измените эти целые числа на байтовые, ни одно из них не имеет значений больше 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.

,

как редактировать эти операторы if else как один., @R E


2

Сначала найдите дублированный код.

Например, фрагмент

  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