Перетворити мій if код у вираз switch

Я зробив проект, де в фотосенсорах постійно читаються значення, і якщо лазер розрізається зовнішнім об'єктом, то він подає звуковий сигнал.

Випадок перемикання спростив би, як припускають деякі люди. Я написав свій короткий код нижче, ви можете допомогти мені змінити його?

Перетворення всіх циклів if в оператор switch/ case .

 int sensorPin = A0;
 int sensorPin1 = A1;
 int sensorPin2 = A2;
 int sensorPin3 =  A3;
 int sensorValue0 = 0;
 int sensorValue1 = 0;
 int sensorValue2 = 0;
 int sensorValue3 = 0;
 const int BUZZER = 9;
 const int BUZZER1 = 7;
 const int BUZZER2 = 8;
 const int BUZZER3 = 5;

void setup() {
 Serial.begin(9600);
 pinMode(BUZZER, OUTPUT);
 pinMode(BUZZER1, OUTPUT);
 pinMode(BUZZER2, OUTPUT);
 pinMode(BUZZER3, OUTPUT);
//put your setup code here, to run once:
}

void loop() {
  sensorValue0 = analogRead(sensorPin);
  sensorValue1 = analogRead(sensorPin1);
  sensorValue2 = analogRead(sensorPin2);
  sensorValue3 = analogRead(sensorPin3);
  Serial.println(sensorValue0);
  delay(100);

  if (sensorValue0>920)
   noTone(BUZZER);
  else 
   tone(BUZZER, 500);

  if (sensorValue1>850)
   noTone(BUZZER1);
  else 
   tone(BUZZER1, 300);

  if (sensorValue2>850)
   noTone(BUZZER2);
  else 
   tone(BUZZER2, 700);
}
1
@SDsolar. У довідковому центрі говориться, що огляди коду є темою. Єдине, що було зроблено не так, полягало в тому, щоб не включати теги проекту критика.
додано Автор Yoni Baciu, джерело
У цьому випадку не можна використовувати перемикач, оскільки оператор> в операторах if і differentn змінних (sensorValue0, 1 і 2). Крім того, ви не вистачає зумер для sensorValue3?
додано Автор Pat, джерело

6 Відповіді

Перемикач може вибирати тільки різні дискретні значення з однієї змінної. Оскільки у вас є кілька змінних і не шукаєте дискретних значень, ви повинні використовувати, якщо не перемикатися.

3
додано

У даному випадку оператор switch не підходить.

Ви могли б оптимізувати код, додавши функцію, яка зробила роботу для вас, і зробили основний цикл кращим.

void readValue (const int& sensorPin, const int& limit, const int& buzzerPin, const int& frequency)
{
  const int value = sensorValue0 = analogRead(sensorPin);
  if (value > limit)
  {
    noTone(buzzerPin);
  }
  else
  {
    tone(buzzerPin, frequency);
  }
}

Таким чином ви могли б додати стільки зумер і датчиків, як шпильки дозволено.

2
додано
До речі, вище загальне переповнення я просто намагаюся запропонувати вам інший спосіб мислення про вашу проблему. Ви також можете відірвати сенсор і зуммер і сховати їх у цьому класі, просто пропустивши перерахування і переглянувши їх у 2 масивах. Знову його переповнення, але весело, якщо ви крутили :)
додано Автор Thomas Myron, джерело

"Випадок перемикання спростив би, як припускають деякі люди".

Це прекрасний приклад того, чому безкоштовна консультація може бути досить дорогою, :)

Якщо ви робите щось унікальне, вам краще підходити до поточного підходу.

edit: з цим сказано, я бачу випадки, коли структура комутатора/справи може бути корисною. Наприклад, якщо потрібно порівняти кілька змінних за допомогою узгодженого набору порогових значень, один із способів зробити це, не створюючи занадто складного коду для читання, буде таким:

THRESHOLD_TypeDef threshold(uint16_t val) {
  if (val < VAL1) return THRESHOLD1;
  if (val < VAL2) return THRESHOLD2;
  ...
  if (val < VALn) return THRESHOLDn;
}

де THRESHOLD_TypeDef - перерахований тип.

і в коді ви можете написати щось на зразок цього:

   switch (threshold(myval)) {
   case THRESHOLD1: do_something1(); break;
   case THRESHOLD2: do_something2(); break;    
   ...

Його перевагою є, очевидно, краща читабельність і послідовність: ви можете застосувати ту ж функцію на різних змінних для створення узгодженого набору "класифікації".

Його недолік також очевидний: для кожного порогу() можна протестувати тільки один набір класифікації. Але ви завжди можете створити кілька функцій, які будуть застосовані до різних змінних.

1
додано

Просто для задоволення, тут ще один спосіб вирішити проблему: Створити клас C ++. Цей код може здатися трохи довшим, ніж ваш оригінальний код, але перевага полягає в тому, що ви хочете додати більше функціональних можливостей, вам потрібно лише змінити клас.

class Sensor {
public:
    Sensor(uint8_t analog_pin, uint8_t buzzer_pin, uint16_t threshold, uint16_t tone_duration)
        : analog_pin(analog_pin), buzzer_pin(buzzer_pin), threshold(threshold), tone_duration(tone_duration)
    {
    }
    void setup() {
        pinMode(buzzer_pin, OUTPUT);
    }
    void loop() {
        sensor_value= analogRead(analog_pin);
        delay(100);
        if (sensor_value> threshold)
            noTone(buzzer_pin);
       else 
           tone(buzzer_pin, tone_duration);
    }
protected:
    uint8_t analog_pin, buzzer_pin;
    uint16_t threshold, sensor_value, tone_duration;
};

Потім просто створіть масив об'єктів Sensor :

Sensor sensors[] = {
    Sensor(A0, BUZZER1, 920, 500),
    Sensor(A1, BUZZER2, 850, 300),
    Sensor(A2, BUZZER3, 850, 700)
};
const uint8_t num_sensors = sizeof(sensors)/sizeof(sensors[0]);

void setup() {
    for (int i = 0; i < num_sensors; i++) {
        sensors[i].setup();
    }
}
void loop() {
    for (int i = 0; i < num_sensors; i++) {
        sensors[i].loop();
    }
}
1
додано

Actually, you cannot really rewrite this, due to the > operator instead of the == operator.

Також ви перевіряєте три різні змінні, і тільки одна змінна може використовуватися для перевірки в операторі switch.

Однак, ви можете створити функцію з параметрами, такими як:

void set(int sensorValue, int value, int buzzer, int frequency)
{
  if (sensorValue > value)
  {
       noTone(buzzer);
  }
  else
  {
       tone(buzzer, frequency);
  }
}

і зателефонуйте:

 set(sensorValue0, 920, BUZZER, 500);
 set(sensorValue1, 850, BUZZER1, 300);
 set(sensorValue2, 850, BUZZER2, 700);
 set(sensorValue3, ...);//I think you miss this one
1
додано

Оскільки ваші умови виглядають так:

bool condition = variable > someValue;

Значення вашої змінної (тобто sensorValue ) має бути безперервним.

Однак, оператор switch використовується, коли значення нашої змінної є дискретним.

Отже, ви не можете використовувати перемикач операторів у вашому коді.

1
додано