Как упростить код

ChekMaster
Offline
Зарегистрирован: 17.03.2018

Доброго времени суток.

Я совсем новичок в этом деле (программирование), но и все же, смог переписать готовый код под свои колличества и свои нужды. Теперь у меня вопрос, наверно можно "упростить" столь громоздкий код? какими командами мне необходимо это осуществить? Что надо дописать (какие команды), чтобы после перезагрузки, сбой в питании, сервомотры запоминали свою текущую позицию? Спасибо

#include <Servo.h>

// constant variables used to set servo angles, in degrees
const int straight = 20;
const int divergent = 150;
const int straight1 = 20;
const int divergent1 = 150;
const int straight2 = 20;
const int divergent2 = 150;
const int straight3 = 20;
const int divergent3 = 150;
const int straight4 = 20;
const int divergent4 = 150;

// constant variables holding the ids of the pins we are using
const int buttonpin = 53;
const int servopin = 2;
const int buttonpin1 = 52;
const int servopin1 = 3;
const int buttonpin2 = 51;
const int servopin2 = 4;
const int buttonpin3 = 50;
const int servopin3 = 5;
const int buttonpin4 = 48;
const int servopin4 = 6;

const int divergent_led = 22;
const int straight_led = 23;
const int divergent_led1 = 24;
const int straight_led1 = 25;
const int divergent_led2 = 26;
const int straight_led2 = 27;
const int divergent_led3 = 28;
const int straight_led3 = 29;
const int divergent_led4 = 30;
const int straight_led4 = 31;


// servo movement step delay, in milliseconds
const int step_delay = 10;

// create a servo object
Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;

// global variables to store servo position
int pos = straight; // current
int old_pos = pos; // previous
int pos1 = straight1; // current
int old_pos1 = pos1; // previous
int pos2 = straight2; // current
int old_pos2 = pos2; // previous
int pos3 = straight3; // current
int old_pos3 = pos3; // previous
int pos4 = straight4; // current
int old_pos4 = pos4; // previous

void setup()
{
  // set the mode for the digital pins in use
  pinMode(buttonpin, INPUT);
  pinMode(straight_led, OUTPUT);
  pinMode(divergent_led, OUTPUT);
  pinMode(buttonpin1, INPUT);
  pinMode(straight_led1, OUTPUT);
  pinMode(divergent_led1, OUTPUT);
  pinMode(buttonpin2, INPUT);
  pinMode(straight_led2, OUTPUT);
  pinMode(divergent_led2, OUTPUT);
  pinMode(buttonpin3, INPUT);
  pinMode(straight_led3, OUTPUT);
  pinMode(divergent_led3, OUTPUT);
  pinMode(buttonpin4, INPUT);
  pinMode(straight_led4, OUTPUT);
  pinMode(divergent_led4, OUTPUT);

  // setup the servo
  myservo.attach(servopin);  // attach to the servo on pin 2
  myservo.write(pos); // set the initial servo position
  myservo1.attach(servopin1);  // attach to the servo on pin 3
  myservo1.write(pos1); // set the initial servo position
  myservo2.attach(servopin2);  // attach to the servo on pin 4
  myservo2.write(pos2); // set the initial servo position
  myservo3.attach(servopin3);  // attach to the servo on pin 5
  myservo3.write(pos3); // set the initial servo position
  myservo4.attach(servopin4);  // attach to the servo on pin 6
  myservo4.write(pos4); // set the initial servo position

  // set initial led states
   digitalWrite(straight_led, HIGH);
    digitalWrite(divergent_led, LOW);
    digitalWrite(straight_led1, HIGH);
    digitalWrite(divergent_led1, LOW);
    digitalWrite(straight_led2, HIGH);
    digitalWrite(divergent_led2, LOW);
    digitalWrite(straight_led3, HIGH);
    digitalWrite(divergent_led3, LOW);
    digitalWrite(straight_led4, HIGH);
    digitalWrite(divergent_led4, LOW);
    
}

