Пераўтварэнне майго, калі код цыклу ў САЗ камутатара /

Я зрабіў праект, дзе ў фотодатчики пастаянна лічаныя значэнне, і калі лазер разразаюць знешніх аб'ектам, то ён падае гукавы сігнал зумера.

Справа выключальніка будзе зрабіць гэта лёгка, як гэта было прапанавана некаторымі людзьмі. Я напісаў свой кароткі код ніжэй, вы можаце ласкава дапамагчы мне змяніць яго?

Пераўтварэнне ўсе , калі завесы ў размеркавальным/ выпадку інструкцыі.

 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, The Даведачны цэнтр кажа, што агляды кода знаходзяцца на тэме. Адзінае, гэта OP зрабіў няправільна было не ўключаць праект-крытычны аналіз тэг.
дададзена аўтар Yoni Baciu, крыніца
Вы не можаце выкарыстоўваць перамыкач у гэтым выпадку, з-за> аператара ў выпадку зацвярджэння і differentn зменных (sensorValue0, 1 і 2). Акрамя таго, вам не хапае зумер для sensorValue3?
дададзена аўтар Pat, крыніца

6 адказы

Камутатар можа толькі выбіраць розныя дыскрэтныя значэння з адной зменнай. Паколькі ў вас ёсць некалькі зменных і ня шукаеце дыскрэтныя значэння, якія вы павінны выкарыстоўваць, калі не перамыкацца.

3
дададзена

Заява перамыкача не будзе дарэчы ў дадзеным выпадку.

Вы маглі б аптымізаваць код, дадаўшы функцыю, якая зрабіла працу за вас і зрабіў асноўны цыкл выглядаць лепш.

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, крыніца

«Switch выпадак будзе зрабіць лёгка, як гэта было прапанавана некаторымі людзьмі.»

Гэта выдатны прыклад таго, чаму бясплатны савет можа быць даволі дарагім, :)

Калі вы робіце нешта ўнікальнае, вы лепш з бягучым падыходам.

рэдагаваць: з тым, што я магу бачыць выпадкі, калі перамыкач/выпадак структура можа быць карыснай. Напрыклад, калі вам трэба параўнаць некалькі зменных праз паслядоўны набор парогаў, адзін са спосабаў зрабіць гэта без кода занадта цяжка чытаць будзе нешта накшталт гэтага:

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 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.

Таксама вы правяраеце тры розныя зменныя, і толькі адна зменная можа быць выкарыстана для праверкі ў размеркавальным заяве.

Тым не менш, тое, што вы можаце зрабіць, гэта стварыць функцыю з параметрамі, такімі як:

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 ) павінен таму быць бесперапынным.

Тым не менш, перамыкач выкарыстоўваецца аператар, калі значэнне нашай зменнай дыскрэтна.

Вы не можаце выкарыстоўваць, такім чынам, перамыкач заявы ў сваім кодзе.

1
дададзена