Самая бесполезная вещь

Харон

✩✩✩✩✩✩✩
7 Авг 2018
11
0
Добрый день, друзья!
Как то раз увидел я на ютубе "Самая бесполезная вещь" и захотел её для дочери, но заодно и себя порадовать!
Сделал короб, всё смонтировал, и начал заливать скетч, который частично отработал на макетке, там все работала.
Сам скетч взят с простора сети, после адаптирован для себя. Проблема заключается в оптимизации работы оператора цикла for, если можно его заменить каким другим с удовольствием выслушаю.
С помощью этого оператора цикла (for) происходит сравнивание данных после чего открывается или закрывается крышка, либо высовывается и убирается рука.
Скетч прилагаю!
Помогите мыслью, за раннее спасибо!
C++:
#include <Servo.h>                    //библиотека сервопривода

#include <Bounce2.h>                  //библиотека устранения дребезга контактов

Servo Door;                           //сервопривод крышки

Servo Hand;                           //сервопривод руки

#define Tymbler 12                    //тумблер постоянно на 12 контакте

byte r;                               //вводим переменную r

byte pos;                             //вводим переменную pos

byte pos1door = 160;                  //установка минимального значения угла крышки

byte pos2door = 90;                   //установка максимального значения угла крышки

byte pos1hand = 0;                    //установка минимального значения угла руки

byte pos2hand = 180;                  //установка максимального значения угла руки

Bounce bouncer = Bounce();



void setup(){

  Door.write(pos1door);               //устанавливаем сервопривод крышки в начальное положение

  Hand.write(pos1hand);               //устанавливаем сервопривод руки в начальное положение

  pinMode(Tymbler, INPUT_PULLUP);     //12 вывод в режим ВХОДА с подтягивающим резистором

  bouncer.attach(Tymbler);            //настраиваем экземпляр класса тумблера

  bouncer.interval(5);                //обновление положения каждые 5 мс

  Door.attach(9);                     //назначаем сервоприводу крышки выход 9

  Hand.attach(10);                    //назначаем сервоприводу руки выход 10

}

void loop() {

  bouncer.update(); {                  //обновляем данные положения тумблера

  if (bouncer.read()==0){             //считываем данные, если значение 0 идем дальше

    r = random(0,11);                 //генерируем случайное число от 0 до 11

  if (r == 0) { move_0(); }           //вызов программы действия по случайному числу 0

//else if (r == 1) { move_1(); }     //пока не используем

//else if (r == 2) { move_2(); }     //пока не используем

//else if (r == 3) { move_3(); }     //пока не используем

//else if (r == 4) { move_4(); }     //пока не используем

//else if (r == 5) { move_5(); }     //пока не используем

  else if (r == 6) { move_0(); }      //вызов программы действия по случайному числу 6

//else if (r == 7) { move_1(); }     //пока не используем

//else if (r == 8) { move_4(); }     //пока не используем

//else if (r == 9) { move_3(); }     //пока не используем

  else if (r == 10) { move_0(); }     //вызов программы действия по случайному числу 10

  }

  }

}

