Цикл кодын коммутаторға/жағдайға арналған нұсқада түрлендіру

Мен фотоэссорларда үнемі құндылықты оқып шығып, лазердің сыртқы нысанмен кесілгенін білдіретін жобаны жасадым, сонда ол дыбыстық сигнал береді.

Ауыстырғыш корпус кейбір адамдар ұсынғандай жеңілдетеді. Төмендегі қысқа кодын жаздым, оны өзгертуге маған көмектесе аласыз ба?

егер барлық кодын ауыстырып/ 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, көзі
Бұл жағдайда коммутаторды пайдалана алмайсыз, егер оператордың операторында және басқа айнымалы мәндерде (sensorValue0, 1 және 2). Сондай-ақ, сіз сенсорлық Vale3 үшін қоңырау үнін жоғалтасыз ба?
қосылды автор 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, көзі

«Ауыспалы жағдай кейбір адамдар ұсынғандай оңай болады».

Бұл тегін кеңестің неге қымбат болуы мүмкін екенінің керемет мысалы.

Егер бірегей нәрсе жасамасаңыз, сіз өзіңіздің ағымдағы тәсілмен жақсы жұмыс істей аласыз.

редакциялау: айтылғандармен, коммутатор/корпус құрылымы пайдалы болуы мүмкін жағдайларды көре аламын. Мысалы, бірнеше айнымалы мәндерді табалдырықтардың жиынтығы арқылы салыстыру қажет болса, кодты оқуды тым қиын етпестен орындаудың бір жолы мынаған ұқсас болар еді:

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 ) үздіксіз болуы керек.

Дегенмен, қосқышы - біздің айнымалы мән дискретті болғанда қолданылады.

Демек, кодтағы switch операторларын қолдануға болмайды.

1
қосылды