void loop()
{
  // start each iteration of the loop by reading the button
  // if the button is pressed (reads HIGH), move the servo
  int button_state = digitalRead(buttonpin);
  if (button_state == HIGH) {
    
// turn off the lit led
    if(pos == straight){
              digitalWrite(straight_led, LOW);
          } else {
              digitalWrite(divergent_led, LOW);
          }
          
    old_pos = pos;   // save the current position

    // Toggle the position to the opposite value
    pos = pos == straight ? divergent : straight;

    // Move the servo to its new position
    if (old_pos < pos) { // if the new angle is higher
      // increment the servo position from oldpos to pos
      for (int i = old_pos + 1; i <= pos; i++) {
        myservo.write(i); // write the next position to the servo
        delay(step_delay); // wait
      }
    } else {  // otherwise the new angle is equal or lower
      // decrement the servo position from oldpos to pos
      for (int i = old_pos - 1; i >= pos; i--) {
        myservo.write(i); // write the next position to the servo
        delay(step_delay); // wait
      }
    }
    // turn on the appropriate LED.
    if(pos == straight){
            digitalWrite(straight_led, HIGH);
        } else {
            digitalWrite(divergent_led, HIGH);
  }
  }

  {

    // start each iteration of the loop by reading the button
    // if the button is pressed (reads HIGH), move the servo
    int button_state = digitalRead(buttonpin1);
    if (button_state == HIGH) {
// turn off the lit led
    if(pos1 == straight1){
              digitalWrite(straight_led1, LOW);
          } else {
              digitalWrite(divergent_led1, LOW);
          }
      old_pos1 = pos1;   // save the current position

      // Toggle the position to the opposite value
      pos1 = pos1 == straight1 ? divergent1 : straight1;

      // Move the servo to its new position
      if (old_pos1 < pos1) { // if the new angle is higher
        // increment the servo position from oldpos to pos
        for (int i = old_pos1 + 1; i <= pos1; i++) {
          myservo1.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      } else {  // otherwise the new angle is equal or lower
        // decrement the servo position from oldpos to pos
        for (int i = old_pos1 - 1; i >= pos1; i--) {
          myservo1.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      }
      // turn on the appropriate LED.
    if(pos1 == straight1){
            digitalWrite(straight_led1, HIGH);
        } else {
            digitalWrite(divergent_led1, HIGH);
    }
  }
  }
  // start each iteration of the loop by reading the button
  // if the button is pressed (reads HIGH), move the servo
  {
    int button_state = digitalRead(buttonpin2);
    if (button_state == HIGH) {
// turn off the lit led
    if(pos2 == straight2){
              digitalWrite(straight_led2, LOW);
          } else {
              digitalWrite(divergent_led2, LOW);
          }
      old_pos2 = pos2;   // save the current position

      // Toggle the position to the opposite value
      pos2 = pos2 == straight2 ? divergent2 : straight2;

      // Move the servo to its new position
      if (old_pos2 < pos2) { // if the new angle is higher
        // increment the servo position from oldpos to pos
        for (int i = old_pos2 + 1; i <= pos2; i++) {
          myservo2.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      } else {  // otherwise the new angle is equal or lower
        // decrement the servo position from oldpos to pos
        for (int i = old_pos2 - 1; i >= pos2; i--) {
          myservo2.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      }
      // turn on the appropriate LED.
    if(pos2 == straight2){
            digitalWrite(straight_led2, HIGH);
        } else {
            digitalWrite(divergent_led2, HIGH);
    }
  }
  }

  {
    // start each iteration of the loop by reading the button
    // if the button is pressed (reads HIGH), move the servo
    int button_state = digitalRead(buttonpin3);
    if (button_state == HIGH) {
// turn off the lit led
    if(pos3 == straight3){
              digitalWrite(straight_led3, LOW);
          } else {
              digitalWrite(divergent_led3, LOW);
          }
      old_pos3 = pos3;   // save the current position

      // Toggle the position to the opposite value
      pos3 = pos3 == straight3 ? divergent3 : straight3;

      // Move the servo to its new position
      if (old_pos3 < pos3) { // if the new angle is higher
        // increment the servo position from oldpos to pos
        for (int i = old_pos3 + 1; i <= pos3; i++) {
          myservo3.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      } else {  // otherwise the new angle is equal or lower
        // decrement the servo position from oldpos to pos
        for (int i = old_pos3 - 1; i >= pos3; i--) {
          myservo3.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      }
      // turn on the appropriate LED.
    if(pos3 == straight3){
            digitalWrite(straight_led3, HIGH);
        } else {
            digitalWrite(divergent_led3, HIGH);
    }
  }
  }
  {
    // start each iteration of the loop by reading the button
    // if the button is pressed (reads HIGH), move the servo
    int button_state = digitalRead(buttonpin4);
    if (button_state == HIGH) {
// turn off the lit led
    if(pos4 == straight4){
              digitalWrite(straight_led4, LOW);
          } else {
              digitalWrite(divergent_led4, LOW);
          }
      old_pos4 = pos4;   // save the current position

      // Toggle the position to the opposite value
      pos4 = pos4 == straight4 ? divergent4 : straight4 ;

      // Move the servo to its new position
      if (old_pos4 < pos4) { // if the new angle is higher
        // increment the servo position from oldpos to pos
        for (int i = old_pos4 + 1; i <= pos4; i++) {
          myservo4.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      } else {  // otherwise the new angle is equal or lower
        // decrement the servo position from oldpos to pos
        for (int i = old_pos4 - 1; i >= pos4; i--) {
          myservo4.write(i); // write the next position to the servo
          delay(step_delay); // wait
        }
      }
      // turn on the appropriate LED.
    if(pos4 == straight4){
            digitalWrite(straight_led4, HIGH);
        } else {
            digitalWrite(divergent_led4, HIGH);
    }
  }
  }
  }// end of loop

 

ven-til
Offline
Зарегистрирован: 13.02.2018

Массивы, цикл от 0 до 4, eeprom.

.

ChekMaster
Offline
Зарегистрирован: 17.03.2018

а можно поподробнее, я совсем 0 в этом. Хотя бы направить, где копать

ven-til
Offline
Зарегистрирован: 13.02.2018
BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018
Всем доброго времени суток.
Изложу упрощенно свой вопрос: применил конструкцию switch-case на несколько ветвей для организации пунктов меню, есть класс кнопка позволяющий отслеживать короткое и долгое нажатие. Как проще описать конструкцию(без if/case) чтобы обработчик допустим, если задействована ветка MAIN_MENU только делал инкремент а, если MENU_MANUAL только инкремент b,c.
////////////////
void lock_up() {  // функция обработчик короткого нажатия кнопки (создан класс кнопка)
  // необходима конструкция
}

void setup() {
  

}

void loop() {
   switch (switchPointer)
   {
     case MAIN_MENU:
     /////////
     действие по вызову lock_up() a++;
     /////////
     break;

     case MENU_MANUAL:
     /////////
     действия по вызову lock_up()  b++;  c++;
     /////////
     break;

     case ...:
     ...
     break;
   }

}

 

 

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Проще говоря, находимся в ветке MAIN_MENU нажали кнопку раз инкремент а a++, в MENU_MANUAL нажатие кнопки уже инкремент b,c 

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Возможно следует искать решение через указатели?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

BuonanotteMash, вопрос то о чем? 

ПС #250 и #251

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Видимо проще и не получится

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

BuonanotteMash,проще в каком смысле. Если у вас есть уже готовая рабочая схема, то можно адаптировать под нужное устройство. Так важнее не код который проще написать с нуля, а код который легче адаптировать под нужные реалии. PROGMEM и EEPROM уже набьют вам размер. А маленький размер ОЗУ не позволит сильно разгулятся в творчестве. Вывод написание меню это попытка усидется одной жопой на 12 стульях. Урежте стулья и проще код станет. Но тогда программа станет примитив.

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

qwone, управляющее меню делаю для практически готовой паяльной станции, меню простое на 4 пункта, усложнять не требуется. С классом кнопки вы мне тогда помогли, благодарен. Но хотелось бы сделать обработчики класса как  бы универсальными. К примеру кнопкой ">" можно было бы увеличивать значение в любом пункте меню не дублируя код, изменяя только требуемые переменные

ven-til
Offline
Зарегистрирован: 13.02.2018

А зачем в MENU_MANUAL инкремент двух переменных?

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Просто для примера. Смысл показать что происходит какое то действие. Считайте что там просто инкремнт b++

ven-til
Offline
Зарегистрирован: 13.02.2018

ну тогда int incremet_data[4];

incremet_data[current_menu_index]++;

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Тут вы объявили массив типа int incremet_data[4] видимо 4 равносильно количество пунктов меню. Но когда я сказал для примера я не имел ввиду что действия будут над одной переменной, тут скорее действия будут происходить над целым фрагментом кода. Массив я считаю тут не подойдет

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

BuonanotteMash, я бы предлжил бы создать класс дисплей с кучей viev обработчиков и банально переключаться. Но расписывать эту идею , не сильно хочу . ,будет треп на 10 постов.

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

я разобрался с вопросом , вот ссылка может кому пригодится http://www.c-cpp.ru/books/ukazateli-na-funkcii-0