Господа, нужен совет по оптимизации скетча

Тема в разделе "Глядите, что я сделал", создана пользователем atompost, 10 май 2018.

  1. atompost

    atompost Гик

    В общем суть такова:

    Делали с дочерью проект, все получилось все работает, но мне самому интересно, как более рационально оптимизировать код который мы написали.

    Немного о проекте:

    Проект создан на базе Arduino UNO. Имеется 4 кнопки, "Влево", "Вверх", "Вниз", "Вправо", и 6 светодиодов 3 из них bigLed, и 3 smallLed, smallLed светодиоды указывают какой из bigLed светодиодов сейчас выбран. Выбор осуществляется кнопками "Влево", "Вправо", а кнопками "Вверх", "Вниз" осуществляется регулировка яркости светодиодов bigLed. Вот собственно такой не замысловатый проект.

    вот код проекта:
    Код (C++):
    int bigLed[] = {3, 5, 6};                            //создаем массив пинов для больших светодиодов
    int smallLed[] = {7, 8, 9};                            //создаем массив пинов для маленьких светодиодов
    int knopka[] = {10,11,12,13};                        //создаем массив пинов для кнопок
    int count = -1;                                        //создаем счетчик
    int brightnes[] = {0, 0, 0};                        //создаем массив из трех элементов для указания яркости каждого (большого) светодиода
    int del=300;                                        //задержка

    void setup() {
      for (int i = 0; i <= 3; i++) {
      pinMode(knopka[i], INPUT);                        //обозначаем, что пины кнопок работают как INPUT
      }
      for (int i = 0; i <= 2; i++) {
        pinMode(bigLed[i], OUTPUT);                        //обозначаем, что пины больших светодиодов работаю как OUTPUT
        pinMode(smallLed[i], OUTPUT);                    //обозначаем, что пины маленьких светодиодов работаю как OUTPUT
      }
    }
    void loop() {
    //----кнопка влево-----
    int value2 = digitalRead(knopka[1]);                //читаем данные пина
      if ( value2 == HIGH ) {                            //если кнопка нажата тогда
        count = count + 1;                                //увеличиваем счетчик на единицу
        if (count > 2) {                                //проверяем значение счетчика если он больше 2 тогда
          count = 2;                                    //счетчик равен 2, что бы значение счетчика не переполнялось
        }
        for (int i = 0; i <= 2; i++) {
          digitalWrite(smallLed[i], LOW);                //тушим все маленькие светодиоды
        }
        digitalWrite(smallLed[count], HIGH);            //зажигаем светодиод с номером хранящемся в count
        delay(del);                                        //задержка
      }
      //----кнопка вправо-----
      int value3 = digitalRead(knopka[2]);                //читаем данные пина
      if ( value3 == HIGH ) {                            //если кнопка нажата тогда
        count = count - 1;                                //уменьшаем счетчик на единицу
        if (count < 0) {                                //проверяем значение счетчика, если он меньше 0 тогда
          count = 0;                                    //счетчик равен 0, что бы значение счетчика не переполнялось
        }
        for (int i = 0; i <= 2; i++) {
          digitalWrite(smallLed[i], LOW);                //тушим все маленькие светодиоды
        }
        digitalWrite(smallLed[count], HIGH);            //зажигаем светодиод с номером хранящемся в count
        delay(del);                                        //задержка
      }
      //----кнопка вверх-----
      int value1 = digitalRead(knopka[0]);                //читаем данные пина
      if ( value1 == HIGH ) {                            //если кнопка нажата тогда
        brightnes[count] = brightnes[count] + 1;        //увеличиваем счетчик яркости для больших светодиодов на единицу
        if (brightnes[count] > 254) {                    //проверяем значение счетчика, если он больше 254, тогда
          brightnes[count] = 254;                        //счетчик равен 254, что бы значение счетчика не переполнялось
        }
        analogWrite(bigLed[count], brightnes[count]);    //зажигаем большой светодиод с номером count, яркостью brightnes
        delay(del);                                        //задержка
      }
      //----кнопка вниз-----
      int value4 = digitalRead(knopka[3]);                //читаем данные пина
      if ( value4 == HIGH ) {                            //если кнопка нажата тогда
        brightnes[count] = brightnes[count] - 1;        //уменьшаем счетчик яркости для больших светодиодов на единицу
        if (brightnes[count] < 0) {                        //проверяем значение счетчика, если он меньше 0, тогда
          brightnes[count] = 0;                            //счетчик равен 0, что бы значение счетчика не переполнялось
        }
        analogWrite(bigLed[count], brightnes[count]);    //зажигаем большой светодиод с номером count, яркостью brightnes
        delay(del);                                        //задержка
      }
      //-----the end :^)-----
    }
     
  2. Daniil

    Daniil Гуру

    Хорошо написано!
    Странно только, что у вас массив knopок, а не button-ов.
    А что вы хотите оптимизировать? Скорость, память, потребление или вам кажется, что код громоздкий? Можно процедуры сгруппировать по типу кнопки (лево-право и верх-низ), просто от выбранной кнопки будет зависеть "+" или "-" у переменной count.
    псевдо код мог бы быть таким:
    Код (C++):
    если нажата кнопка3 или кнопка0 то{//верх или низ
        слагаемое=1//считаю, что обычно нажимат кнопку0
        если нажата кнопка3 то слагаемое=-1//но если уж нажали на кнопку3, то надо исправить знак
        яркость кнопки[count]=яркость кнопки[count] + слагаемое
        далее идёт ограничение сверху и снизу для яркости как у вас
        подать яркость на большой светодиод[count]
    }
    аналогично можно сделать и для кнопок1 и 2
     
  3. ostrov

    ostrov Гуру

    Антидребезга не заметно. Не проскакивают лампочки при влево-вправо?
     
  4. atompost

    atompost Гик

    Есть немного, игрались с delay...
     
  5. atompost

    atompost Гик

    Это доча так решила ))))