void move_0(){ //простой вариант: открыли-выключили-закрыли

//открываем крышку

    for(pos = pos2door; pos <= pos1door; pos +=3)

    {                               

    Door.write(pos);           

    delay(15);                   

  

//высовываем руку

  for(pos = pos1hand; pos <= pos2hand; pos -=3)

  {                               

      Hand.write(pos);           

      delay(15);                   

  }

//убираем руку

  for(pos = pos1hand; pos <= pos2hand; pos +=3)   

  {                             

      Hand.write(pos);           

      delay(15);                     

  }

//закрываем крышку

  for(pos = pos1door; pos >= pos2door; pos -=3)

  {                           

      Door.write(pos);           

      delay(15);                   

  }

   }
 

Вложения

Последнее редактирование:

Харон

✩✩✩✩✩✩✩
7 Авг 2018
11
0
Добрый день коллеги! Собственно, как мне кажется решил проблему с работой цикла For - я его решил не использовать, т.к. мне кажется он здесь не уместен. Решил использовать для движения все самые простые функции.
При этом образовалась новая проблема которую я не могу победить.
Суть проблемы: Скетч отрабатывает как надо за исключением одного НО. Когда включаю тумблер данные обновляются и в процессе обработки появляется число R (рандомно от 0 до 10). Далее запускается процедура соответствующая числу R, процедура выполняется, и тут возникает проблема - после завершения процедуры (тумблер при этом уже выключен т.е. на 12 контакте нет 0)запускается выбор рандомного числа R. Т.Е. за одно включение тумблера программа отрабатывает два раза (чиста R при этом разные).
Помогите советом, либо делом как решить эту проблему?
C++:
#include <Servo.h>                    //библиотека сервопривода
#include <Bounce2.h>                  //библиотека устранения дребезга контактов
Servo Door;                           //сервопривод крышки
Servo Hand;                           //сервопривод руки
#define Tymbler 12                    //тумблер постоянно на 12 контакте
byte r;                               //вводим переменную r
byte pos;                             //вводим переменную pos
byte pos1door = 160;                  //установка минимального значения угла крышки
byte pos2door = 90;                   //установка максимального значения угла крышки
byte pos1hand = 0;                    //установка минимального значения угла руки
byte pos2hand = 180;                  //установка максимального значения угла руки
Bounce bouncer = Bounce();
 
void setup(){
  Door.write(pos1door);               //устанавливаем сервопривод крышки в начальное положение
  Hand.write(pos1hand);               //устанавливаем сервопривод руки в начальное положение
  pinMode(Tymbler, INPUT_PULLUP);     //12 вывод в режим ВХОДА с подтягивающим резистором
  bouncer.attach(Tymbler);            //настраиваем экземпляр класса тумблера
  bouncer.interval(500);              //обновление положения каждые 5 мс
  Door.attach(9);                     //назначаем сервоприводу крышки выход 9
  Hand.attach(10);                    //назначаем сервоприводу руки выход 10
  Serial.begin(9600);
}
void loop() {
 bouncer.update(); {                //обновляем данные положения тумблера
    if (bouncer.read()==0){         //считываем данные, если значение 0 мидем дальше
    r = random(0,11);               //генерируем случайное число от 0 до 10
    Serial.println(r);
  if (r == 0) { move_0(); }         //вызов программы действия по случайному числу 0
  else if (r == 1) { move_1(); }    //пока не используем
 //else if (r == 2) { move_2(); }   //пока не используем
 //else if (r == 3) { move_3(); }   //пока не используем
 //else if (r == 4) { move_4(); }   //пока не используем
 //else if (r == 5) { move_5(); }   //пока не используем
 else if (r == 6) { move_0(); }     //вызов программы действия по случайному числу 6
 else if (r == 7) { move_1(); }     //пока не используем
 //else if (r == 8) { move_4(); }   //пока не используем
 //else if (r == 9) { move_3(); }   //пока не используем
 else if (r == 10) { move_0(); }    //вызов программы действия по случайному числу 10
  }
  }
}
void move_0(){ //простой вариант: открыли-выключили-закрыли
//открываем крышку
      Door.write(pos2door);         //Открываем крышку на 90
      Serial.print("Открыто ");     //Контроль значения через порт
      Serial.println(pos2door);     //Контроль значения через порт       
      delay(2000);                  //Даём время на обдумывания
//высовываем руку
      Hand.write(pos2hand);         //Высовываем руку на 180(выключаем тумблер)
      Serial.print("Высунул ");     //Контроль значения через порт
      Serial.println(pos2hand);     //Контроль значения через порт
      delay(2000);                  //Даём время на движение руки
//убираем руку                               
      Hand.write(pos1hand);         //Убираем руку на 0
      Serial.print("Убрал ");       //Контроль значения через порт
      Serial.println(pos1hand);     //Контроль значения через порт
      delay(1500);                  //Даём время на то чтобы убрать руку
//закрываем крышку                             
      Door.write(pos1door);         //Закрываем крышку на 160
      Serial.print("Закрыл ");      //Контроль значения через порт
      Serial.println(pos1door);     //Контроль значения через порт
      delay(1500);                  //Даём время на закрытие крышки
   }
void move_1(){ //простой вариант: открыли-выключили-закрыли
//открываем крышку
      Door.write(pos2door);         //Открываем крышку на 90
      Serial.print("Открыто ");     //Контроль значения через порт
      Serial.println(pos2door);     //Контроль значения через порт       
      delay(2000);                  //Даём время на обдумывания
//высовываем руку
      Hand.write(90);               //Высовываем руку на 90
      Serial.println("Высунул 90");
      Hand.write(0);                //Убираем руку на 0
      Serial.println("Убрал на 0 ");
      Hand.write(pos2hand);         //Высовываем руку на 180(выключаем тумблер)
      Serial.print("Высунул ");     //Контроль значения через порт
      Serial.println(pos2hand);     //Контроль значения через порт
      delay(2000);                  //Даём время на движение руки
//убираем руку                               
      Hand.write(pos1hand);         //Убираем руку на 0
      Serial.print("Убрал ");       //Контроль значения через порт
      Serial.println(pos1hand);     //Контроль значения через порт
      delay(1500);                  //Даём время на то чтобы убрать руку
//закрываем крышку                             
      Door.write(pos1door);         //Закрываем крышку на 160
      Serial.print("Закрыл ");      //Контроль значения через порт
      Serial.println(pos1door);     //Контроль значения через порт
      delay(1500);
      Door.write(140);              //Приоткрываем крышку на 140
      Serial.println("Приоткрыл 140");
      delay(2000);                  //Ждём 2 секунды
      Door.write(pos1door);         //Закрываем крышку
      
      delay(1500);                  //Даём время на закрытие крышки
   }
 

KOHb

★✩✩✩✩✩✩
25 Окт 2018
119
10
@Харон, добавить булевый флаг меняющий своё состояние по времени срабатывания сервы.
Если я правильно понял алгоритм. Ты бы его нарисовал и показал что в итоге должно получиться.
 

Харон

✩✩✩✩✩✩✩
7 Авг 2018
11
0
@KOHb, спасибо за совет! но обошелся без флага, нашел ошибку в коде исправил и все заработало! и всё таки вернулся к For )))
 

dekort

✩✩✩✩✩✩✩
18 Дек 2018
11
0
по поводу сервы попробуй библиотеку VarSpeedServo